Windows : dépanner les autorisations sur les fichiers avec PowerShell
Une modification malheureuse d’un chef de service sur un répertoire partagé peut bloquer d’autres utilisateurs. Cet article explique comment retrouver la racine du problème et générer un rapport de la situation sous la forme d’un tableau Excel.
Lorsque vous devez trouver la source d’un problème de permissions sur un serveur de fichiers Windows, faites appel à PowerShell pour jouer les détectives et résoudre l’énigme. Les problèmes de permissions ont souvent pour symptôme la perte soudaine, pour de nombreux utilisateurs, de l’accès aux dossiers d’un NAS. Or, dans pareil cas, il peut être difficile de découvrir ce qui a effectué une modification malheureuse.
La vérification manuelle d’un serveur de stockage contenant de nombreux fichiers et dossiers est une tâche incroyablement fastidieuse. La solution est d’utiliser PowerShell, lequel apporte de l’automatisation. Une automatisation pour, par exemple, créer un rapport d’audit qui servira à repérer les dossiers présentant des problèmes de droits. Une fois les sources du problème mises en exergue, il devient trivial de le résoudre.
Comment fonctionnent les autorisations sur un serveur de fichiers Windows ?
Bien qu’il existe plusieurs systèmes de fichiers disponibles pour les systèmes Windows, le système de fichiers NTFS (New Technology File System) est celui qui demeure le plus utilisé aujourd’hui.
Parmi les caractéristiques de NTFS figure la possibilité de restreindre les accès en passant par des Listes de Contrôle d’Accès (ACL). Celles-ci référencent des Entrées de Contrôle d’Accès (ACE) contenant des informations sur le compte d’un utilisateur ou d’un groupe, ainsi que ses droits d’accès à un fichier ou un dossier. La documentation de Microsoft présente les termes ACL Windows et Autorisations NTFS comme synonymes.
En fonction des besoins d’une entreprise, l’administrateur adapte les autorisations NTFS pour contrôler le niveau d’accès à un dossier, en partant des utilisateurs à qui l’on attribue un droit de contrôle total et en allant jusqu’à ceux auxquels on interdit l’accès. Des problèmes peuvent survenir lorsqu’un utilisateur disposant d’un niveau d’accès supérieur, tel qu’un cadre dirigeant, modifie les autorisations d’un dossier Windows Server, empêchant ainsi les utilisateurs disposant d’un niveau d’accès inférieur d’accéder à leurs fichiers dans ce dossier ou dans l’un de ses sous-dossiers.
Avant de voir comment créer un audit des permissions du serveur de fichiers Windows, vous devez comprendre les deux méthodes permettant de récupérer les informations d’accès d’un dossier. Cet article se concentre sur PowerShell 7 ; cependant, sauf indication contraire, les commandes fonctionnent de la même manière dans Windows PowerShell.
Même si nous utilisons PowerShell 7, qui est multiplateforme, la cmdlet Get-ACL n’est disponible que sous Windows.
Get-Acl pour découvrir les autorisations
La cmdlet Get-Acl (intégrée à PowerShell) obtient le descripteur de sécurité stocké dans l’objet passé en paramètre, objet qui est dans ce cas un dossier sur le serveur Windows de partage de fichiers. Le descripteur de sécurité contient des informations telles que le propriétaire de l’objet et les ACL, qui indiquent les utilisateurs et les groupes autorisés à accéder à ce dossier. La commande suivante permet d’afficher les autorisations du dossier « Marketing » :
Get-Acl .\Marketing\
La sortie indique le chemin d’accès vers ce dossier, le propriétaire de ce dossier et la liste d’accès à ce dossier.
Pour obtenir des détails supplémentaires, comme la liste d’accès complète, ajoutez la propriété Access à la commande :
(Get-Acl .\Marketing\).Access
La cmdlet montre que toutes les autorisations du dossier sont explicites ; la propriété IsInherited indique que les autorisations ne sont pas héritées du dossier parent. La sortie montre également que les administrateurs ayant accès à ce partage ont suivi le protocole approprié en ajoutant des utilisateurs à des groupes plutôt que directement au dossier.
Get-NTFSAccess pour chercher des autorisations
L’autre méthode pour consulter les ACL des dossiers consiste à utiliser la cmdlet Get-NTFSAccess du module NTFSSecurity. Cette cmdlet a une syntaxe similaire à celle de Get-Acl :
Get-NTFSAccess .\Marketing\
Cette cmdlet produit des résultats plus faciles à comprendre lors de l’évaluation des autorisations NTFS.
Le tableau montre l’attribut IsInherited qui identifie les dossiers dont les autorisations diffèrent de celles du dossier parent. La meilleure caractéristique de Get-NTFSAccess est qu’il permet d’auditer l’ensemble du partage de fichiers avec une seule ligne de PowerShell. Vous n’avez besoin que de quelques lignes de code supplémentaires pour le formater en un rapport présentable.
Pour commencer, voyons comment obtenir de manière récursive les autorisations des dossiers en utilisant Get-ChildItem pour trouver tous les dossiers, puis acheminer la sortie vers Get-NTFSAccess :
Get-ChildItem -Directory -Recurse | Get-NTFSAccess
Dans le cas d’un partage de fichiers volumineux, la génération de la sortie de la console peut prendre un certain temps. Préparez-vous à l’annuler avec CTRL+C ou testez-la d’abord sur un dossier plus petit pour vous assurer qu’elle fonctionne comme prévu.
La capture d’écran montre les premières lignes de l’environnement de test. Les autorisations des sous-dossiers Events sont toutes héritées et l’attribut InheritedFrom fait référence au dossier Marketing racine. Cependant, cela ne permet pas de trouver les autorisations qui ne sont pas héritées. Pour cela, utilisez la cmdlet Where-Object et recherchez les autorisations qui ne sont pas héritées en utilisant le point d’exclamation, qui correspond à l’opérateur Not :
Get-ChildItem -Directory -Recurse | Get-NTFSAccess | Where-Object {!($_.IsInherited)}
L’exécution de cette opération peut également prendre beaucoup de temps ; soyez donc prêt à attendre si vous l’exécutez sur un dossier contenant de nombreux fichiers. Dans l’environnement de test, un seul dossier a des autorisations différentes de celles du dossier racine.
Le résultat montre qu’un utilisateur nommé John Doe a des permissions sur le dossier Files, et que les autres permissions héritées sont toujours activées. Si l’utilisateur avait désactivé l’héritage sur ce dossier, le rapport montrerait quelque chose de différent.
Cet utilisateur a effectué quelques actions irrégulières sur le partage de fichiers. Il a désactivé l’héritage et supprimé le groupe File Share Admins. Il peut y avoir une explication logique à cela, mais il s’agit d’un comportement douteux.
Comment synthétiser la recherche des autorisations dans un rapport ?
Maintenant que nous avons pu produire les données, nous pouvons passer à la présentation du rapport afin d’obtenir un résultat lisible, à partager avec un directeur de service. Par expérience, le rapport est généralement destiné aux propriétaires de chaque partage de fichiers et à un responsable informatique. Par souci de simplicité, nous exporterons le rapport sous la forme d’une feuille de calcul Excel.
Il y a deux options : soit exécuter la commande PowerShell sur une seule ligne, ce qui serait volumineux, soit assigner la sortie précédente à une variable et sortir ensuite la variable dans une feuille de calcul. Étant donné que la collecte de toutes les autorisations sur un partage de fichiers volumineux ou complexe peut prendre beaucoup de temps, l’affectation de variables est la meilleure solution. Un autre avantage est que vous pouvez examiner les données avant de formater le rapport sur les autorisations du serveur de fichiers Windows.
Pour produire le fichier Excel, vous utiliserez une cmdlet appelée Export-Excel, fournie par le module ImportExcel. Cette cmdlet fonctionne dans Windows PowerShell et PowerShell 7. Si vous ne l’avez pas sur votre système, installez-la à l’aide de la commande suivante :
Install-Module ImportExcel
Le code PowerShell suivant spécifie les paramètres préférés pour qu’Export-Excel place les données dans un tableau et dimensionne automatiquement les colonnes :
$notInherited = Get-ChildItem -Directory -Recurse | Get-NTFSAccess | Where-Object {!($_.IsInherited)}
Cette capture d'écran montre un exemple de feuille de calcul générée automatiquement par PowerShell.
Reste à personnaliser le rapport. Pour exclure des propriétés, utilisez Select-Object ; il sert à apporter des modifications au rapport. Remplacez la commande Export-Excel précédente par la commande ci-dessous :
$notInherited | Select-Object -ExcludeProperty
AccountType,InheritanceEnabled,InheritedFrom,IsInherited | Export-
Excel C:\temp\Report.xlsx -TableName Permissions -AutoSize
La capture d’écran montre la feuille de calcul Excel contenant les données analysées.
Lorsque vous envoyez le rapport, rappelez à vos destinataires de « filtrer par » la colonne FullName. Souvent, un serveur de fichiers comporte plusieurs sous-dossiers qui portent le même nom, typiquement Files. Ce filtrage permet de trier les dossiers de manière plus ordonnée.