PowerShell JEA permet de déléguer certaines opérations d'administration avec PowerShell à distance à vos équipes techniques. Les commandes disponibles peuvent être contrôlées. Elle facilite certaines opérations d'exploitation tout en limitant les risques.
Les recommandations de l'ANSSI concernant l'administration sécurisée des systèmes d'information reposant sur Active Directory, publiées en octobre 2023 y font référence.
PowerShell JEA est pris en charge dans les versions 5.0 et les suivantes. A partir de Windows 2016, il n'y a pas d'action spécifique à réaliser.
Sur Windows Server 2008R2, Windows server 2012 et 2012R2, il est nécessaire d'installer « Windows Management FrameWork 5.1 » :
https://www.microsoft.com/en-us/download/details.aspx?id=54616
Dans notre exemple, nous allons autoriser les membres d'un groupe Active Directory à effectuer un nombre d'opérations d'administration restreinte sur un contrôleur de domaine en mode serveur core. L'opération reste identique sur un serveur avec l'expérience utilisateur.
Parmi les opérations définies, il pourra vérifier l'état des services, exécuter des commandes comme « ping », « nslookup » depuis le contrôleur de domaine. Vérifier l'état de santé avec « dcdiag » et « repadmin ». Il pourra également redémarrer le serveur, en cas de nécessité.
La mise en place de PowerShell JEA passe par la création de deux fichiers de configuration. Le premier indiquera entre autres, le mode d'utilisation, les groupes AD dont les membres sont autorisés à utiliser PowerShell JEA ainsi que pour chaque groupe le nom du rôle. Le deuxième fichier indiquera pour un rôle, les commandes disponibles.
- Préparer les groupes dans l'AD :
En suivant le principe du modèle AGDLP, nous créons deux groupes dans cet exemple :
- Groupe de domaine local « SDL-PS-Manage-DC », utilisé dans les autorisations d'accès en PowerShell à distance
-
Groupe global « SG-Exploitation-IT », qui est membre du groupe «SDL-PS-Manage-DC » et qui a comme membre les utilisateurs autorisés à effectuer les actions définis.
- Activer l'administration à distance sur le serveur cible
Pour activer l'administration à distance avec PowerShell, vous pouvez utiliser la commande suivante :
-
Enable-PSRemoting
Il vous sera peut-être nécessaire d'activer la règle correspondante dans le pare-feu avec la commande :
-
Enable-NetFireWallRule -DisplayName "Windows Management Instrumentation (DCOM-In)"
- Créer les fichiers de configurations
Il est possible de créer un dossier « Transcript » contenant des journaux sur les informations sur l'utilisation de la fonctionnalité. Ce dossier sera défini dans le fichier de configuration. Pour l'exemple, nous allons créer le dossier « Transcripts », avec la commande suivante :
New-Item -Path "C:\Transcripts\" -ItemType Directory
Il est également nécessaire de créer un dossier contenant les rôles dans le dossier «C:\Program Files\WindowsPowerShell ». Le dossier doit porter le nom de « RoleCapabilities ». La commande suivante permet de créer le dossier.
New-Item -Path "C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities" -ItemType Directory
Les fichiers de configuration sont des fichiers textes avec des noms d'extensions spécifiques. Pour faciliter l'opération, il est possible de créer le premier fichier avec la commande suivante :
New-PSSessionConfigurationFile -Path "C:\Program Files\WindowsPowerShell\DC-Support.pssc"
Ensuite nous éditons le fichier avec la commande dans notepad :
notepad.exe "C:\Program Files\WindowsPowerShell\DC-Support.pssc"
Le paramètre « # » en début de ligne dans le fichier de configuration indique qu'il s'agit d'un commentaire et la ligne n'est pas prise en compte.
Les lignes en rouge ci-dessous ont été ajoutées ou modifiées :
@{
# Numéro de version du schéma utilisé pour ce document
SchemaVersion = '2.0.0.0'
# ID utilisé pour identifier de manière unique ce document
GUID = '96582ca5-ca5c-4a9b-9974-8a5209e26f29'
# Auteur de ce document
Author = 'P.BARTH'
# Description des fonctionnalités fournies par ces paramètres
# Description = 'Fichier de configuration pour l'administration distante suffisante (JEA) pour les DCs'
# Valeurs par défaut du type de session à appliquer pour cette configuration de session. Valeurs possibles : RestrictedRemoteServer (recommandé), Vide ou Par défaut
SessionType = 'RestrictedRemoteServer'
# Répertoire où enregistrer les transcriptions de session pour cette configuration de session
TranscriptDirectory = 'C:\Transcripts\'
# Indique si cette configuration de session doit s'exécuter en tant que compte d'administrateur (virtuel) de l'ordinateur
RunAsVirtualAccount = $true
# Scripts à exécuter lorsqu'ils s'appliquent à une session
# ScriptsToProcess = 'C:\ConfigData\InitScript1.ps1', 'C:\ConfigData\InitScript2.ps1'
# Rôles d'utilisateur (groupes de sécurité) et fonctionnalités de rôle qui doivent leur être appliquées dans le cadre d'une session
# RoleDefinitions = @{ 'CONTOSO\SqlAdmins' = @{ RoleCapabilities = 'SqlAdministration' }; 'CONTOSO\ServerMonitors' = @{ VisibleCmdlets = 'Get-Process' } }
RoleDefinitions = @{ 'HTRAB\SDL-PS-Manage-DC' = @{ RoleCapabilities = 'Domain-Controller' }}
}
L'option « SessionType = RestrictedRemoteServer » contrairement à « Empty » permet d'autoriser une liste de fonctions réduite qui ne représente pas de risque comme « get-command » pour lister les commandes disponibles, « clear-host » pour effacer l'écran.
L'option « RunASVirtualAccount » indique que la session à distance utilisera un compte virtuel.
La ligne « RoleDefinitions = » permet de définir le groupe AD et de lui faire correspondre un profil de commande disponible.
Il est possible de définir plusieurs groupes avec des profils de commandes différentes en indiquant plusieurs lignes.
Il est possible de définir les paramètres lors de la création du fichier, depuis la commande PowerShell comme dans l'exemple suivant :
New-PSSessionConfigurationFile -Path "C:\Program Files\WindowsPowerShell\Test2.pssc" `
-SessionType RestrictedRemoteServer -Author "pbarth" `
-Description "Administration restreinte DC" `
-CompanyName "HTRAB" -RunAsVirtualAccount
La commande suivante permet de tester le fichier de configuration :
Test-PSSessionConfigurationFile -Path "C:\Program Files\WindowsPowerShell\DC-Support.pssc"
La réponse est "True" si aucune erreur n'est détectée.
Le deuxième fichier de configuration devra utiliser comme nom, le nom définit dans le premier fichier par la varible « RoleCapabilities », suivi de l'extention « psrc », soit « Domain-Controller.psrc ». Il devra se situer dans le dossier « RoleCapabilities ». La commande suivante permet de créer le fichier :
New-PSRoleCapabilityFile -Path "C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities\Domain-Controller.psrc"
notepad.exe "C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities\Printer_Group.psrc"
@{
# ID utilisé pour identifier de manière unique ce document
GUID = '9d2068f4-f01e-49ab-8a35-f02f91f91c15'
Author = 'philippe'
CompanyName = 'htrab'
Copyright = '(c) 2023 administrateur. Tous droits réservés.'
# Modules à importer lorsqu'ils s'appliquent à une session
# ModulesToImport = 'MyCustomModule', @{ ModuleName = 'MyCustomModule'; ModuleVersion = '1.0.0.0'; GUID = '4d30d5f0-cb16-4898-812d-f20a6c596bdf' }
# Alias à rendre visibles lorsqu'ils s'appliquent à une session
# VisibleAliases = 'Item1', 'Item2'
# Cmdlets à rendre visibles lorsqu'elles s'appliquent à une session
# VisibleCmdlets = 'Invoke-Cmdlet1', @{ Name = 'Invoke-Cmdlet2'; Parameters = @{ Name = 'Parameter1'; ValidateSet = 'Item1', 'Item2' }, @{ Name = 'Parameter2'; ValidatePattern = 'L*' } }
VisibleCmdlets = 'get-childitem','get-service','restart-computer', @{
Name = 'restart-service'; Parameters = @{ Name = 'Name' ;ValidateSet ='DNS'}},@{
Name = 'stop-service'; Parameters = @{ Name = 'Name' ;ValidateSet ='DNS'}},@{
Name = 'start-service'; Parameters = @{ Name = 'Name' ;ValidateSet ='DNS'}}
# Fonctions à rendre visibles lorsqu'elles s'appliquent à une session
# VisibleFunctions = 'Invoke-Function1', @{ Name = 'Invoke-Function2'; Parameters = @{ Name = 'Parameter1'; ValidateSet = 'Item1', 'Item2' }, @{ Name = 'Parameter2'; ValidatePattern = 'L*' } }
# Commandes externes (scripts et applications) à rendre visible lorsqu'elles s'appliquent à une session
# VisibleExternalCommands = 'Item1', 'Item2'
VisibleExternalCommands = 'C:\Windows\System32\whoami.exe','C:\Windows\System32\ping.exe','C:\Windows\System32\dcdiag.exe','C:\Windows\System32\repadmin.exe','C:\Windows\System32\nslookup.exe'
# Fournisseurs à rendre visibles lorsqu'ils s'appliquent à une session
# VisibleProviders = 'Item1', 'Item2'
VisibleProviders = 'FileSystem'
# Scripts à exécuter lorsqu'ils s'appliquent à une session
# ScriptsToProcess = 'C:\ConfigData\InitScript1.ps1', 'C:\ConfigData\InitScript2.ps1'
# Alias à définir lorsqu'ils s'appliquent à une session
# AliasDefinitions = @{ Name = 'Alias1'; Value = 'Invoke-Alias1'}, @{ Name = 'Alias2'; Value = 'Invoke-Alias2'}
# Fonctions à définir lorsqu'elles s'appliquent à une session
# FunctionDefinitions = @{ Name = 'MyFunction'; ScriptBlock = { param($MyInput) $MyInput } }
# Variables à définir lorsqu'elles s'appliquent à une session
# VariableDefinitions = @{ Name = 'Variable1'; Value = { 'Dynamic' + 'InitialValue' } }, @{ Name = 'Variable2'; Value = 'StaticInitialValue' }
# Variables d'environnement à définir lorsqu'elles s'appliquent à une session
# EnvironmentVariables = @{ Variable1 = 'Value1'; Variable2 = 'Value2' }
# Fichiers de type (.ps1xml) à charger lorsqu'ils s'appliquent à une session
# TypesToProcess = 'C:\ConfigData\MyTypes.ps1xml', 'C:\ConfigData\OtherTypes.ps1xml'
}
La variable "VisibleCmdlets" liste les commandes PowerShell disponibles. Dans l'exemple, l'utilisateur pourra utiliser les commandes PowerShell « *-service », mais seul le paramètre « DNS » est accepté. Il ne peut donc redémarrer que ce service. Il a également la possibilité de redémarrer le serveur.
L'option « VisibleProviders = 'FileSystem' », lui permet de voir les fichiers. Si elle n'est pas présente, il n'a pas accès aux différents disques.
L'option « VisibleExternalCommands », permet de mettre à disposition d'autres commandes, comme dans cet exemple avec « DCDiag.exe ».
La mise à disposition de commande demande tout de même une réflexion. Par exemple la commande « net share » est souvent utilisé pour lister les partages. Si vous mettez à disposition, la commande « net.exe », votre utilisateur pourra rajouter son compte dans le groupe administrateurs. Ensuite, il lui est possible d'ouvrir une session RDP et d'exécuter toutes les commandes. Il est parfois préférable d'autoriser les commandes PowerShell et de limiter certaines commandes au « get-* », comme « get-SmbShare » qui permet de lister les partages, sans octroyer d'autres accès. |
Il est également possible de définir des fonctions dans le fichier que l'utilisateur pourra utiliser, comme présenter dans l'exemple ci-dessous :
FunctionDefinitions = @{ Name = 'Purge-Spooler'; ScriptBlock = {
$PathSpooler = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Print\Printers").DefaultSpoolDirectory
$items = Get-ChildItem -Path $PathSpooler
Write-host "Liste des fichiers présent :"
Write-host $items
Write-host "Suppression des fichiers de $pathSpooler "
$items | Remove-Item -Confirm:$false
Write-host "Liste des fichiers restant :"
$items = Get-ChildItem -Path $PathSpooler
Write-host $items
} }
Dans ce cas, l'utilisateur peut exécuter la fonction, même s'il n'est pas autorisé à exécuter les commandes incluses dans la fonction.
- Enregistrer la configuration
Lorsque vous avez créé les deux fichiers, vous pouvez l'enregistrer dans PowerShell avec la commande :
Register-PSSessionConfiguration -Name Domain-Controller -Path "C:\Program Files\WindowsPowerShell\DC-Support.pssc"
Il faut ensuite redémarrer le service « WinRM ».
Il est possible de tester la configuration avec la commande suivante, en indiquant le nom du rôle et le nom d'un utilisateur membre du groupe « SG-Exploitation-IT ».
Get-PSSessionCapability -ConfigurationName Domain-Controller -Username htrab\alain
- Exploiter la configuration
Notre utilisateur peut maintenant se connecter en PowerShell avec la commande :
Enter-PSSession -ComputerName 22DC2 -ConfigurationName Domain-Controller
Il a la possibilité de lister les commandes disponibles avec « Get-Command ».
Il a la possibilité de redémarré le service DNS, comme indiqué dans le fichier de configuration.
Cependant, il ne peut redémarrer d'autres services. Le fichier de configuration ayant limité les paramètres de la fonction.
- Supprimer ou modifier la configuration
La commande suivante permet de supprimer une configuration enregistrée :
Unregister-PSSessionConfiguration -Name Domain-Controller
Vous avez la possibilité de réutiliser les fichiers de configurations sur d'autres serveurs, en les copiant. Il suffit juste d'enregistrer la configuration avec « Register-PSSessionConfiguration ».
Si vous souhaitez modifier une configuration, il faut la désinscrire, puis enregistrer la nouvelle configuration et redémarrer le service « WinRM ».
Vous trouverez plus d'information sur les possibilités de configuration des rôles JEA dans le lien suivant :