Dateisicherheit und Zugriffsberechtigungen

Da Dateien absicherbare Objekte sind, wird der Zugriff auf sie durch das Zugriffssteuerungsmodell geregelt, das den Zugriff auf alle anderen absicherbaren Objekte unter Windows steuert. Eine ausführliche Erläuterung dieses Modells finden Sie unter Zugriffssteuerung.

Wenn Sie die Funktion CreateFile, CreateDirectory oder CreateDirectoryEx aufrufen, können Sie eine Sicherheitsbeschreibung für eine Datei oder ein Verzeichnis angeben. Wenn Sie NULL für den lpSecurityAttributes-Parameter angeben, erhält die Datei oder das Verzeichnis eine Standardsicherheitsbeschreibung. Die Zugriffssteuerungslisten (Access Control Lists, ACL) in der Standardsicherheitsbeschreibung für eine Datei oder ein Verzeichnis werden vom übergeordneten Verzeichnis geerbt. Beachten Sie, dass eine Standardsicherheitsbeschreibung nur zugewiesen wird, wenn eine Datei oder ein Verzeichnis neu erstellt wird, und nicht, wenn sie umbenannt oder verschoben werden.

Um die Sicherheitsbeschreibung eines Datei- oder Verzeichnisobjekts abzurufen, rufen Sie die Funktion GetNamedSecurityInfo oder GetSecurityInfo auf. Um die Sicherheitsbeschreibung eines Datei- oder Verzeichnisobjekts zu ändern, rufen Sie die Funktion SetNamedSecurityInfo oder SetSecurityInfo auf.

Die gültigen Zugriffsrechte für Dateien und Verzeichnisse umfassen die StandardzugriffsrechteDELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER und SYNCHRONIZE. In der Tabelle unter Konstanten für Dateizugriffsrechte sind die für Dateien und Verzeichnisse spezifischen Zugriffsrechte aufgelistet.

Obwohl das Zugriffsrecht SYNCHRONIZE in der Liste Standardzugriffsrechte als das Recht definiert ist, ein Dateihandle in einer der wait-Funktionen anzugeben, sollten Sie bei asynchronen Datei-E/A-Vorgängen auf das Ereignishandle warten, das in einer ordnungsgemäß konfigurierten OVERLAPPED-Struktur enthalten ist, anstatt das Dateihandle mit dem Zugriffsrecht SYNCHRONIZE zur Synchronisierung zu verwenden.

Es folgen die generischen Zugriffsrechte für Dateien und Verzeichnisse.

Zugriffsrecht Beschreibung
FILE_GENERIC_EXECUTE
FILE_EXECUTE
FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
SYNCHRONIZE
FILE_GENERIC_READ
FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE
FILE_GENERIC_WRITE
FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE

 

Windows vergleicht die angeforderten Zugriffsrechte und Informationen im Zugriffstoken des Threads mit den Informationen in der Sicherheitsbeschreibung des Datei- oder Verzeichnisobjekts. Wenn der Vergleich nicht verhindert, dass alle angeforderten Zugriffsrechte gewährt werden, wird ein Handle für das Objekt an den Thread zurückgegeben, und die Zugriffsrechte werden gewährt. Weitere Informationen zu diesem Prozess finden Sie unter Interaktion zwischen Threads und absicherbaren Objekten.

Standardmäßig wird die Autorisierung für den Zugriff auf eine Datei oder ein Verzeichnis von den ACLs in der Sicherheitsbeschreibung streng gesteuert, die dieser Datei oder diesem Verzeichnis zugeordnet ist. Insbesondere wird die Sicherheitsbeschreibung eines übergeordneten Verzeichnisses nicht verwendet, um den Zugriff auf untergeordnete Dateien oder Verzeichnisse zu steuern. Das FILE_TRAVERSE-Zugriffsrecht kann erzwungen werden, indem Benutzern das BYPASS_TRAVERSE_CHECKING-Recht entzogen wird. Dies wird im Allgemeinen nicht empfohlen, da viele Programme Fehler beim Verzeichnisdurchlauf nicht ordnungsgemäß behandeln. Die primäre Zweck des FILE_TRAVERSE-Zugriffsrecht für Verzeichnisse besteht darin, die Konformität mit bestimmten IEEE- und ISO POSIX-Standards zu ermöglichen, wenn Interoperabilität mit UNIX-Systemen erforderlich ist.

