¿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.