Zugriffssteuerungsliste
Eine Zugriffssteuerungsliste (Access Control List, ACL) ist eine Liste von Zugriffssteuerungseinträgen (Access Control Entries, ACEs), die vom Betriebssystem erstellt wurden, um das Sicherheitsverhalten zu steuern, das einem bestimmten (geschützten) Objekt einer bestimmten Art zugeordnet ist. In Windows gibt es zwei Arten von ACLs:
Eine bedingte ACL ist eine Liste mit null oder mehr ACEs, die die Zugriffsrechte für ein geschütztes Objekt beschreiben. „Bedingt“ bedeutet, dass der Zugriff nach eigenem Ermessen des Eigentümers oder eines Benutzers mit angemessenen Rechten gewährt wird.
Eine System-ACL ist eine Liste mit null oder mehr ACEs, die die Überwachungs- und Alarmrichtlinie für ein geschütztes Objekt beschreiben.
Der Begriff „bedingt“ bezieht sich auf die Unterscheidung zwischen obligatorischer und bedingter (ermessensgesteuerter) Kontrolle. In einer Umgebung, die obligatorische Steuerelemente verwendet, kann der Eigentümer eines Objekts möglicherweise keinen Zugriff auf das Objekt gewähren. In einer bedingten Umgebung, wie etwa Windows, darf der Eigentümer eines Objekts diesen Zugriff gewähren. Obligatorische Steuerelemente sind normalerweise strengen Sicherheitsumgebungen zugeordnet, z. B. solchen, die untergliederte Sicherheit verwenden, wobei das System die Offenlegung vertraulicher Informationen zwischen Benutzern im selben System verhindern muss.
Ein Treiber, der eine ACL erstellt, folgt dabei einigen wichtigen Schritten:
Zuweisen von Speicher für die ACL.
Initialisieren der ACL.
Hinzufügen von null (oder mehreren) ACEs zu der ACL.
In den folgenden Codebeispielen wird das Erstellen einer ACL veranschaulicht:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Das vorherige Codefragment erstellt eine leere ACL. Das Codebeispiel weist eine erhebliche Menge Arbeitsspeicher zu, da wir die für die ACL erforderliche Größe nicht kennen.
An diesem Punkt ist die ACL leer, da sie keine ACE-Einträge enthält. Eine leere ACL verweigert den Zugriff für alle Benutzer, die versuchen, auf das Objekt zuzugreifen, da keine Einträge vorhanden sind, die diesen Zugriff gewähren. Das folgende Codefragment fügt dieser ACL ein ACE hinzu:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Das hinzugefügte ACE gewährt Zugriff für jede Entität, die auf das Objekt zugreift, was der Zweck der World Access SID (SeWorldSid) ist. Dieses SID wird in der Regel als Zugriff für „Jeden“ Windows-Systemhilfsprogrammen dargestellt.
Beim Erstellen von ACLs ist es wichtig, ACE-Einträge mit verweigertem Zugriff am Anfang der ACL zu platzieren und solche mit Zugriffserlaubnis am Ende der ACL zu platzieren. Diese Reihenfolge ist wichtig. Andernfalls gewährt der Sicherheitsreferenzmonitor Zugriff, wenn er ein ACE mit Zugriffserlaubnis findet, und zwar vor einem ACE ohne Zugriffserlaubnis, wenn er die ACL evaluiert. Dieses Verhalten ist im Microsoft Windows-SDK gut dokumentiert, bezieht sich jedoch auf den spezifischen Mechanismus, mit dem der Sicherheitsreferenzmonitor bestimmt, ob der Zugriff gewährt oder verweigert werden soll.