Das Windows-Sicherheitsmodell bietet die Möglichkeit, dass ein untergeordnetes Verzeichnis einen oder mehrere Zugriffssteuerungseinträge (Access Control Entries, ACEs) der Sicherheitsbeschreibung des übergeordneten Verzeichnisses erbt oder daran gehindert wird, diese zu erben. Jeder ACE enthält Informationen, die bestimmen, wie er geerbt werden kann und ob dies Auswirkungen auf das erbende Verzeichnisobjekt hat. Beispielsweise steuern einige geerbte ACEs den Zugriff auf das geerbte Verzeichnisobjekt, die als effektive ACEs bezeichnet werden. Alle anderen ACEs haben die Bezeichnung Nur erben.

Das Windows-Sicherheitsmodell erzwingt auch die automatische Vererbung von ACEs an untergeordnete Objekte gemäß den ACE-Vererbungsregeln. Diese automatische Vererbung bestimmt zusammen mit den Vererbungsinformationen in jedem ACE, wie Sicherheitseinschränkungen in der Verzeichnishierarchie nach unten weitergegeben werden.

Beachten Sie, dass Sie einen ACE für Zugriffsverweigerung nicht verwenden können, um nur GENERIC_READ- oder nur GENERIC_WRITE-Zugriff auf eine Datei zu verweigern. Dies liegt daran, dass für Dateiobjekte die generischen Zuordnungen für GENERIC_READ oder GENERIC_WRITE das SYNCHRONIZE-Zugriffsrecht enthalten. Wenn ein ACE einem Vertrauensnehmer den GENERIC_WRITE-Zugriff verweigert und der Vertrauensnehmer GENERIC_READ-Zugriff anfordert, schlägt die Anforderung fehl, da die Anforderung implizit einen SYNCHRONIZE-Zugriff umfasst, der vom ACE implizit verweigert wird und umgekehrt. Verwenden Sie anstelle von ACEs, die Zugriff verweigern, ACEs, die Zugriff erlauben, um die erlaubten Zugriffsrechte ausdrücklich zuzulassen.

Eine weitere Möglichkeit zum Verwalten des Zugriffs auf Speicherobjekte ist Verschlüsselung. Die Implementierung der Dateisystemverschlüsselung unter Windows ist Encrypted File System (bzw. EFS). EFS verschlüsselt ausschließlich Dateien und keine Verzeichnisse. Der Vorteil der Verschlüsselung besteht in einem zusätzlichen Schutz für Dateien, der auf dem Datenträger und nicht über das Dateisystem und die standardmäßige Windows-Architektur für Zugriffssteuerung angewendet wird. Weitere Informationen zur Dateiverschlüsselung finden Sie unter Dateiverschlüsselung.

Zumeist ist die Möglichkeit, die Sicherheitseinstellungen eines Datei- oder Verzeichnisobjekts zu lesen und zu schreiben, auf Prozesse im Kernelmodus beschränkt. Sie möchten selbstredend nicht, dass ein Prozess eines Benutzers den Besitz oder den Zugriff auf Ihre private Datei oder Ihr privates Verzeichnis ändern kann. Eine Sicherungsanwendung wäre jedoch nicht in der Lage, ihren Auftrag zur Sicherung Ihrer Datei zu erfüllen, wenn die Zugriffsbeschränkungen, die Sie für Ihre Datei oder Ihr Verzeichnis festgelegt haben, es dem Benutzermodusprozess der Anwendung nicht erlauben, diese zu lesen. Sicherungsanwendungen müssen in der Lage sein, die Sicherheitseinstellungen von Datei- und Verzeichnisobjekten zu überschreiben, um eine vollständige Sicherung zu gewährleisten. Ähnlich verhält es sich, wenn eine Sicherungsanwendung versucht, eine Sicherungskopie Ihrer Datei über die datenträgerresidente Kopie zu schreiben und Sie dem Prozess der Sicherungsanwendung Schreibrechte explizit verweigern. Dann kann der Wiederherstellungsvorgang nicht abgeschlossen werden. Auch in diesem Fall muss die Sicherungsanwendung in der Lage sein, die Zugriffssteuerungseinstellungen Ihrer Datei zu überschreiben.

