====== 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