Delegación de scripts de PowerShell con Just Enough Administration (JEA)

Contenidos

Logotipo de Powershell

¿Alguna vez quiso delegar una tarea, pero descubrió que los permisos necesarios pueden ser demasiado arriesgados para entregarlos? ¿O ha querido bloquear cosas como la creación de grupos en AD para hacer cumplir las convenciones de nomenclatura de los grupos?

JEA puede ayudarlo con eso y mucho más. En este post, veremos cómo puede delegar sus scripts ya creados con PowerShell 5.1.

¿Qué es JEA?

JEA es una solución PowerShell de Microsoft que puede restringir a los usuarios (y administradores) para que solo puedan realizar tareas específicas en una sesión específica de PowerShell, inclusive si requieren un administrador local en dicho recurso. Al mismo tiempo, puede ser extremadamente específico. Solo se pueden ejecutar los comandos que especifique, puede habilitar solo valores de parámetros específicos y valores de parámetros que coincidan con un patrón específico.

A modo de ejemplo, puede habilitar Servicedesk para que solo reinicie un servicio específico con Restart-Service, o solo agregue grupos a AD de acuerdo con una convención de nomenclatura específica. Puede hacer todo esto sin darles permisos explícitos en un servidor o en AD. Es una herramienta que puede ahorrarle una enorme cantidad de tiempo y proteger su entorno. Comencemos envolviendo nuestro script en una función.

Paso 1: creación de una función a partir de su secuencia de comandos

El primer paso, si aún no lo ha hecho, es crear una función a partir de su secuencia de comandos. Esto es bastante sencillo, asumiendo que ya tiene su parameters configurar. A continuación, he envuelto mi sencillo guión «New-FolderAndShare» en una función:

Function New-FolderAndShare {
    [cmdletbinding()]
    param(
        # Name of the share
        [parameter(Mandatory)]
        [ValidatePattern("^(Project d{5}|Team (Finance|HR|IT|Multi) [a-z ]+)$")]
        [string]$ShareName,

        # Directory of the new share folder locally
        [parameter(Mandatory)]
        [ValidatePattern("^(D|E|F):Shares$")]
        [string]$Path,

        # Who to have full access
        [parameter(Mandatory)]
        [ValidateSet("^CONTOSO")]
        [string]$FullAccess

    )

        $FullPath = Join-Path $Path $ShareName
    New-Item -ItemType Directory -Path $FullPath
    New-SmbShare -Path $FullPath -Name $ShareName -FullAccess $FullAccess

}

Valida los parámetros con ValidatePattern en la función, pero si esto fuera parte de un módulo, podría hacerlo en el archivo RoleCapabilities en su lugar con Funciones visibles.

Hacer del script una función nos da un mayor control de los parámetros permitidos en JEA y facilita la exportación.

Paso 2: creación de capacidades de rol

El archivo RoleCapabilities decide qué se le posibilita hacer a un rol específico (definido en el siguiente paso). Esto incluye qué comandos pueden ejecutar, qué parámetros pueden utilizar y qué módulos importar.

Aunque RoleCapabilities se puede crear manualmente, se recomienda usar la New-PSRoleCapabilityFile comando integrado en PowerShell 5.1. Además está en este archivo que cargará en la función que creamos en el paso anterior.

El siguiente script crea un archivo llamado FileShareCreator.psrc y agrega el New-FolderAndShare función (que debe cargarse en la sesión actual):

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

$RoleCapabilitiesParam = @{
    # Establece a function that will be available in the cmdlet
    FunctionDefinitions = @{ 
        Name="New-FolderAndShare"
                # Import the code of the function
        ScriptBlock =  [ScriptBlock]::Create(
            (Get-Command New-FolderAndShare).Definition
        )
    }

    # Modules used in the function needs to be explicity imported
    ModulesToImport = @(
        "SmbShare",
        "Microsoft.PowerShell.Management"
    )
    Path = ".FileShareCreator.psrc"
}

New-PSRoleCapabilityFile @RoleCapabilitiesParam

Usar Get-Command para buscar la función en el FunctionDefinitions-parámetro. Además puede agregar el script sin formato con parámetros.

Además especifica cómo se le posibilita usar la función en el VisibleCmdlet parámetro. Para esto, especifique el nombre de la función y sus parámetros junto con una expresión regular.

Con esto, puede crear un control extremadamente granular de lo que un usuario puede y no puede hacer. Pero hay una advertencia para hacer que esto funcione: debe agregar el archivo psrc en un módulo.

Paso 3: creación de un módulo para el archivo RoleCapability

Es hora de crear un módulo en el que pueda poner sus capacidades de rol. JEA encuentra las capacidades de rol por el nombre de los archivos psrc sin su extensión, por lo tanto evite los duplicados si va a crear más capacidades de rol más adelante.

