Skip to content

Instantly share code, notes, and snippets.

@rebrec
Last active September 11, 2023 08:44
Show Gist options
  • Save rebrec/5d4088656763d2eee894e7488648c414 to your computer and use it in GitHub Desktop.
Save rebrec/5d4088656763d2eee894e7488648c414 to your computer and use it in GitHub Desktop.
Configuration de Just Enough Administration (JEA) sur une machine membre d'un domaine Active Directory
# Testé avec Powershell 5.1
# Documentation disponible : # https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/jea/overview?view=powershell-7.3
# Réalise les opérations suivantes
# - crée sur une machine membre d'un domaine AD un endpoint JEA, une session avec un role affecté à celle-ci
# - autorise un utilisateur du domaine à accéder à ce rôle (au travers de cette session)
# - l'autorisation se fait via la création d'un groupe local auquel on pourra ajouter d'autres membres
# - les cmdlets autorisés sont ceux par défaut, il faudra étider le fichier de configuration (voir commentaires plus bas)
######## Elements à paramétrer
$AllowedUsername = "<DOMAIN>\<Utilisateur>"
$SessionName = "TestSession"
$Role = "RoleDeTest"
$JEAModule = "JEAModule"
$TranscriptFolder = 'C:\TRANSCRIPT'
$JEA_ROOT = "C:\JEA"
$LOCAL_GROUP_NAME = "JEA_TECH"
########
# Création d'un groupe local qui servira pour attribuer un rôle à notre utilisateur du domaine de test
New-LocalGroup -Name "$LOCAL_GROUP_NAME" -ErrorAction SilentlyContinue
# Ajout de l'utilisateur du domaine à ce groupe
Add-LocalGroupMember -Group "$LOCAL_GROUP_NAME" -Member "$AllowedUsername" -ErrorAction SilentlyContinue
$RoleCapabilitiesFolder= "$env:ProgramFiles\WindowsPowerShell\Modules\$ModuleName\RoleCapabilities"
# La définition de rôles doit se trouver dans le sous dossier "RoleCapabilities" d'un module powershell
# Création d'un module :
New-ModuleManifest -Path "$env:ProgramFiles\WindowsPowerShell\Modules\$ModuleName.psd1"
# Création des dossiers
New-Item -Path "$JEA_ROOT" -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
New-Item -Path "$RoleCapabilitiesFolder" -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
New-Item -Path "$TranscriptFolder" -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
$RoleCapabilityFile = "$RoleCapabilitiesFolder\$Role.psrc"
$SessionConfigurationFile = "$JEA_ROOT\$SessionName.pssc"
# Paramètres de sessions utilisables
#RunAsVirtualAccount = $true
#RunAsVirtualAccountGroups = 'NetworkOperator', 'NetworkAuditor'
# Exemple d'utilisation de GMSA pour accéder à des services réseau
# with the sAMAccountName of 'MyJEAGMSA'a
#GroupManagedServiceAccount = 'Domain\MyJEAGMSA'
$roles = @{
#'DOMAIN\Group01' = @{ RoleCapabilities = 'REMOVE_VM_TEST' }
"$($env:COMPUTERNAME)\JEA_TECH" = @{ RoleCapabilities = $Role }
}
$parameters = @{
SessionType = 'RestrictedRemoteServer'
Path = $SessionConfigurationFile
RunAsVirtualAccount = $true
TranscriptDirectory = $TranscriptFolder
RoleDefinitions = $roles
}
New-PSSessionConfigurationFile @parameters
# Désinscrit la session (au cas où elle aurait été créée précédemment)
Unregister-PSSessionConfiguration -Name $SessionName -Force -ErrorAction SilentlyContinue | Out-Null
# Enregistrement de la session : positionne automatiquement les ACL adéquat sur l'endpoint WinRM associé
Register-PSSessionConfiguration -Path $ConfigurationFile -Name $SessionName -Force
# Edition du fichier de configuration manuellement
# Attribution de cmdlets / scripts / exécutables autorisés a être appelés
# Détails concernant le contenu de ce fichier :
# https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/jea/role-capabilities?view=powershell-7.3#allowing-powershell-cmdlets-and-functions
Notepad $RoleCapabilityFile
<#
####### Diagnostique
# Vérifier les rôles définis pour une session
Get-PSSessionConfiguration -Name $SessionName | Select-Object RoleDefinitions
# Vérifier les ACLs positionnées sur l'endpoint WinRM de la sesssion (une modification nécessitera le redémarrage du service WinRM)
Get-PSSessionConfiguration -Name $SessionName | Select-Object Permission
# Vérification de la liste des accès d'un utilisateur
Get-PSSessionCapability -ConfigurationName "$SessionName" -Username 'Domaine\Utilisateur1'
#>
<#
######## Utilisation à distance
# Creation d'une PSSession avec notre compte utilisateur courant (on pourra utiliser le paramètre -Credential
# si on souhaite utiliser des informations d'identification alternatives
$jeaSession = New-PSSession -ComputerName "JEA_HOSTNAME" -ConfigurationName "JEA_SESSION_NAME"
# Import de tous les cmdlets de la session distante en leur ajoutant le préfixe 'JEA'
Import-PSSession -Session $jeaSession -Prefix 'JEA'
# Exécution du cmdlet "Get-Command" sur le point de terminaison JEA en utilisant le cmdlet importé (proxy)
Get-JEACommand
#>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment