Das Active Directory bietet viele verschieden Authentifizierungsmöglichkeiten an, darunter sind die bekanntesten NTLM und Kerberos. In diesem Artikel möchte nur einen konkreten Anwendungsfall darstellen und eine schnelle Lösungsmöglichkeit anbieten.
Nach einer kurzen Einführung zu Kerberos und .Net-Klassen in PowerShell, stelle ich das Skript get-sids-from-token.ps1 vor
Index
Einführung Kerberos-Token
Wenn sich ein Anwender an seiner Workstation anmeldet und diese in ein Active Directory gejoint ist, so erhält der Anwender nach erfolgreicher Authentifizierung gegen einen Domain Controller ein sogenanntes “Kerberos-Token”. Dieses Token enthält unter anderem die SIDs (Security Identifiers) der Gruppen, in denen er oder sie Mitglied ist. Möchte der Anwender dann auf eine Ressource, beispielsweise auf ein zentrales Filesystem, zugreifen, so zeigt er sein Token vor. Ressourcen sind meist über sogenannte ACLs (Access Control Lists) geschützt. Diese beinhalten verschieden Regeln (ACEs – Access Control Entries). Diese definieren, welche SIDs mit welchen Rechten auf die Ressource zugreifen können. Der Anwender erhält Zugriff auf eine Ressource, wenn sein Kerberos-Token eine SID enthält, die Zugriff auf die Ressource gewährt. Wenn nicht, bleibt ihm der Zugriff verwehrt.
Wichtig: Ein Anwender erhält ein Kerberos-Token nur bei einem Login-Vorgang. Wenn nach dem Login Gruppenmitgliedschaften geändert werden, hat dies keinen Einfluss auf bereits ausgestellte Tokens. Erst bei einer Neuanmeldung erhält der Anwender ein aktuelles Token!
Für Debugging-Zwecke ist es oft hilfreich zu wissen, ob ein Anwender bestimmte Gruppenmitgliedschaften in seinem Token hat. Es gibt viele Möglichkeiten diese zu erhalten. Eine der bekanntesten ist klist.
Ich möchte aber heute auf eine andere, zwar nicht so bekannte aber dennoch elegante Möglichkeit eingehen: Powershell!
Kerberos-Token über Powershell-Skript auslesen
Damit wir per PowerShell das Kerberos-Token auslesen können, verwenden wir eine .Net-Klasse in einem Powershell-Skript.
Die Klasse ist [System.Security.Principal.WindowsIdentity] und ist hier dokumentiert.
Eine der Methoden der Klasse ist GetCurrent() (weitere Infos).
Die Methode gibt quasi den aktuellen User-Kontext als .Net-Objekt zurück.
Wie in einem meiner Artikel Net Code in PowerShell verwenden beschrieben, können wir diese Klasse auch problemlos in Powershell verwenden! Und zwar folgendermaßen:
[System.Security.Principal.WindowsIdentity]::GetCurrent()
Mittels [System.Security.Principal.WindowsIdentity]::GetCurrent() erhalten wir dann folgende Ausgabe:
PS C:\Users\tuser1> $token = [System.Security.Principal.WindowsIdentity]::GetCurrent()
PS C:\Users\tuser1> $token
AuthenticationType : Kerberos
ImpersonationLevel : None
IsAuthenticated : True
IsGuest : False
IsSystem : False
IsAnonymous : False
Name : SANCTUARY\tuser1
Owner : S-1-5-21-2667348191-198858073-1110801464-1189
User : S-1-5-21-2667348191-198858073-1110801464-1189
Groups : {S-1-5-21-2667348191-198858073-1110801464-513, S-1-1-0, S-1-5-32-545, S-1-5-4…}
Token : 3300
Der relevante Teil für uns ist “Groups”. Dieser enthält die SIDs des aktuellen Kerberos-Tokens:
SIDs gegen Domäne auflösen
Damit wir die Liste besser lesen können, müssen wir die SIDs nun gegen die Domäne auflösen.
Die Objekte in unserer SID-Liste sind vom Typ System.Security.Principal.IdentityReference.SecurityIdentifier, welche vom BaseType System.Security.Principal.IdentityReference ist. Wir können also die Translate-Methode verwenden.
Als targetType verwendet wir “NTAccount”.
PS C:\Users\tuser1> $groupSIDS = $token.Groups
PS C:\Users\tuser1> $groupSIDs[10]
BinaryLength AccountDomainSid Value
———— —————- —–
28 S-1-5-21-2667348191-198858073-111080… S-1-5-21-2667348191-198858073-111080…
PS C:\Users\tuser1> $groupSIDs[10].Translate([System.Security.Principal.NTAccount])
Value
—–
SANCTUARY\F-A2-SALES-Abteilung1-RW
Fertiges PS-Skript
Das fertige Skript zum Auslesen der aktuell im Kerberos-Ticket befindlichen Gruppen sieht folgendermaßen aus:
Download: get-sids-from-token.ps1
$token = [System.Security.Principal.WindowsIdentity]::GetCurrent() # Get current user context
$groupSIDs = $token.Groups # Get SIDs in current Kerberos token
foreach($sid in $groupSIDs) { # for each of those SIDs…
try { # try to..
Write-Host (($sid).Translate([System.Security.Principal.NTAccount])) # translate the SID to an account name
}
catch { # if we can’t translate it…
Write-Warning („Could not translate “ + $sid.Value + „. Reason: “ + $_.Exception.Message) # Output a warning and the corresponding exception
}
}
Dieser Artikel entstand bei Projekten der FirstAttribute AG
AD Consulting | AD Migration
Sie planen Veränderungen an Ihrem AD?
Nehmen Sie Kontakt zu uns auf, wir hören Ihnen gern zu.
Leave a Reply
<p>Danke für Ihre Anregungen, Fragen und Hinweise.<br/>Infos zum <a href="https://www.active-directory-faq.dekontakt/">Datenschutz</a></p>