[PowerShell] Gestion des permissions sur les fichiers (2)

 

Dans cette deuxième partie, nous allons voir la gestion des permissions NTFS (ACL).

Nous verrons comment récupérer les informations, modifier les permissions ou supprimer l'héritage.

Les permissions NTFS, ainsi que les informations d'audit sont enregistrées dans les propriétés des fichiers ou des dossiers. La manipulation n'est pas forcément simple à comprendre au début.

Il est possible de lister les détails avec GetAccessControl(), comme montré dans l'image ci-dessous, ou avec la commande Powershell Get-Acl. Dans les deux cas le résultat est assez similaire.

Vous pouvez noter la présence de la propriété « sddl » qui utilise un format difficile à lire. Comme vous pouvez le constater les permissions NTFS sont relativement faciles à lire avec l'attribut « Access ».

L'héritage de droit n'est a priori pas visible.

Dans l'image suivante nous allons comparer la valeur Sddl entre deux dossiers. Sur le premier l'héritage des droits a été supprimés. Sur le deuxième, l'héritage est actif.

Vous pouvez voir plus en détail les informations contenues dans Sddl dans les articles suivants :

https://blogs.technet.microsoft.com/askds/2008/04/18/the-security-descriptor-definition-language-of-love-part-1/

https://blogs.technet.microsoft.com/askds/2008/05/07/the-security-descriptor-definition-language-of-love-part-2/

Nous allons maintenant créer le dossier « Test1 » dans « d : ».

La commande qui permet de créer le dossier est :

New-Item -Name $folder -Path $parent -ItemType directory

$folder étant le nom du dossier et $path le dossier parent.

Nous allons récupérer les propriétés d'accès au dossier avec la commande get-acl et initialiser la variable $acl.

$acl = Get-Acl $Directory

 

Pour supprimer l'héritage nous allons utiliser la méthode « SetAccessRuleProtection ».

Le premier paramètre « isProtected » désactive l'héritage des permissions depuis le parent s'il vaut $True (protège de l'héritage) et réactive l'héritage si la valeur est $false.

Le deuxième paramètre (PreserveInheritance) permet de conserver (copier), les permissions déjà existantes héritées des dossiers parents. La valeur $false permet de ne pas copier les droits existants.

Plus de détails :

https://docs.microsoft.com/fr-fr/dotnet/api/system.security.accesscontrol.objectsecurity.setaccessruleprotection?redirectedfrom=MSDN&view=netframework-4.7.2

 

Pour supprimer l'héritage est conservé les droits nous allons utiliser la commande :

$acl.SetAccessRuleProtection($true,$True)

 

La Cmd-Let Set-ACL permet d'enregistrer la modification sur le fichier.

$acl |Set-Acl

 

Si vous ouvrez les propriétés du dossier vous pouvez constater que l'héritage est coupé et les permissions ont été conservées.

Nous souhaitons maintenant supprimer les deux permissions pour le groupe « Utilisateurs » de l'image précédente.

Nous allons créer deux variables contenants des objets de la classe FileSystemAccessRule avec la commande :

$userAccess1=New-Object security.AccessControl.FileSystemAccessRule("BUILTIN\Utilisateurs"," CreateFiles, AppendData",3,0,"Allow")

$userAccess2=New-Object security.AccessControl.FileSystemAccessRule("BUILTIN\Utilisateurs"," ReadAndExecute, Synchronize",3,0,"Allow")

 

Pour supprimer une règle de la liste d'accès il faut utiliser la méthode « RemoveAccessRule »

$acl.RemoveAccessRule($userAccess1)

$acl.RemoveAccessRule($userAccess2)

 

Enfin la commande « Set-Acl » permet d'enregistrer les modifications :

$acl |Set-Acl

 

Les images ci-dessous confirment le résultat :

 

 

Nous souhaitons maintenant ajouter la permission « Control Total » pour un groupe de domaine local :

$userAccess3=New-Object security.AccessControl.FileSystemAccessRule("SDL_Test2_CT"," FullControl, Synchronize",3,0,"Allow")

$Acl.addAccessRule($userAccess3)

$acl |Set-Acl

 

 

 

Vous savez maintenant comment couper l'héritage sur un dossier en conservant les permissions héritées et comment ajouter ou modifier des règles.

$directory= "d:\test2"

$acl = Get-Acl $directory

$acl.SetAccessRuleProtection($true,$False)

$acl |Set-Acl

 

 

Dans l'exemple suivant nous allons modifier le propriétaire, avec la méthode « SetOwner »

$acl = Get-Acl $directory

$ACL.SetOwner([System.Security.Principal.NTAccount]'pbarth')

$acl |Set-Acl

.

 

Vous avez également la possibilité d'utiliser des modules tiers disponibles. Par exemple le module NTFSSecurity dispose d'un certain nombre de commandes facilitant la gestion des sécurités NTFS. Vous pouvez installer le module avec la commande :

Install-Module NTFSSecurity

 

Vous pouvez lister l'ensemble des CmdLet du module avec la commande :

get-command -Module NTFSSecurity

 

Vous trouverez par exemple la commande Get-NTFSAccess, qui permet de lire simplement les permissions NTFS et l'héritage.

 

Les commandes, comme GetACL, conservent leur intérêt étant donné qu'elles ne sont pas limitées aux systèmes de fichiers. Par exemple la commande suivante utilise le provider AD, pour afficher des objets de l'annuaire avec un format identique au serveur de fichier :

Get-childitem -path "AD:OU=Groupes,DC=htrab,DC=lan"

 

La commande suivante permet de lire les permissions Active Directory sur le groupe de domaine local :

(get-acl -path "AD:CN=SDL_Test2_CT,OU=Groupes,DC=htrab,DC=lan").access

Pour finir les ACL sur les objets Active Directory utilisent également le format Sddl, mais la lecture n'est pas simple.

get-acl -path "AD:CN=SDL_Test2_CT,OU=Groupes,DC=htrab,DC=lan" | fl Sddl

 

 

Tags: 

Theme: 

Systeme: 

Annee: