Microsoft Security Identifier (SID) Attribute
Auf
dieser Webseite wollen wir einen Blick auf diejenigen
Verzeichnis-Attribute werfen, die von Microsoft dazu verwendet werden,
um die so genannten Security Identifiers (SID)
zu speichern. SIDs spielen eine wichtige Rolle bei der Vergabe und
Zuweisung von Berechtigungen und bei der Identifikation von
Rechteinhabern gegenüber dem System. Beispiele für derartige Attribute:
objectSid | User objects Computer objects Group objects |
Die Sicherheits ID, die den betreffenden Security Principal (=potentieller Rechte-Inhaber) eindeutig identifiziert. |
sIDHistory | User objects Computer objects Goup objects |
Existiert nur für migrierte Obekte, die z.B. mittels ADMT aus einer fremden Domäe übernommmen wurden. Die Liste der Security IDs im sIDHistory Attribut ermöglicht es, dass der betreffende Account oder die betreffende Gruppe mit der alten Identität auf Ressourcen zugreift und damit alle ehemaligen Berechtigungen erhalten bleiben. |
tokenGroups | User objects Computer objects |
Die
SIDs aller Gruppen innerhalb des gleichen AD Forests, in denen der
Benutzer enthalten ist. Dabei werden auch Gruppenverschachtelungen
beachtet, d.h. diese Liste enthält sowohl die direkten als auch
indirekten Gruppenmitgliedschaften. Ein sehr interessantes Attribut, nach dem leider nicht in LDAP-Filtern gesucht werden kann, weil es sich hier um ein Constructed Attribut handelt. |
tokenGroupsGlobalAndUniversal | User objects Computer objects |
Eine Untermenge des tokenGroups Attributes. Es werden hier lediglich die SIDs von globalen und universellen Gruppen in die Liste aufgenommen. |
tokenGroupsNoGCAcceptable | User objects Computer objects |
Eine Untermenge des tokenGroups Attributes. Es werden alle Gruppen-SIDs aufgenommen, für deren Auswertung man keinen Global Catalog benötigt. |
Der grundlegende LDAP Attribut-Datentyp für derartige Attribute ist eine Microsoft-proprietäre LDAP attribut syntax, die String(Sid) genannt wird - grundsätzlich handelt es sich dabei um binäre Daten, mit denen man schon beim Auslesen im Script speziell umgehen muß. Nähere Details hierzu kann man im SelfADSI Tutorial-Artikel Objekt-Attribute des Typs "Octet String" nachlesen.
Die interne Struktur eines SID Wertes wird in diesem Micrsoft Dokument beschrieben: Microsoft Data Type Reference [MSDTY].
1-Byte Revision: Eine 8-bit Unsigned Integer Zahl, die das Revisionslevel der SID Struktur angibt. Dieser Wert ist stets = 1.
1-Byte SubAuthority Count: Eine 8-bit Unsigned Integer Zahl, die die Nummer der Sub-Authority-Elemente (dies sind sozusagen die Sub-IDs innerhalb der SID) angibt. Es kann maximal 15 dieser Sub-Authorities geben.
6-Byte IdentifierAuthority: Diese 6 Bytes stellen den so genannten Authority Identifier dar, der anzeigt unter welcher Authorität die betreffende SID erzeugt wurde. Folgende Werte sind bisher definiert:
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 : NULL_SID_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x01 : WORLD_SID_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x02 : LOCAL_SID_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x03 : CREATOR_SID_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x04 : NON_UNIQUE_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x05 : NT_AUTHORITY
0x00, 0x00, 0x00, 0x00, 0x00, 0x06 : SECURITY_MANDATORY_LABEL_AUTHORITY
Variable-Length SubAuthority: Ein Feld von variabler Länge, das aus einem oder mehreren (die Anzahl steht weiter vorn in der SID) Sub-Authority-Elementen besteht. Eine Sub-Authority wird durch eine 32-Bit Integers Nummer repräsntiert, die in umgekehrter Byte-Order (LittleEndian) gespeichert werden. Die SID eines normalen Active Direcory Accounts besteht hier aus 5 solcher Sub-Authorities, die erste hat stets den Wert 21, die nächsten drei stellen den SID-"Grundstock" der Domäne dar, und der letzte Authority-Wert it schließlich die relative ID (RID) des Objektes in seiner Domäne. Ein Beispiel für eine normale Account-SID:
Obwohl SIDs binäre Werte mit einer variablen Länge sind(normale Active
Directory SIDs haben eine Länge von 28 Byte), werden sie für gewöhnlich
als Zeichenkette mit einer ganz bestimmten Syntax dargestellt, z.B. wie
diese hier:
S-1-5-7 (Wellknown SID for 'Anonymous Logon')
S-1-5-21-1621763826-2590103247-2238570322-1113
Diese Darstellungsform wird SDDL (Security Descriptor Definition Language) genannt. Die Regel für die SDDL-Schreibweise einer SID lautet
S-1-IdentifierAuthority-SubAuthority1-SubAuthority2-...-SubAuthorityn
Jede Active Directory Configuration Partition speichert Informationen über die so genannten wellknown standard SIDs die in dem betreffenden System verwendet werden können. Solche Daten werden in der OU CN=WellKnown Security Principals,CN=Configuration,DC=.... gespeichert. Dies ist der Aufbau der Wellknown SID "Everyone" (S-1-1-0):
Und dies ist der Aufbau der Wellknown SID "System" (S-1-5-18):
Binäre SID Daten umwandeln in lesbare SDDL Strings
Wenn
man SIDs mit einem LDAP Script aus dem Verzeichnis lesen will, stellt
sich die Frage: Wie wandelt man die binären Daten in einen lesbaren
SDDL-String um?
Wie wir bei der Besprechung der
Datenstruktur eines SID-Attributes gelernt haben, müssen wir beim
Auslesen und Darstellen der Daten zwei Hürden überwinden. Zuerst müssen
die puren Binärdaten in einen Hex-String umgewandelt werden: Dies
erledigt die Funktion OctetToHexStr.
Danach können wir die Daten in eine SDDL-Schreibweise umwandeln, wenn
wir die einzelnen Bytes der Authority-Blöcke jeweils gemäß der
richtigen Byte-Order in Long-Zahlen umwandeln. Dies macht die Funktion HexStrToSID. Dabei brauchen wir ein paar Hilfsfunktionen, die weiter unten im Beispielscript aufgeführt werden:
Lesbare SID Strings umwandeln in den entsprechenden Hex String
Nun
zum umgekehrten Problem: Wie kann ich aus einem gegebenen SID String
(in lesbarer SDDL Form) die entsprechenden Binärdaten (als Hex-String)
ermitteln. Diese Rohdaten braucht man z.B., wenn man einen LDAP-Filter
bauen möchte, der nach einem bestimmten SID-Attribut suchen soll, oder
wenn man die Berechtigungen mit ACLs direkt bearbeiten möchte.
Wir benötigen dabei Funktionen, die aus Long Integer Werten
entsprechende Hexadezimal-Darstellungen bilden können. Diese Funktionen
werden dann in SIDToHexStr aufgerufen:
SIDs in LDAP Filtern
Wenn Sie mit einer LDAP Search Operation nach einem Objekt mit einem bestimmten SID-Wert in einem Attribut suchen wollen, so müssen Sie dazu einen speziellen LDAP Filter
bauen. Dieser Filter muss die reinen Binärdaten der gesuchten SID
enthalten, dazu werden die einzelnen Bytes in hexadezimaler
Schreibweise durch Backslashes (\) getrennt. Als Basis wird also wieder
die Funktion SIDToHexStr benötigt, jedoch müssen hier zusätzlich die Backslahses eingefügt werden, um einen gültigen LDAP Filterstring zu erhalten.
Das Beispiel basiert auf der einer ADO-LDAP-Suche, wie sie im SelfADSI Tutorial-Artikel "Objekte suchen nach bestimmten Kriterien" gezeigt wird. Wir lesen das tokenGroups
Attribut eines Benutzers aus und suchen nach den entsprechenden
Gruppenobjekten (im Global Catalog). Damit lassen sich alle Gruppen
ermittlen, in denen der betreffende Account direkt oder indirek
enthalten ist:
LDAP Bind zu Objekten mit SIDs anstatt mit dem Distinguished Name
Eine interessante Variation der Suche nach Objekten mit einer vorgegebenen SID: Man kann beim Verbinden mit Objekten (LDAP Bind) auch einfach deren SID verwenden, wenn man folgende Syntax einhält
<SID=S-1-5-21-34672221-56910222-80333210-57321189-511> (Beispiel)
Sogar die puren HexStrings der SIDs lassen sich hier zum BIND benutzen:
<SID=0105000000000005150000001b0e683dbf16479eb5a59ec158040000> (Beispiel)
Diese
Technik können wir verwenden, um die Liste der direkten und indirekten
Gruppenmitgliedschaften viel eleganter als im letzten Beispiel zu
erhalten:
Werkzeuge für die Anzeige und Konvertierung von SIDs
Es gibt mehrere andere Werkzeuge für die Anzeige eines Microsoft String(SID) Attributes und dessen Umwandlung in einen lesbaren SDDL-SID-String.
LEX - The LDAP Explorer
LEX - The LDAP Explorer (ein leistungsfähiger kommerzieller LDAP Browser, den ich entwickelt habe)
hat spezielle Attribut-Editoren für Microsoft SID Attribute und kann
diese sowohl als SDDL als auch als binäre Rohdaten anzeigen:
LEX Editor für Microsoft SID Attributes:
PSGETSID
Diese Tool ist in der bekannten SysInternals PSTools Sammlung enthalten und kann kostenlos bei Microsoft heruntergeladen werden. Sie können damit auf der Kommandozeile SIDs in Usernamen auflösen und andersherum: