Sicherheits-ID
Windows verwendet den Sicherheitsbezeichner (SID) als endgültigen Wert, um Sicherheitsentitäten voneinander zu unterscheiden. Beispielsweise wird jedem neuen Konto, das für einzelne Benutzer im System erstellt wurde, ein eindeutiger Sicherheitsbezeichner zugewiesen. Für ein Dateisystem wird nur diese SID verwendet.
Die folgende Abbildung veranschaulicht die Struktur des Sicherheitsbezeichners.
Zusätzlich zu eindeutigen SIDs definiert das Windows-System eine Reihe bekannter Bezeichner. Der lokale Administrator ist beispielsweise eine bekannte SID.
Windows bietet einen In-Kernel-Mechanismus zum Konvertieren zwischen SIDs und Benutzernamen innerhalb der Kernelumgebung. Diese Funktionsaufrufe stehen vom ksecdd-Treiber zur Verfügung, der diese Funktionen mithilfe von Benutzermodushilfsdiensten implementiert. Dementsprechend muss ihre Verwendung innerhalb von Dateisystemen den üblichen Regeln für die Kommunikation mit Benutzermodusdiensten entsprechen. Diese Aufrufe können während der Auslagerungsdatei-E/A nicht verwendet werden.
Hier einige dieser Funktionen:
SecMakeSPN erstellt eine Zeichenfolge für den Dienstanbieternamen, die bei der Kommunikation mit bestimmten Sicherheitsdienstanbietern verwendet werden kann.
SecMakeSPNEx ist eine erweiterte Version von SecMakeSPN , die in Windows XP eingeführt wurde.
SecMakeSPNEx2 ist eine erweiterte Version von SecMakeSPNEx, die ab Windows Vista und Windows Server 2008 verfügbar ist.
SecLookupAccountSid gibt einen Kontonamen für eine angegebene SID zurück.
SecLookupAccountName ruft die SID für einen angegebenen Kontonamen ab.
SecLookupWellKnownSid gibt die richtige SID für einen angegebenen bekannten SID-Typ zurück. Diese Funktion ist unter Windows Server 2003 und höher verfügbar.
Darüber hinaus kann jeder Kerneltreiber eine SID mithilfe der folgenden Standard-Laufzeitbibliotheksroutinen erstellen:
RtlInitializeSid initialisiert einen Puffer für eine neue SID.
RtlLengthSid bestimmt die Größe der im angegebenen Puffer gespeicherten SID.
RtlValidSid bestimmt, ob der angegebene SID-Puffer ein gültiger formatierter Puffer ist.
RtlLengthSid und RtlValidSid gehen davon aus, dass der feste 8-Byte-Header für eine SID vorhanden ist. Daher sollte ein Treiber vor dem Aufrufen dieser Funktionen nach dieser Mindestlänge für einen SID-Header suchen.
Während es mehrere andere RTL-Funktionen gibt, stellt diese Liste die primären Funktionen bereit, die beim Erstellen einer SID erforderlich sind.
Im folgenden Codebeispiel wird veranschaulicht, wie eine SID für die Entität "lokales System" erstellt wird. Die in Windows Server 2003 eingeführte einfachere SecLookupWellKnownSid-Funktion kann ebenfalls verwendet werden.
{
//
// temporary stack-based storage for an SID
//
UCHAR sidBuffer[128];
PISID localSid = (PISID) sidBuffer;
SID_IDENTIFIER_AUTHORITY localSidAuthority =
SECURITY_NT_AUTHORITY;
//
// build the local system SID
//
RtlZeroMemory(sidBuffer, sizeof(sidBuffer));
localSid->Revision = SID_REVISION;
localSid->SubAuthorityCount = 1;
localSid->IdentifierAuthority = localSidAuthority;
localSid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
//
// make sure it is valid
//
if (!RtlValidSid(localSid)) {
DbgPrint("no dice - SID is invalid\n");
return(1);
}
}
Das folgende Codebeispiel veranschaulicht das Erstellen einer SID mithilfe der SecLookupWellKnownSid-Funktion für die Entität "lokales System":
{
UCHAR sidBuffer[128];
PISID localSid = (PISID) sidBuffer;
SIZE_T sidSize;
status = SecLookupWellKnownSid(WinLocalSid,
&localSid,
sizeof(sidBuffer),
&sidSize);
if (!NT_SUCCESS(status)) {
//
// error handling
//
}
}
Beide Ansätze sind gültig, obwohl letzterem Code bevorzugt wird. In diesen Codebeispielen werden lokale Puffer zum Speichern der SID verwendet. Diese Puffer können nicht außerhalb des aktuellen Aufrufkontexts verwendet werden. Wenn der SID-Puffer dauerhaft sein muss, sollte der Puffer aus dem Poolspeicher zugewiesen werden.