Limitare i privilegi amministrativi utilizzando la Just Enough Administration (JEA)

La Just Enough Administration (JEA) è una delle novità di sicurezza del Windows Management Framework 5.0 che permette di limitare le sessioni amministrative solo ad un particolare set di comandi e aumenta di fatto la sicurezza nella gestione dei nostri sistemi.

Questo tipo di funzionalità, basata sull’amministrazione PowerShell remota (Windows PowerShell Remoting), permette di configurare degli endpoint in modo tale che quando un utente si connette per eseguire delle cmdlet di PowerShell remote, gli venga concesso l’utilizzo di solo alcuni script e di alcuni comandi. Ad esempio, potreste limitare per un utente la possibilità di amministrare il DNS e di eseguire solo alcune delle cmdlet relative alla sua gestione. Se il ruolo DNS è installato sul controller di dominio Active Directory (come di regola avviene), gli amministratori DNS richiedono privilegi di amministratore locale per risolvere problemi con il server DNS, e per fare ciò è necessario che siano membri del gruppo di sicurezza con privilegi elevati “Domain Admins”.

JEA permette di evitare l’uso di account privilegiati. L’utente si connette all’endpoint remoto JEA utilizzando uno speciale virtual account privilegiato invece che il proprio account utente. I vantaggi di questo tipo di approccio sono molteplici:

  • Le credenziali dell’utente non verranno memorizzate nel sistema remoto e nel caso questo venga compromesso non sarà possibile rubare le credenziali
  • L’utente che utilizzate per l’amministrazione remota non dovrà essere privilegiato e potrà essere un normale utente di dominio
  • Il virtual account è valido solo nell’host dove si trova e non può essere riutilizzato per connettersi ad altri sistemi remoti
  • Il virtual account ha privilegi amministrativi sull’host, ma limitati alle attività che saranno stabilite per la JEA

La funzionalità di Just Enough Administration (JEA) è disponibile di default in:

  • Windows Server 2016
  • Windows 10, version 1511 or later

Ma funziona anche se avete installato Windows Management Framework 5.0 in:

  • Windows Server 2012 R2
  • Windows Server 2012
  • Windows Server 2008 R2
  • Windows 8.1
  • Windows 8
  • Windows 7

In realtà Windows Server 2008 R2 ed Windows 7 non supportano i virtual accounts JEA e tutte le attività vengono eseguite dall’utente che si connette al JEA Endpoint.

Configurare JEA non è semplicissimo, perché bisogna sapere esattamente quali sono le attività che verranno svolte e quali sono i comandi che dovranno essere eseguiti. In ogni caso se avete attività da svolgere spesso o script da eseguire, JEA è un ottimo modo per ridurre la superficie di attacco ed implementare RBAC (Role Based Access Control). Un altro limite evidente è sicuramente quello che JEA funziona SOLO con PowerShell.

Per mostrarvi come funziona JEA, darò la possibilità ad un semplice utente di dominio di effettuare alcune operazioni sul server DNS (nel mio caso il domain controller DC1). Ho creato un utente di dominio e l’ho aggiunto ad un gruppo chiamato DNSOps.Il gruppo DNSOps è anch’esso un gruppo che non ha privilegi amministrativi.

Figura 1: Creazione dell’utente limitato ed aggiunta al gruppo DNSOps

Creazione del Role-Capability file

Il Role-Capability file permette di specificare cosa potrà essere fatto nelle sessioni remote di PowerShell. È possibile creare un nuovo file, che avrà estensione .psrc, e aggiungere le cmdlet, le funzioni e tutti i comandi necessari. Per avere una lista completa dei parametri utilizzabili e delle diverse parti del file .psrc vi rimando alla lettura dell’articolo https://docs.microsoft.com/en-us/powershell/jea/role-capabilities e dell’articolo https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-psrolecapabilityfile?view=powershell-5.1

Per creare un nuovo Role-Capability File è sufficiente eseguire sul domain controller o sul server DNS (nel mio caso si chiama DC1) PowerShell ISE, con privilegi elevati, e lanciare le seguenti cmdlet di PowerShell:

Cd ‘c:\Program Files\WindowsPowerShell\Modules’
Mkdir DNSOps
Cd DNSOps
New-ModuleManifest .\DNSOps.psd1
Mkdir RoleCapabilities
Cd RoleCapabilities
New-PSRoleCapabilityFile -Path .\DNSOps.psrc
Ise DNSOps.psrc

In questo modo verrà creato un nuovo file chiamato DNSOps.psrc che utilizzeremo per poter gestire il DNS.

Figura 2: Creazione di un Role-capability file DNSOps.psrc

Configurazione del Role-Capability file

