Just Enough Administration

Just Enough Administration (JEA) proporciona una plataforma Role Based Access Control (RBAC) a través de PowerShell. Permite a usuarios concretos realizar tareas administrativas específicas en los servidores sin darles derechos de administrador. Esto permite llenar los vacíos entre soluciones de RBAC existentes, y simplifica la administración a la hora de delegar permisos.

Requisitos

Si bien Just Enough Administration es parte de PowerShell, es neecsario cumplir con ciertos requerimientos que voy a pasar a detallar:

Infraestructura

Para poder hacer uso de JEA, es necesario contar con lo siguiente:

  • Una instancia de Windows Server 2016 TP4 o Windows Server 2012 R2 con WMF 5.0 RTM
  • Tener permisos de administrador sobre el servidor anterior
  • El servidor debe estar unido a un dominio

A su vez es necesario tener habilitado PowerShell Remoting; para cumplir con lo anterior debemos ejecutar simplemente:

Enable-PSRemoting

Just Enough Administration

Difinimos la capacidad del rol

Con el siguiente bloque de código vamos a crear el archivo que va a usarse para limitar el scope de comandos al que puede acceder el rol definido, así como también se define un Cmdlet custom (Get-UserInfo):

$powerShellPath = "$env:SystemRoot\System32\WindowsPowerShell\v1.0" 

# Campos en el archivo
$MaintenanceRoleCapabilityCreationParams = @{
    Author =
        "Victor Silva"
    ModulesToImport=
        "Microsoft.PowerShell.Core"
    VisibleCmdlets=
        "Restart-Service"
    CompanyName=
        "vmsilvamolina"
    FunctionDefinitions = @{ Name = 'Get-UserInfo'; ScriptBlock = {$PSSenderInfo}}
        }

# Creamos el modulo demo, que va a contener el archivo Role Capability
New-Item -Path "$env:ProgramFiles\WindowsPowerShell\Modules\Demo_Module" -ItemType Directory
New-ModuleManifest -Path "$env:ProgramFiles\WindowsPowerShell\Modules\Demo_Module\Demo_Module.psd1"
New-Item -Path “$env:ProgramFiles\WindowsPowerShell\Modules\Demo_Module\RoleCapabilities” -ItemType Directory 

# Creamos el archivo Role Capability
New-PSRoleCapabilityFile -Path "$env:ProgramFiles\WindowsPowerShell\Modules\Demo_Module\RoleCapabilities\Maintenance.psrc" @MaintenanceRoleCapabilityCreationParams

Configuración para el ejemplo

Vamos a definir la configuración de la sesión para que cuando inicie el usuario en cuestión (en el ejemplo se llama Usuario) ya tenga el rol configurado y solo le permita acceder a los Cmdlet que definimos en el archivo Maintenance.psrc. Con el siguiente bloque de código integramos la configuración permitida al usuario con el usuario de dominio:

$domain = (Get-CimInstance -ClassName Win32_ComputerSystem).Domain

#Reemplazar con el grupo o usuario a usar en el ejemplo
$NonAdministrator = "$domain\Usuario"

$JEAConfigParams = @{
        SessionType= "RestrictedRemoteServer" 
        RunAsVirtualAccount = $true
        RoleDefinitions = @{ $NonAdministrator = @{RoleCapabilities = 'Maintenance'}}
        TranscriptDirectory = "$env:ProgramData\JEAConfiguration\Transcripts”
        }     
if(-not (Test-Path "$env:ProgramData\JEAConfiguration")) {
    New-Item -Path "$env:ProgramData\JEAConfiguration” -ItemType Directory
}
$sessionName = "JEA_Demo"
if(Get-PSSessionConfiguration -Name $sessionName -ErrorAction SilentlyContinue) {
    Unregister-PSSessionConfiguration -Name $sessionName -ErrorAction Stop
}
New-PSSessionConfigurationFile -Path "$env:ProgramData\JEAConfiguration\JEADemo.pssc" @JEAConfigParams

Register-PSSessionConfiguration -Name $sessionName -Path "$env:ProgramData\JEAConfiguration\JEADemo.pssc"
Restart-Service WinRM

Creando la configuración de JEA

Usando JEA con un usuario que no es administrador

Para demostrar JEA en acción, vamos a necesitar usar PowerShell remoto como un usuario “no-administrador”. Para realizar esta acción hay que definir un usuario con el siguiente código:

$NonAdminCred = Get-Credential

Ingresar las credenciales de la cuenta sin permisos de administrador cuando lo solicite. Luego, ingresar a una sesión remota usando el archivo de configuración creado y las credenciales guardadas:

Enter-PSSession -ComputerName . -ConfigurationName JEA_Demo -Credential $NonAdminCred

Si prestan atención, el prompt cambió ya que nos encontramos dentro de la sesión con el usuario “no-administrador”. Ahora, vamos a ejecutar el Cmdlet:

Get-Command

Sesión iniciada y Get-Command

El Cmdlet anterio muestra la lista de todos los comandos disponibles para ejecutar en la sesión. Para los que conocen este Cmdlet, en ocasiones normales, la lista es muy superior a la que nos muestra en este escenario, debido a las restricciones ya aplicadas al usuario que estamos usando.

En este punto, vamos a ejecutar un comando:

Get-UserInfo

Get-UserInfo

Este Cmdlet custom, muestra el “ConnectedUser” como si fuera “RunAsUser”. El ConnectedUser es la cuenta de dominio connectada a la sesión remota que no tiene privilegios. La cuenta “Run As” es la que realiza las acciones con privilegios. Ahora usando los permisos concedidos en la sesión vamos a ejecutar el Cmdlet Restart-Service:

Restart-Service -Name Spooler -Verbose

Ya que este comando es uno de los que aparece en la lista de configuración. Normalmente, este Cmdlet requiere privilegios de administrador para ejecutarse.

Como último paso vamos a ejecutar un comando que no aparece en la lista (cuando ejecutamos el Get-Command), por ejemplo:

Restart-Computer

Restricción de JEA

JEA restringe los comandos que necesitan privilegios y que no son declarados dentro de la configuración aplicada. Por eso nos genera el error al intentar ejecutar el comando Restart-Computer.

Para cerrar la sesión del usuario vamos a ejecutar:

Exit-PSSession

Y listo! Así vimos un ejemplo de como usar JEA para proporcionar acceso basado en roles.

Saludos,

Comments