Partager via


Audit et réalisation de rapports sur JEA

Une fois que vous avez déployé JEA, vous devez régulièrement auditer la configuration JEA. L’audit vous permet d’évaluer que les personnes appropriées ont accès au point de terminaison JEA et que leurs rôles attribués sont toujours appropriés.

Rechercher des sessions JEA inscrites sur un ordinateur

Pour vérifier les sessions JEA inscrites sur une machine, utilisez l’applet de commande Get-PSSessionConfiguration .

# Filter for sessions that are configured as 'RestrictedRemoteServer' to
# find JEA-like session configurations
Get-PSSessionConfiguration | Where-Object { $_.SessionType -eq 'RestrictedRemoteServer' }
Name          : JEAMaintenance
PSVersion     : 5.1
StartupScript :
RunAsUser     :
Permission    : CONTOSO\JEA_DNS_ADMINS AccessAllowed, CONTOSO\JEA_DNS_OPERATORS AccessAllowed,
                CONTOSO\JEA_DNS_AUDITORS AccessAllowed

Les droits effectifs pour le point de terminaison sont répertoriés dans la propriété Permission . Ces utilisateurs ont le droit de se connecter au point de terminaison JEA. Toutefois, les rôles et commandes auxquels ils ont accès sont déterminés par la propriété RoleDefinitions dans le fichier de configuration de session utilisé pour inscrire le point de terminaison. Développez la propriété RoleDefinitions pour évaluer les mappages de rôles dans un point de terminaison JEA inscrit.

# Get the desired session configuration
$jea = Get-PSSessionConfiguration -Name 'JEAMaintenance'

# Enumerate users/groups and which roles they have access to
$jea.RoleDefinitions.GetEnumerator() | Select-Object Name, @{
  Name = 'Role Capabilities'
  Expression = { $_.Value.RoleCapabilities }
}

Rechercher les fonctionnalités de rôle disponibles sur l’ordinateur

JEA obtient les fonctionnalités de rôle à partir des fichiers .psrc stockés dans le dossier RoleCapabilities d’un module PowerShell. La fonction suivante recherche toutes les fonctionnalités de rôle disponibles sur un ordinateur.

function Find-LocalRoleCapability {
    $results = @()

    # Find modules with a "RoleCapabilities" subfolder and add any PSRC files to the result set
    Get-Module -ListAvailable | ForEach-Object {
        $psrcpath = Join-Path -Path $_.ModuleBase -ChildPath 'RoleCapabilities'
        if (Test-Path $psrcpath) {
            $results += Get-ChildItem -Path $psrcpath -Filter *.psrc
        }
    }

    # Format the results nicely to make it easier to read
    $results | Select-Object @{ Name = 'Name'; Expression = { $_.Name.TrimEnd('.psrc') }}, @{
        Name = 'Path'; Expression = { $_.FullName }
    } | Sort-Object Name
}

Remarque

L’ordre des résultats de cette fonction n’est pas nécessairement l’ordre dans lequel les fonctionnalités de rôle seront sélectionnées si plusieurs fonctionnalités de rôle partagent le même nom.

Vérifier les droits effectifs d’un utilisateur spécifique

L’applet de commande Get-PSSessionCapability énumère toutes les commandes disponibles sur un point de terminaison JEA en fonction des appartenances de groupe d’un utilisateur. La sortie de Get-PSSessionCapability est identique à celle obtenue par l’utilisateur spécifié exécutant Get-Command -CommandType All dans une session JEA.

Get-PSSessionCapability -ConfigurationName 'JEAMaintenance' -Username 'CONTOSO\Alice'

Si vos utilisateurs ne sont pas membres permanents de groupes qui leur accorderaient des droits JEA supplémentaires, cette applet de commande peut ne pas refléter ces autorisations supplémentaires. Cela se produit lors de l’utilisation de systèmes de gestion des accès privilégiés juste-à-temps pour permettre aux utilisateurs d’appartenir temporairement à un groupe de sécurité. Évaluez soigneusement le mappage des utilisateurs aux rôles et fonctionnalités pour vous assurer que les utilisateurs obtiennent uniquement le niveau d’accès nécessaire pour effectuer leurs tâches avec succès.

Journaux des événements PowerShell