Dopo aver creato il Role-Capability file DNSOps.psrc, è necessario configurarlo per i nostri scopi. Se avete eseguito la cmdlet Ise DNSOps.psrc nel passaggio precedente potrete già modificare il file. Come prima operazione consentiamo di riavviare solo il servizio DNS. Posizionatevi quindi sotto la riga che inizia per # VisibleCmdlets = e digitate:

VisibleCmdlets = @{ Name 'Restart-Service'; Parameters = @{ Name='Name'; ValidateSet = 'DNS'}}

Per consentire l’utilizzo di solo alcune cmdlet riferite alla gestione del DNS posizionatevi sotto la riga che inizia per # VisibleFunctions = e digitate:

VisibleFunctions = 'Add-DNSServerResourceRecord', 'Clear-DNSServerCache', 'GetDNSServerCache', 'Get-DNSServerResourceRecord' , 'Remove-DNSServerResourceRecord'

Per consentire l’utilizzo di solo alcuni eseguibili (nel mio caso whoami.exe) posizionatevi sotto la riga che inizia per # VisibleExternalCommands = e digitate:

VisibleExternalCommands = 'C:\Windows\System32\whoami.exe'

Salvate il file DNSOps.psrc. Il risultato è quello mostrato nella figura sotto:

Figura 3: Modifica del Role-capabilty file DNSOps.psrc

Creazione del Session-configuration file

Il Session-configuration file serve a definire cosa può essere fatto in una sessione JEA. Se una cmdlet, un parametro, il valore di un determinato parametro, un alias, uno script esterno o un eseguibile non sono presenti nel session-configuration file, allora non potranno essere utilizzati in una sessione JEA configurata per utilizzare quel session-configuration file.

Per creare un nuovo file, che avrà l’estensione .pssc, è sufficiente utilizzare la cmdlet New-PSSessionConfigurationFile. Per avere una lista completa dei parametri utilizzabili e delle diverse parti del file .pssc vi rimando alla lettura dell’articolo https://docs.microsoft.com/en-us/powershell/jea/session-configurations e dell’articolo https://docs.microsoft.com/it-it/powershell/module/Microsoft.PowerShell.Core/New-PSSessionConfigurationFile?view=powershell-5.1

Creiamo un nuovo file eseguendo sul nostro server DNS (nel mio caso si chiama DC1) da PowerShell ISE con privilegi elevati le seguenti cmdlet:

Cd ‘c:\Program Files\WindowsPowerShell\Modules\DNSOps’
New-PSSessionConfigurationFile -Path .\DNSOps.pssc -Full
Ise DNSOps.pssc

Dopo aver creato il file è possibile modificarlo. Da PowerShell ISE, nella scheda DNSOps.pssc, modificate il valore SessionType ‘Default in

SessionType = 'RestrictedRemoteServer'

Navigate fino alla linea #RunAsVirtualAccount = $true e rimuovete il comment # in modo tale che ci sia solo

RunAsVirtualAccount = $true

Spostatevi quindi alla linea che comincia con #RoleDefinitions e subito sotto scrivete il nome del gruppo di AD che volete usare per la gestione (nel mio caso DEMO\DNSOps):

RoleDefinitions = @{ 'DEMO\DNSOps' = @{ RoleCapabilities 'DNSOps' };}

Salvate il file DNSOps.pssc. Il risultato è quello mostrato nella figura sotto:

Figura 4: Modifica del session-configuration file DNSOps.pssc

Creazione del JEA Endpoint

Un JEA Endpoint è un endpoint PowerShell che è configurato in modo tale che solo alcuni utenti possano connettersi e abbiano accesso alle cmdlet, ai parametri e ai valori definiti dal session-configuration file. Un server può avere diversi JEA Endpoint ed ognuno di loro può essere utilizzato per diversi scopi amministrativi. Una volta che un utente si collega al JEA Endpoint avrà i privilegi assegnati al virtual account che è stato definito nel session-configuration file. Per approfondimenti sui JEA Endpoint vi rimando all’articolo https://docs.microsoft.com/en-us/powershell/jea/register-jea

Per creare un JEA Endpoint è possibile utilizzare la cmdlet Register-PSSessionConfiguration. Sul vostro server DNS da PowerShell ISE lanciate le seguenti cmdlet:

Register-PSSessionConfiguration -Name DNSOps -Path .\DNSOps.pssc
Restart-Service WinRM
Get-PSSessionConfiguration

Il risultato è quello mostrato in figura:

Figura 5: Creazione del JEA Endpoint

Verificate che DNSOps sia elencato tra gli Endpoint disponibili.

Se avete sbagliato a configurare un Endpoint potete sempre eliminarlo utilizzando la cmdlet Unregister-PSSessionConfiguration

Creazione di una sessione amministrativa

