Správa oprávnění NTFS ke složkám a souborům z prostředí PowerShell

Pro řízení přístupu k souborům a složkám ve Windows je každému objektu systému souborů NTFS (adresář nebo soubor) přiřazen speciální seznam ACL (Access Control List, Access Control List). Objekt ACL definuje dostupné operace (oprávnění), které může uživatel nebo skupiny s tímto objektem provádět. Ve většině případů správci oken používají ke správě oprávnění k souborům a složkám NFTS rozhraní grafického uživatelského rozhraní (vlastnosti složky / souboru -> karta Zabezpečení) nebo obslužný program konzoly icacls. V tomto článku se podíváme na způsoby správy oprávnění pro objekty systému souborů NTFS z prostředí PowerShell. Tyto příkazy můžete použít ve skriptech a automatizovat správu oprávnění NTFS na souborových serverech Windows.

Obsah:

  • Vestavěné rutiny cmdlet pro správu ACL v NTFS: Get-Acl a Set-Acl
  • Modul NTFSSecurity používáme ke správě oprávnění z prostředí PowerShell
  • Kontrola efektivních oprávnění NTFS na objekty z prostředí PowerShell

Vestavěné rutiny cmdlet pro správu ACL v NTFS: Get-Acl a Set-Acl

V PowerShell v5 (Windows 10 / Windows Server 2016) existují dvě samostatné vestavěné rutiny cmdlet pro správu ACL (součástí modulu Microsoft.PowerShell.Security):

  • Get-acl - umožňuje získat aktuální ACL pro konkrétní objekt v systému souborů NTFS;
  • Set-acl - slouží k přidání / úpravě aktuálních ACL aktuálních objektů.

Nebudeme se podrobně zabývat těmito vestavěnými rutinami, jak jejich funkčnost ve většině případů nestačí ke správě oprávnění NTFS ve skutečných úkolech. Uvažujme jen několik typických příkladů jejich použití..

Seznam aktuálního vlastníka složky (souboru) a seznam oprávnění přiřazených NTFS:

get-acl C: \ Drivers \ | fl

Cesta: Microsoft.PowerShell.Core \ FileSystem :: C: \ Drivers \
Vlastník: WORKSTAT1 \ root
Skupina: WORKSTAT1 \ Missing
Přístup: NT AUTHORITY \ Authenticated Users Povolit úpravy, synchronizovat
NT AUTHORITY \ SYSTEM Povolit FullControl
BUILTIN \ Administrators Povolit FullControl
BUILTIN \ Users Povolit ReadAndExecute, Synchronize
WORKSTAT1 \ root Povolit úpravy, synchronizovat
Audit:
Sddl: O: S-1-5-21-3650440056-3766451173-3310994491-1001G: S-1-5-21-3650440056-766451173-3310994491-513D: PAI (A; OICI; 0x 1301bf ;;; AU) (AU) (); A; OICI; FA ;;; SY) (A; OICI; FA ;;; BA) (A; OICI; 0x1200a9 ;;; BU) (A; OICI; 0x1301bf ;;;; S-1-5-21-3650440056 -37664 51173-3310994491-1001)

Jak vidíte, současná oprávnění jsou také prezentována jako řetězce SDDL - tento formát popisu přístupu jsme stručně prozkoumali v článku Správa práv pro služby Windows Services.

Oprávnění NTFS můžete uvést pouze ve srozumitelnějším formátu:

(get-acl C: \ Drivers \)

Pomocí následujícího příkazu můžete zkopírovat oprávnění NTFS z jedné složky a použít je do jiné složky:

Get-Acl C: \ Ovladače | Set-Acl C: \ Distr

K provedení této operace musí být účet vlastníkem zdroje (vlastník) a musí mít vlastnická práva k převzetí.

Hlavním problémem při používání Set-ACL je to, že rutina se vždy pokusí změnit vlastníka prostředku, i když chcete změnit oprávnění NTFS. Výsledkem je, že pro přidání práv k objektu musíte použít následující konstrukci:

$ path = "c: \ drivers"
$ user = "WORKSTAT1 \ user1"
$ Rights = "Read, ReadAndExecute, ListDirectory"
$ InheritSettings = "Containerinherit, ObjectInherit"
$ PropogationSettings = "None"
$ RuleType = "Povolit"
$ acl = Get-Acl $ cesta
$ perm = $ user, $ Rights, $ InheritSettings, $ PropogationSettings, $ RuleType
$ Rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $ perm
$ acl.SetAccessRule (pravidlo $)
$ acl | Set-Acl-Cesta $ cesta

Odebrání přístupu ke složce NTFS pro uživatele nebo skupinu:
$ path = "c: \ drivers"
$ acl = Get-Acl $ cesta
$ rules = $ acl.Access | kde IsInherited -eq $ false
$ targetrule = $ rules | kde IdentityReference -eq "WORKSTAT1 \ user1"
$ acl.RemoveAccessRule ($ targetrule)
$ acl | Set-Acl-Cesta $ cesta

Zakázání dědičnosti složky z prostředí PowerShell:

$ path = 'C: \ dist'
$ acl = Get-ACL - Cesta $ cesta
$ acl.SetAccessRuleProtection ($ True, $ True) # první $ True označuje, zda je tento adresář chráněn, druhý $ True - zda zkopírovat aktuální oprávnění NTFS
Set-Acl-Cesta $ cesta -AclObject $ acl

Také pomocí Get-acl a Set-Acl můžete řídit parametry auditu NTFS objektů (viz článek Kdo odstranil soubor na serveru?) Nebo informace o aktuálních oprávněních OU v AD.

Modul NTFSSecurity používáme ke správě oprávnění z prostředí PowerShell

Jak jsem řekl, vestavěný modul pro správu ACL na objektech v PowerShell není nejvhodnější. Ke správě práv k souborům a složkám NTFS ve Windows je lepší použít samostatný galerijní modul PowerShell - NTFSSecurity. Pomocí příkazu lze nainstalovat nejnovější verzi modulu NTFSSecurity (v současné době 4.2.4) Install-Module -Name NTFSSecurity, nebo stáhnout ručně (odkaz). Pro ruční instalaci stačí rozbalit obsah archivu modulu do adresáře C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ NTFSSecurity (nezapomeňte stažené soubory odemknout).

Importujte modul NTFSSecurity do relace PowerShell:

Importový modul NTFSSecurity

Seznam příkazů dostupných v modulu (k dispozici je 36 cm):

Get-Command - Modul NTFSSecurity

Seznam aktuálních oprávnění adresáře NTFS:
Get-Item 'c: \ distr' | Získejte-NTFSAccess

Jak vidíte, současná oprávnění jsou prezentována ve výhodnější formě..

Chcete-li udělit konkrétnímu uživateli a seskupit úplná práva skupiny ke složce, spusťte příkaz:
Add-NTFSAccess -Path C: \ distr -Account 'WORKSTAT1 \ confroom', 'BUILTIN \ Administrators' -AccessRights 'Fullcontrol' -PassThru

Tip. Ve výchozím nastavení cmdlets modulu NTFSSecurity nevrací žádná data, takže příkaz po spuštění zobrazí nové ACL, použijte parametr Passthru.

Chcete-li udělit práva pouze na nejvyšší úrovni a neměnit oprávnění pro vnořené objekty (pouze ve složce), použijte příkaz:

Přidat-NTFSAccess c: \ data \ public - účet Corp \ aaivanov -AccessRights Modify -AppliesTo thisFolderOnly

Odstranit oprávnění přiřazená NTFS:

Odebrat-NTFSAccess -Path C: \ distr -Account 'WORKSTAT1 \ confroom' -AccessRights FullControl -PassThru

Následující příkaz může připravená práva účtu zbavit všech vnořených objektů v zadané složce (zděděná oprávnění budou přeskočena):

Get-ChildItem -Path C: \ distr -Recurse | Získejte-NTFSAccess -Účet 'WORKSTAT1 \ confroom' -ExcludeInherited | Remove-NTFSAccess -PassThru

Následující příkaz může učinit účet správce jako vlastníka všech vnořených objektů v adresáři:

Get-ChildItem -Path C: \ distr -Recurse -Force | Set-NTFSOwner -Account 'Administrator'

Chcete-li ručně vymazat všechna oprávnění přiřazená k objektům adresáře (zděděná oprávnění nebudou odstraněna):

Get-ChildItem -Path C: \ distr -Recurse -Force | Vymazat-NTFSApřístup

Povolit dědičnost NTFS pro všechny objekty v adresáři:

Get-ChildItem -Path C: \ distr -Recurse -Force | Povolit-NTFSAccessInheritance

Chcete-li zobrazit všechna ručně přiřazená oprávnění, s výjimkou zděděných oprávnění:

směr C: \ distr | Získejte-NTFSAccess -ExcludeInherited

Můžete zobrazit oprávnění přiřazená ke konkrétnímu účtu (nezaměňujte se s účinnými oprávněními, budeme o nich mluvit níže):

směr C: \ distr | Získejte-NTFSAccess - účet Corp \ aaivanov

Kontrola efektivních oprávnění NTFS na objekty z prostředí PowerShell

Můžete to zkontrolovat efektivní oprávnění NTFS do konkrétního souboru nebo složky pomocí rutiny cmdlet Získejte efektivní efekt. Předpokládejme, že jste udělili přístup k určité složce několika skupinám zabezpečení AD a nyní chcete pochopit, zda určitý účet (SID) má přístup k této složce nebo ne. Jak to provést bez uvedení reklamních skupin, které obsahují jeho účet? V této situaci pomůže kontrola účinných oprávnění NTFS. Řekněme, že je třeba zkontrolovat efektivní práva všech podsložek v adresáři pro uživatelské kongresové prostory.

Get-ChildItem -Path c: \ distr -Recurse -Directory | Získejte-NTFSEffectiveAccess - účet 'WORKSTAT1 \ confroom' | vyberte Účet, AccessControlType, AccessRights, FullName

Nebo můžete zkontrolovat účinná oprávnění pro konkrétní soubor:

Get-Item -Path 'C: \ distr \ mstsc.exe.manifest' | Získejte-NTFSEffectiveAccess - účet 'WORKSTAT1 \ confroom' | Formát-seznam