El siguiente script es una versión modificada de lo que encuentra en el Documentación oficial de JEA. Crea un nuevo módulo en el directorio del módulo, crea los archivos y carpetas necesarios y copia el psrc archivo que creó en el paso 2 en él:

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

# Create a folder for the module
$modulePath = Join-Path $env:ProgramFiles "WindowsPowerShellModulesFileShareJEA"
New-Item -ItemType Directory -Path $modulePath

# Create an empty script module and module manifest.
# At least one file in the module folder must have the same name as the folder itself.
New-Item -ItemType File -Path (Join-Path $modulePath "FileShareJEA.psm1")
New-ModuleManifest -Path (Join-Path $modulePath "FileShareJEA.psd1") -RootModule "FileShareJEA.psm1"

# Create the RoleCapabilities folder and copy in the PSRC file
$rcFolder = Join-Path $modulePath "RoleCapabilities"
New-Item -ItemType Directory $rcFolder
Copy-Item -Path .FileShareCreator.psrc -Destination $rcFolder

Ahora ha creado una capacidad de rol y una función para poder usarla en JEA. Lo que queda por realizar ahora es crear una configuración de sesión de PowerShell para adjudicar grupos de AD a los roles que acaba de crear.

Paso 4: Definición de roles

En este paso, creará un archivo de configuración de sesión de PowerShell que establece a qué roles se les asignará qué capacidades (desde el.psrc archivo que creamos en el paso 2).

Aquí además creará el grupo de AD y el directorio de transcripciones.

# Create directory to store logs
New-Item -ItemType Directory -Path 'C:ProgramDataJEAConfigurationTranscripts' -Force

# Create AD group (you might need to do it on another server)
New-ADGroup -Path "OU=Groups,DC=contoso,DC=com" -Name 'JEA_FILESHARE_CREATOR' -GroupScope DomainLocal

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

# Establece parameters for New-PSSessionConfigurationFile
$PSSessionConfigurationParams = @{
    # Run as a temporary account
    RunAsVirtualAccount = $True

    # That is a local administrator
    RunAsVirtualAccountGroups = @(
        "administrators"
    )

    # Path where to save log files of what connected users are doing
    TranscriptDirectory = 'C:ProgramDataJEAConfigurationTranscripts'

    # Map an active directory group to the capability we created
    RoleDefinitions = @{
        'CONTOSOJEA_FILESHARE_CREATOR' = @{
            RoleCapabilities="FileShareCreator"
        }
    }
        
        # Path of the PSSC file
    Path = ".SessionConfiguration.pssc"

}
# Create the PSSC file
New-PSSessionConfigurationFile @PSSessionConfigurationParams

Paso 5: crear una sesión de PowerShell

En este paso, leerá en el SessionConfiguration.pssc archivo que creó en el paso anterior. Esto posibilita a los miembros de JEA_FILESHARE_CREATOR para conectarse a través de PowerShell al servidor:

PS51> Register-PSSessionConfiguration -Path .SessionConfiguration.pssc -Name 'JEAFileShare' -Force

PSPath            : Microsoft.WSMan.ManagementWSMan::localhostPluginJEAFileShare
PSParentPath      : Microsoft.WSMan.ManagementWSMan::localhostPlugin
PSChildName       : JEAFileShare
PSDrive           : WSMan
PSProvider        : Microsoft.WSMan.ManagementWSMan
PSIsContainer     : True
Keys              : {Name=JEAFileShare}
Name              : JEAFileShare
TypeNameOfElement : Container
Type              : Container

¡Listo! Agregar un usuario a JEA_FILESHARE_CREATOR que no tiene acceso al servidor por medios normales y pruébalo como ese usuario escribiendo:

PS51> Enter-PSSession -ComputerName fs02.contoso.com -ConfigurationName JEAFileShare
PS51> New-FolderAndShare -ShareName "Project 12345" -Path D:Share

Ahora puede ejecutar el comando como administrador local temporal que está bloqueado y solo habilitado para ejecutar algunos comandos predeterminados (visibles con Get-Command durante la sesión) y el New-FolderAndShare función que se agregó en el archivo de funciones de funciones.

Si desea ver la cuenta que se creó temporalmente, agregue VisibleExternalCommands @('c:windowssystem32whoami.exe') a sus parámetros de RoleCapabilities en el Paso 2. Puede ejecutar whoami y ver el nombre del administrador local:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

Resumen

El uso de JEA puede ser una manera increíble y fácil de delegar tareas y proteger su entorno. Esto no solo incluye sus propios scripts, sino además los módulos integrados y los módulos instalados. Aún cuando JEA puede ser un gran valor agregado, ¡tenga cuidado! Puede crear un gran riesgo para su entorno si delega los comandos incorrectos o especifica los parámetros incorrectos a personas inesperadas.

¿Querer aprender más?

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.