Per verificare che tutto funzioni correttamente utilizzerò una macchina remota per effettuare l’amministrazione. Da una macchina del dominio che voglio usare come postazione di amministrazione, dopo essermi loggato come Domain Admin (demo\administrator), mi collego con una sessione PowerShell remota a DC1 e verifico quali sono i permessi che ho a disposizione usando le seguenti cmdlet:

Enter-PSSession -ComputerName DC1
(Get-Command).count
Whoami.exe

Come si può notare dalla figura sotto, ho la possibilità come domain admin di usare 2006 cmdlet diverse:

Figura 6: Sessione remota PowerShell con privilegi da domain admin

Creazione di una sessione di Just Enough Administration (JEA)

Dalla stessa macchina di dominio che voglio utilizzare come postazione di amministrazione mi loggo questa volta come domain user (demo\nicferr) che fa parte del gruppo DEMO\DNSOps (che ho autorizzato nel Session-configuration file) e mi collego con una sessione PowerShell remota a DC1. Se lanciassi la cmdlet Enter-PSSession -ComputerName DC1 riceverei un messaggio di errore perché essendo un domain user non ho privilegi amministrativi su DC1. Ma se lancio Enter-PSSession -ComputerName DC1 -ConfigurationName DNSOps (dichiarando quindi di voler utilizzare una configurazione JEA) riesco a connettermi. Verifico quali sono i permessi che ho a disposizione usando le seguenti cmdlet:

Enter-PSSession -ComputerName DC1 -ConfigurationName DNSOps
(Get-Command).count
Whoami.exe

Figura 7: Connessione alla macchina DC! utilizzando la configurazione JEA

Come si può vedere dalla figura 7, il comando Whoami.exe non restituisce il logon name dell’utente (demo\nicferr) bensì quello del virtual account utilizzato da JEA (winrm virtual users\winrm va_1_demo_nicferr).

Provo quindi ad eseguire alcuni comandi per la gestione del DNS (ovviamente saranno concesse solo le cmdlet che ho definito nel role-capability file):

Get-DNSServerResourceRecord -zonename demo.lab
Add-DNSServerResourceRecord -zonename ‘demo.lab’ -A -Name ‘SVR1’ -IPv4Address ‘10.0.0.101’
Add-DNSServerResourceRecord -zonename ‘demo.lab’ -A -Name ‘SVR2’ -IPv4Address ‘10.0.0.102’
Remove-DNSServerResourceRecord -zonename ‘demo.lab’ -RRTYPE ‘A’ -Name ‘SVR2’ -Confirm

I risultati sono mostrati in figura:

Figura 8: Esecuzione dei comandi abilitati nel role-capability file

Provo anche a riavviare il servizio DNS utilizzando la cmdlet Restart-Service DNS ed in effetti il servizio viene riavviato. Se invece provo a riavviare un altro servizio non consentito nel role-capability file (ad esempio utilizzando la cmdlet Restart-Service WinRM) ricevo un messaggio di errore, come mostrato in figura:

Figura 9: Errore dovuto all’esecuzione di un comando non contenuto nel role-capability file

Distribuzione della configurazione JEA ad un altro computer

Una volta che avete validato la vostra configurazione JEA, sarà possibile distribuirla su tutti i computer che volete amministrare. Per poter riutilizzare la configurazione JEA che avete creato su vostro server DNS (nel mio caso DC1), potete copiare tutto il contenuto della cartella C:\Program Files\WindowsPowerShell\Modules\DNSOps del vostro server e incollarla nel nuovo server da gestire nello percorso C:\Program Files\WindowsPowerShell\Modules. Successivamente potete creare il nuovo JEA Endpoint utilizzando i comandi PowerShell:

Cd ‘c:\Program Files\WindowsPowerShell\Modules\DNSOps\RoleCapabilities’
Register-PSSessionConfiguration -Name DNSOps -Path .\DNSOps.pssc
Restart-Service WinRM

Figura 10: Copia della configurazione JEA sul nuovo server da gestire

Verificate con la cmdlet Get-PSSessionConfiguration che DNSOps sia disponibile come Endpoint.

Figura 11: Creazione del JEA Endpoint sul nuovo server da gestire

Conclusioni

La Just Enough Administration (JEA) consente di migliorare le condizioni di sicurezza, riducendo di fatto il numero di amministratori nei computer. Ciò avviene tramite la creazione per gli utenti di un Endpoint per eseguire attività amministrative in maniera limitata, per prevenire usi impropri. Poiché JEA consente di eseguire i comandi di amministratore senza avere accesso come amministratore, è possibile rimuovere gli utenti dai gruppi di sicurezza con privilegi elevati e renderli quindi utenti standard, adottando il principio di privilegio minimo.