Si vous avez activé la journalisation de bloc de module ou de script sur le système, vous pouvez voir les événements dans les journaux des événements Windows pour chaque commande qu’un utilisateur exécute dans une session JEA. Pour rechercher ces événements, ouvrez le journal des événements Microsoft-Windows-PowerShell/Operational et recherchez des événements avec l’ID d’événement 4104.

Chaque entrée du journal des événements inclut des informations sur la session dans laquelle la commande a été exécutée. Pour les sessions JEA, l’événement inclut des informations sur ConnectedUser et RunAsUser. ConnectedUser est l’utilisateur réel qui a créé la session JEA. RunAsUser est le compte JEA utilisé pour exécuter la commande.

Les journaux des événements d’application indiquent les modifications apportées par RunAsUser. Par conséquent, l’activation de la journalisation des modules et des scripts est nécessaire pour effectuer le suivi d’un appel de commande spécifique vers ConnectedUser.

Journaux des événements de l’application

Les commandes s'exécutant dans une session JEA et interagissant avec des applications ou des services externes peuvent consigner des événements dans leurs propres journaux d’événements. Contrairement aux journaux et transcriptions PowerShell, d’autres mécanismes de journalisation ne capturent pas l’utilisateur connecté de la session JEA. Au lieu de cela, ces applications consignent uniquement l’utilisateur d’exécution virtuelle. Pour déterminer qui a exécuté la commande, vous devez consulter une transcription de session ou mettre en corrélation les journaux des événements PowerShell avec l’heure et l’utilisateur affichés dans le journal des événements de l’application.

Le journal WinRM peut également vous aider à mettre en corrélation les utilisateurs exécutant en tant qu'avec l'utilisateur se connectant dans un journal des événements d'application. L’ID d’événement 193 dans le journal Microsoft-Windows-Windows Gestion à distance/Opérationnel enregistre l’identificateur de sécurité (SID) et le nom du compte pour l’utilisateur qui se connecte et pour l’utilisateur exécuté sous ce nom à chaque nouvelle session JEA.

Transcriptions de session

Si vous avez configuré JEA pour créer une transcription pour chaque session utilisateur, une copie textuelle des actions de chaque utilisateur est stockée dans le dossier spécifié.

La commande suivante (en tant qu’administrateur) recherche tous les répertoires de transcription.

Get-PSSessionConfiguration |
  Where-Object { $_.TranscriptDirectory -ne $null } |
    Format-Table Name, TranscriptDirectory

Chaque transcription commence par des informations sur l’heure de démarrage de la session, l’utilisateur connecté à la session et l’identité JEA qui lui a été affectée.

**********************
Windows PowerShell transcript start
Start time: 20160710144736
Username: CONTOSO\Alice
RunAs User: WinRM Virtual Users\WinRM VA_1_CONTOSO_Alice
Machine: SERVER01 (Microsoft Windows NT 10.0.14393.0)
[...]

Le corps de la transcription contient des informations sur chaque commande appelée par l’utilisateur. La syntaxe exacte de la commande utilisée n’est pas disponible dans les sessions JEA en raison de la façon dont les commandes sont transformées pour la gestion à distance avec PowerShell. Toutefois, vous pouvez toujours déterminer la commande effective qui a été exécutée. Voici un extrait de transcription d'un utilisateur utilisant Get-Service Dns dans une session JEA :

PS>CommandInvocation(Get-Service): "Get-Service"
>> ParameterBinding(Get-Service): name="Name"; value="Dns"
>> CommandInvocation(Out-Default): "Out-Default"
>> ParameterBinding(Out-Default): name="InputObject"; value="Dns"

Running  Dns                DNS Server

Une ligne CommandInvocation est écrite pour chaque commande exécutée par un utilisateur. ParameterBindings enregistre chaque paramètre et chaque valeur fournis avec la commande. Dans l’exemple précédent, vous pouvez voir que le paramètre Name a été fourni avec la valeur Dns pour le cmdlet Get-Service.

La sortie de chaque commande déclenche également une CommandInvocation, généralement vers Out-Default. L'InputObject de Out-Default est l’objet PowerShell retourné par la commande. Les détails de cet objet sont imprimés quelques lignes ci-dessous, imitant étroitement ce que l’utilisateur aurait vu.

Voir aussi

Article de blog PowerShell ♥ l'équipe bleue sur la sécurité