Die Zugriffsberechtigungen SE_BACKUP_NAME und SE_RESTORE_NAME wurden spezifisch erstellt, um diese Möglichkeit zum Sichern von Anwendungen zu bieten. Wenn diese Berechtigungen im Zugriffstoken des Sicherungsanwendungsprozesses gewährt und aktiviert wurden, kann dieser anschließend CreateFile aufrufen, um Ihre Datei oder Ihr Verzeichnis für die Sicherung zu öffnen. Dabei wird das Standardzugriffsrecht READ_CONTROL als Wert des dwDesiredAccess-Parameters angegeben. Um den aufrufenden Prozess jedoch als Sicherungsprozess zu bestimmen, muss der Aufruf von CreateFile das FILE_FLAG_BACKUP_SEMANTICS-Flag im dwFlagsAndAttributes-Parameter enthalten. Die vollständige Syntax des Funktionsaufrufs ist wie folgt:

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           READ_CONTROL,               // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           OPEN_EXISTING,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

Dadurch kann der Sicherungsanwendungsprozess Ihre Datei öffnen und die Standardsicherheitsprüfung außer Kraft setzen. Um Ihre Datei wiederherzustellen, verwendet die Sicherungsanwendung zum Öffnen Ihrer zu schreibenden Datei die folgende CreateFile-Aufrufsyntax.

HANDLE hFile = CreateFile( fileName,                   // lpFileName
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess
                           0,                          // dwShareMode
                           NULL,                       // lpSecurityAttributes
                           CREATE_ALWAYS,              // dwCreationDisposition
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes
                           NULL );                     // hTemplateFile

Es gibt Situationen, in denen eine Sicherungsanwendung die Zugriffssteuerungseinstellungen einer Datei oder eines Verzeichnisses ändern können muss. Beispielsweise, wenn sich die Zugriffssteuerungseinstellungen der datenträgerresidenten Kopie einer Datei oder eines Verzeichnisses von denen der Sicherungskopie unterscheiden. Dies wäre der Fall, wenn diese Einstellungen nach der Sicherung der Datei oder des Verzeichnisses geändert oder diese beschädigt wurden.

Das im Aufruf von CreateFile angegebene FILE_FLAG_BACKUP_SEMANTICS-Flag erteilt dem Sicherungsanwendungsprozess die Berechtigung zum Lesen der Zugriffssteuerungseinstellungen der Datei oder des Verzeichnisses. Mit dieser Berechtigung kann der Sicherungsanwendungsprozess anschließend GetKernelObjectSecurity und SetKernelObjectSecurity aufrufen, um die Zugriffssteuerungseinstellungen zu lesen und anschließend zurückzusetzen.

Wenn eine Sicherungsanwendung Zugriff auf die Zugriffssteuerungseinstellungen auf Systemebene haben muss, muss das ACCESS_SYSTEM_SECURITY-Flag im Wert des dwDesiredAccess-Parameters angegeben werden, der an CreateFile übergeben wird.

Sicherungsanwendungen rufen BackupRead auf, um die für den Wiederherstellungsvorgang angegebenen Dateien und Verzeichnisse zu lesen, und BackupWrite, um sie zu schreiben.

Standardzugriffsrechte