PowerShell JEA (Just Enough Administration) è una funzionalità di sicurezza integrata in WinRM che permette di delegare l’utilizzo di comandi amministativi ad utenti senza privilegi elevati.
In questo articolo JEA verrà utilizzato per consentire agli utenti non amministatori di poter avviare, spegnere ed accedere alla console di una macchina virtuale su Hyper-V senza il bisogno di inserire gli utenti nel gruppo Hyper-V Administrators.
PREREQUISTI
Per il funzionamento di JEA è richiesto che WinRM (PowerShell Remote) sia abilitato.
Per abilitare WinRM è possibile eseguire il seguente comando in una PS amministrativa:
0 |
Enable-PSRemoting -Force
|
In seguito è necessario creare la directory in cui verranno salvati i profili JEA:
0 |
New-Item -Type Directory -Path "C:\Program Files\WindowsPowerShell\Modules\JEARole\RoleCapabilities\"
|
È consigliabile inserire tutti gli script e gli eseguibili nella stessa directory, per crearla eseguire:
0 |
New-Item -Type Directory -Path "C:\HyperVHardening\
|
Per vietare agli utenti non amministratori di modificare la directory è necessario modificare le ACL, per farlo è possibile eseguire i seguenti comandi:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# Get current ACL
$acl = Get-Acl -Path "C:\HyperVHardening\"
# Disable inheritance
$acl.SetAccessRuleProtection($true, $false)
# Create the ACL rules
$fullControl = [System.Security.AccessControl.FileSystemRights]::FullControl
$readExecute = [System.Security.AccessControl.FileSystemRights]::ReadAndExecute
$ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM", $fullControl, "Allow")
$ruleAdministrators = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators", $fullControl, "Allow")
$ruleAuthenticatedUsers = New-Object System.Security.AccessControl.FileSystemAccessRule("Authenticated Users", $readExecute, "Allow")
$ruleUsers = New-Object System.Security.AccessControl.FileSystemAccessRule("Users", $readExecute, "Allow")
# Add the rules to ACL
$acl.AddAccessRule($ruleSystem)
$acl.AddAccessRule($ruleAdministrators)
$acl.AddAccessRule($ruleAuthenticatedUsers)
$acl.AddAccessRule($ruleUsers)
# Apply the modified ACL to the folder
Set-Acl -Path "C:\HyperVHardening\" -AclObject $acl
|
DOWNLOAD PSEXEC
Poiché JEA non prevede l’avvio di software con interfaccia grafica, per eseguire la console della VM nella sessione grafica dell’utente è necessario avvalersi di PsExec64.
PsExec64 è un eseguibile appartenente alla suite Sysinternals di cui è possibile effettuare il download dal seguente URL Downlaod PsExec64
Dopo aver decompresso il file ZIP, è necessario localizzare il file PsExec64.exe e copiarlo nella directory C:\HyperVHardening\.
Se tutti gli step sono stati eseguiti correttamente, quando si copia il file nella directory compare la UAC in cui bisogna inserire delle credenziali amministative.
Se non venisse mostrata la UAC è necessario verificare le ACL della directory e dei files.
CONFIGURAZIONE DEL PROFILO JEA
La configurazione del profilo JEA è salvata su due files ed in caso di modifiche è sufficiente effettuare nuovamente la registrazione per applicarle.
Il primo file ha estensione .psrc e viene utilizzatio per configurare quali comandi sono accessibili nella sessione JEA.
Per crearlo è necessario eseguire il seguente comando
NOTA BENE: sostituire VMControl con il nome del profilo desiderato
0 |
New-PSRoleCapabilityFile -Path "C:\Program Files\WindowsPowerShell\Modules\JEARole\RoleCapabilities\VMControl.psrc"
|
In seguito, aprire il file con notepad:
0 |
notepad "C:\Program Files\WindowsPowerShell\Modules\JEARole\RoleCapabilities\VMControl.psrc"
|
Incollare il seguente contenuto (sostituire VM_NAME con il nome della VM):
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
@{
# ID usato per identificare in modo univoco questo documento
GUID = '92638973-bc08-4f5b-bc2b-8908b94c8493'
# Autore di questo documento
Author = 'Marco Valle'
# Descrizione delle funzionalità offerte da queste impostazioni
Description = 'Allow power on, power off and console access'
# Company associated with this document
CompanyName = 'RaffaeleChiatto.com'
# Informazioni sul copyright per questo documento
Copyright = '(c) 2024 Raffaele Chiatto. Royalty-free.'
# Modules to load in the JEA sessions
ModulesToImport = @('Hyper-V')
# Required to run executables on filesystem
VisibleProviders = 'FileSystem'
# List of Cmdlet available in the JEA session
VisibleCmdlets = @(
@{
Name = 'Start-VM';
Parameters = @{ Name = 'Name'; ValidateSet = 'VM_NAME' }
},
@{
Name = 'Stop-VM';
Parameters = @{ Name = 'Name'; ValidateSet = 'VM_NAME' }
},
@{
Name = 'Start-Process';
Parameters = @(
@{
Name = 'FilePath';
ValidateSet = @('C:\HyperVHardening\PsExec64.exe')
},
@{
Name = 'ArgumentList';
ValidatePattern = '^-accepteula$|^-si$|^[1-9]+\d*$|^C:\\WINDOWS\\system32\\vmconnect\.exe$|^localhost$|^VM_NAME$'
}
)
}
)
}
|
Il secondo file ha estensione .pssc e viene utilizzato per configurare i privilegi con cui eseguire la sessione e chi può accedervi.
Per crearlo è necessario eseguire il seguente comando
NOTA BENE: sostituire VMControl con il nome del profilo desiderato
0 |
New-PSSessionConfigurationFile -Path "C:\Program Files\WindowsPowerShell\Modules\JEARole\VMControl.pssc"
|
In seguito, aprire il file con notepad:
0 |
notepad "C:\Program Files\WindowsPowerShell\Modules\JEARole\VMControl.pssc"
|
Incollare il seguente contenuto:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@{
# Numero di versione dello schema usato per questo documento
SchemaVersion = '2.0.0.0'
# ID usato per identificare in modo univoco questo documento
GUID = '4d41dc5c-4233-4553-b131-98c7cd38ec61'
# Autore di questo documento
Author = 'Marco Valle'
# Descrizione delle funzionalità offerte da queste impostazioni
Description = 'Allow any authenticated user to enter in PS session with VMControl role capabilities'
# Valori predefiniti del tipo di sessione da applicare per questa configurazione di sessione. Può essere 'RestrictedRemoteServer' (scelta consigliata), 'Empty' o 'Default'
SessionType = 'RestrictedRemoteServer'
# Directory in cui inserire le trascrizioni della sessione per questa configurazione di sessione
TranscriptDirectory = 'C:\JEA\Transcripts'
# Indica se eseguire questa configurazione di sessione con l'account amministratore (virtuale) del computer
RunAsVirtualAccount = $true
# Ruoli utente (gruppi di sicurezza) e funzionalità di ruolo che devono essere applicate loro per una sessione
RoleDefinitions = @{
'NT AUTHORITY\Authenticated Users' = @{
'RoleCapabilities' = 'VMControl'
}
}
}
|
Infine, è necessario registrare i profili (questo step è essenziale anche per applicare eventuali future modifiche):
0 |
Register-PSSessionConfiguration -Name "VMControlSession" -Path "C:\Program Files\WindowsPowerShell\Modules\JEARole\VMControl.pssc" -Force
|
TESTING DI UN PROFILO JEA
Per verificare il funzionamento del profilo JEA è possibile accedere ad una sessione PowerShell e verificare che i Cmdlet desiderati siano disponibili.
Per accedere alla sessione JEA eseguire in una PowerShell non amministrativa:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
Enter-PSSession -ComputerName "localhost" -ConfigurationName "VMControlSession"Per elencare i comandi disponibili è possibile utilizzare il Cmdlet "Get-Command":
[localhost]: PS>Get-Command
CommandType Name Version Source
----------- ---- ------- ------
Function Clear-Host
Function Exit-PSSession
Function Get-Command
Function Get-FormatData
Function Get-Help
Function Measure-Object
Function Out-Default
Function Select-Object
Function Start-Process
Function Start-VM
Function Stop-VM
|
CREAZIONE DEGLI SCRIPT PER L’ESECUZIONE ON DEMAND
Per permettere agli utenti di utilizzare in modo semplice i Cmdlet necessari per farli interagire con Hyper-V bisogna creare alcuni script.
Aprire con notepad lo script PowerShell per accendere la VM:
0 |
notepad "C:\HyperVHardening\Start-VM.ps1"
|
Incollare il seguente contenuto
NOTA BENE: sostituire VM_NAME con il nome della VM:
0
1
2
3
4
5
6
7
8
9
|
# Creare una nuova sessione JEA
$Session = New-PSSession -ComputerName "localhost" -ConfigurationName "VMControlSession"
# Eseguire dei comandi nella sessione JEA
Invoke-Command -Session $Session -ScriptBlock {
Start-VM -Name "VM_NAME"
}
# Chiudere la sessione JEA
Remove-PSSession -Session $Session
|
Aprire con notepad lo script BAT per accendere la VM:
0 |
notepad "C:\HyperVHardening\Start-VM.bat"
|
Incollare il seguente contenuto:
0
1
2
|
if not DEFINED IS_MINIMIZED set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "C:\HyperVHardening\Start-VM.ps1"
exit
|
In modo analogo è possibile creare uno script PS1 e uno script BAT per lo spegnimento della VM.
L’accesso in console invece prevede l’utilizzo di PsExec64, perciò gli script verranno riportati in seguito.
Aprire con notepad lo script PowerShell per accedere alla console della VM:
0 |
notepad "C:\HyperVHardening\Enter-VM-Console.ps1"
|
Incollare il seguente contenuto
NOTA BENE: sostituire VM_NAME con il nome della VM:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Creare una nuova sessione JEA
$Session = New-PSSession -ComputerName "localhost" -ConfigurationName "VMControlSession"
# Salvare il session ID dell'utente
$SessionID = (query user | Select-String ' console ' | ForEach-Object { ($_ -split '\s+')[2] }).Trim()
# Eseguire dei comandi nella sessione JEA
Invoke-Command -Session $Session -ArgumentList $SessionID -ScriptBlock {
param($SessionID)
Start-Process "C:\HyperVHardening\PsExec64.exe" -ArgumentList @('-accepteula','-si',$SessionID,'C:\WINDOWS\system32\vmconnect.exe','localhost','VM_NAME')
}
# Chiudere la sessione JEA
Remove-PSSession -Session $Session
|
Aprire con notepad lo script BAT per accedere alla console della VM:
0 |
notepad "C:\HyperVHardening\Enter-VM-Console.bat"
|
Incollare il seguente contenuto:
0
1
2
|
if not DEFINED IS_MINIMIZED set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "C:\HyperVHardening\Enter-VM-Console.ps1"
exit
|
CORREGGERE I PERMESSI DEGLI SCRIPTS
Affinché gli utenti possano eseguire gli scripts creati negli step precedenti è necessario modificare le ACL per consentirne la lettura e l’esecuzione.
Per modificare le ACL è possibile eseguire i seguenti comandi:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# Get current ACL
$acl = Get-Acl -Path "C:\HyperVHardening\Enter-VM-Console.bat"
# Create the ACL rules
$readExecute = [System.Security.AccessControl.FileSystemRights]::ReadAndExecute
$ruleAuthenticatedUsers = New-Object System.Security.AccessControl.FileSystemAccessRule("Authenticated Users", $readExecute, "Allow")
$ruleUsers = New-Object System.Security.AccessControl.FileSystemAccessRule("Users", $readExecute, "Allow")
# Add the rules to the ACL
$acl.AddAccessRule($ruleAuthenticatedUsers)
$acl.AddAccessRule($ruleUsers)
# Apply the modified ACL to the scripts
Get-ChildItem -Path "C:\HyperVHardening" | Where-Object { $_.Extension -in @('.ps1','.bat') } | ForEach-Object {
Set-Acl -Path "C:\HyperVHardening\$_" -AclObject $acl
}
|
È possibile creare dei collegamenti ai tre script BAT sul Desktop pubblico ed assegnarli delle icone personalizzate; in questo modo gli utenti potranno interagire con la VM semplicemnte cliccando sulle icone sul loro Desktop.
0 Comments