====== NTFS-Berechtigungen und ACLs ======
===== NTFS-Berechtigungen =====
Bei NTFS-Berechtigungen gibt einfache und erweiterte Berechtigungen. Man kann jede Berechtigung auf "Allow" oder "Deny" setzen.\\
Der folgende Powershell-Befehl listet alle Berechtigungen auf:
[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])
==== Einfache Berechtigungen ====
^ Berechtigung ^ Auswirkung ^
|Full Controll | Objekte können hinzugefügt, geändert oder entfernt werden (auch die Objekteinstellungen). Zusätzlich können die Berechtigungen für untergeordnete Objekte geändert werden |
|Modify |Objekte können hinzugefügt, geändert oder entfernt werden (auch die Objekteinstellungen).|
|Read & Execute | Objekte (und ihre Eigenschaften) sind sichtbar, Dateien können geöffnet und ausgeführt werden (auch Skripte)|
|Read | Objekte und ihre Einstellungen sind sichtbar |
|Write | Objekte können angelegt und geändert werden. |
==== Erweiterte Berechtigungen ====
^ Berechtigung ^ Auswirkung ^
| Traverse Folder/Execute File | In einer Struktur ''\\KEINE_BERECHTIGUNG_VORHANDEN\BERECHTIGUNG_VORHANDEN'' können die untergeordneten Verzeichnisse geöffnet werden, obwohl in dem übergeordneten Objekt Rechte fehlen. Auch ausführbare Dateien können geöffnet werden. Diese Berechtigung greift nur, wenn die berechtigte Gruppe der Benutzer _nicht_ die "Bypass Traverse Checking" Berechtigung im Group-Policy-SnapIn hat. |
|List Folder / Read Data| Der Verzeichnisinhalt ist sichtbar und Dateiinhalte können gelesen werden|
|Read Attributes|Objekt-Attribute können angesehen werden (read-only, hidden,...)|
|Write Attributes|Objekt-Attribute können geändert werden |
|Read Extended Attributes| Erweiterte Objektattribute können eingesehen werden (Berechtigungen, Zeitstempel)|
|Write Extended Attributes| Erweiterte Objektattribute können bearbeitet werden |
|Create Files / Write Data| (nur an Verzeichnissen) Dateien können in diesem Verzeichnis angelegt, geändert und überschrieben werden. |
|Create Folders / Append Data| (nur an Verzeichnissen) Verzeichnisse können angelegt werden. Dateien können geändert werden, vorhandene Inhalte aber nicht entfernt oder überschrieben |
|Delete|Objekte können gelöscht werden. Auch ohne diese explizite Berechtigung können Objekte gelöscht werden, wenn am übergeordneten Verzeichnis die Berechtigung "Delete Subfolders and Files" besteht |
|Read Permissions| Objektberechtigungen können gelesen werden|
|Change Permission|Objektberechtigungen können geändert werden|
|Take Ownership| Der Objektbesitz kann übernommen werden. :!: Der Besitzer an eines Objekts kann kann die Objektberechtigungen auch ändern, wenn er nicht über diese Berechtigung verfügt |
|Synchronize|Das Objekt kann synchronisiert werden. Dadurch wird ein Prozess initialisiert, der auf einen bestimmten Zustand des Objekts wartet. Diese Berechtigung existiert nicht im ACL-Editor. |
===== Vererbung =====
NTFS-Berechtigungen können entweder an dem Objekt selbst gesetzt (explicit) oder vom übergeordneten Objekt geerbt (inherited) worden sein.\\
Die Hirarchie der gesetzten Berechtigungen ist dabei wie folgt:
* Explizit am Objekt verboten
* Explizit am Objekt erlaubt
* geerbtes verboten
* geerbtes erlaubt
Ein explizites "verboten" würde also ein geerbtes "erlaubt" überschreiben.\\
====== ACLs ======
===== ACLs lesen =====
Das erste Powershell-Commandlet zur verwaltung von Berechtigungen ist ''Get-Acl''; es listet alle Objekt-Berechtigungen.
get-acl \\path\to\source |fl
{{:powershell:system:acl001.png?400|get-acl}}
Um alle Berechtigungen innerhalb einer Verzeichnisstruktur in eine CSV-Datei zu exportieren, kann folgendes Skript verwendet werden:
# Zu untersuchender Pfad
$path = "\\path\to\source"
# Pfad zur CSV-Datei
$reportpath ="C:\data\ACL.csv"
#Nach Verzeichnissen unterhalb des angegebenen suchen und für alle Fundstellen acl(permissions) auslesen
Get-ChildItem -Recurse $path | Where-Object { $_.PsIsContainer } `
| ForEach-Object { $path1 = $_.fullname; Get-Acl $_.Fullname `
| ForEach-Object { $_.access | Add-Member -MemberType NoteProperty '.\Application Data' -Value $path1 -passthru }} `
| Export-Csv $reportpath
===== ACLs übertragen =====
Besitz an Quelle und Ziel ist Voraussetzung.
get-acl \\path\to\source | Set-Acl \\path\to\target
===== NTFS-Berechtigungen setzen =====
Das Powershell-Commandlet ''Set-Acl'' ändert den Security-Descriptor eines Objekts (Datei, Verzeichnis, Reg-Key, ...). Anders ausgedrückt "es ändert die Berechtigungen". Im folgenden Beispiel wird dem Benutzer "Username" Vollzugriff auf das Verzeichnis "\\path\to\target" gewährt:\\
:!: **__Die Berechtigung wird nicht hinzugefügt, sondern bestehende Berechtigungen werden ersetzt__**
$acl = Get-Acl \\path\to\target
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("DOMAIN\Username","FullControl","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl \\path\to\target
Andere Berechtigungen können der Tabelle entnommen werden:
^Berechtigung^Bezeichnung in Powershell^
|FullControl|FullControl|
|Traverse Folder / Execute File| ExecuteFile|
|List Folder / Read Data| ReadData|
|Read Attributes|ReadAttributes|
|Read Extended Attributes|ReadExtendedAttributes|
|Create Files / Change Data|CreateFiles|
|Create Folders / Append Data| AppendData|
|Write Attributes|Write Attributes|
|Write Extended Attributes|WriteExtendedAttributes|
|Delete Subfolders and Files|DeleteSubfoldersandFiles|
|Delete|Delete|
|Read Permissions|ReadPermissions|
Darüber können die essentiellen Berechtigungen auch über Berechtigungs-Sätze vergeben werden:
^Berechtigungs-Satz^umfasst folgende Berechtigungen^Bezeichnung in Powershell^
|Read|List Folders / Read Data|Read|
|:::|Read Atributes|:::|
|:::|Read Extended Attributes|:::|
|:::|Read Permissions|:::|
|Write|Create Files / Write data|Write|
|:::|Create Folders / Append Data|:::|
|:::|Write Attributes|:::|
|:::|Write Extended Attributes|:::|
|Read and Execute|Traverse Folder / Execute File|ReadAndExecute|
|:::|List Folders / Read Data|:::|
|:::|Read Attributes|:::|
|:::|Read Extended Attributes|:::|
|:::|Read Permissions|:::|
|Modify|Traverse Folder / Execute File|Modify|
|:::|List Folders / Read Data|:::|
|:::|Read Attributes|:::|
|:::|Read Extended Attributes|:::|
|:::|Read Permissions|:::|
|:::|Create Files / Write data|:::|
|:::|Create Folders / Append Data|:::|
|:::|Write Attributes|:::|
|:::|Write Extended Attributes|:::|
|:::|Delete|:::|
===== Berechtigungen entfernen =====
Nur die Berechtigung "Allow FullControl" für den Benutzer "DOMAIN\Username" aus den vorhandenen Berechtigungen entfernen.
$acl = Get-Acl \\path\to\target
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("DOMAIN\Username","FullControl","Allow")
$acl.RemoveAccessRule($AccessRule)
$acl | Set-Acl \\path\to\target
Wenn der Benutzer noch die Berechtigung "Deny FullControl" zugewiesen hat, kann diese mit "PurgeAccessRules" entfernt werden:\\
:!: "PurgeAccessRules" funktioniert nicht mit Strings, sondern nur mit SIDs. Die Klasse "Ntaccount" kann verwendet werden, um den String des Accountnamen zur SID zu konbvertieren.\\
:!: Der Befehl funktioniert nur bei direkt am Objekt gesetzten und nicht bei geerbten Berechtigungen.\\
$acl = Get-Acl \\path\to\target
$usersid = New-Object System.Security.Principal.Ntaccount ("DOMAIN\Username")
$acl.PurgeAccessRules($usersid)
$acl | Set-Acl \\path\to\target
===== Vererbung aktivieren und deaktivieren =====
Für die Verwaltung der Vererbung wird die Methode "SetAccessRuleProtection" verwendet. Sie verfügt über zwei mögliche Stati: "$true" und "$false".\\
* Der erste Parameter aktiviert ($false) oder deaktiviert ($true) die Vererbung von übergeordneten Berechtigungen.
* Der zweite Parameter entscheidet darüber, ob bestehende geerbte Berechtigungen erhalten bleiben sollen ($true) oder nicht ($false).
Beispiel: Die Vererbung zum Verzeichnis "\\path\to\target" soll unterbrochen und die bislang geerbten Berechtigungen entfernt werden:\\
:!: Explizit gesetzten Berechtigungen bleiben erhalten.
$acl = Get-Acl \\path\to\target
$acl.SetAccessRuleProtection($true,$false)
$acl | Set-Acl \\path\to\target
Den Schritt rückgängig zu machen und die Vererbung wieder aktivieren:
$acl = Get-Acl \\path\to\target
$acl.SetAccessRuleProtection($false,$true)
$acl | Set-Acl \\path\to\target
===== Besitz von Verzeichnissen und Dateien ändern =====
Der Besitzer eines Objekts wird mit der Methode "SetOwner" geändert.\\
Beispiel: Den Benutzer "Username" zum Besitzer des Ordners "\\path\to\target" machen:\\
:!: Der Benutzer "Username" muss über die Berechtigungen "Take Ownership", "Read" und "Change Permission" verfügen.
$acl = Get-Acl \\path\to\target
$usersid = New-Object System.Security.Principal.Ntaccount ("DOMAIN\Username")
$acl.SetOwner($usersid)
$acl | Set-Acl \\path\to\target