PowerShell DSC : Ajouter un groupe AD membre d’un groupe local
I. Présentation
Aaaaah, cela faisait un moment que je n'avais pas écrit un tutoriel PowerShell DSC. Aujourd'hui on va s'intéresser à la ressource "Group" qui est native au sein de PSDesiredStateConfiguration. Avec elle, nous allons pouvoir ajouter ou retirer des membres d'un groupe local sur un ensemble de serveurs cibles. Autrement dit, la ressource Group permet de gérer les groupes locaux d'un serveur par l'intermédiaire de PowerShell DSC.
II. Attention aux credentials !
Dans ce tutoriel, nous allons voir comment ajouter un groupe Active Directory comme membre d'un groupe local sur un ensemble de serveurs. On pourrait aussi ajouter un utilisateur ou groupe local comme membre d'un autre groupe local. Mais ce n'est pas tout à fait la même chose.
En fait, pour ajouter un groupe Active Directory, nous allons devoir envoyer une requête à l'annuaire AD pour vérifier que ce groupe existe. Ce qui nécessite des autorisations de lecture au sein de l'annuaire. Cependant, par défaut DSC exécute les actions en utilisant le compte système local d'un serveur, ce qui ne permet pas de requêter l'AD.
C'est pour cela que la ressource "Group" contient un paramètre nommé "Credential" que l'on va utiliser pour spécifier le compte utilisateur avec lequel interroger l'annuaire AD. Il suffira que l'on crée un objet PSCredentials pour stocker les identifiants dans une variable et les envoyer dans le paramètre de DSC. Le problème c'est qu'en cet état, la configuration ne fonctionnerait pas.
PowerShell DSC déclencherait une erreur à propos du mot de passe qui est passé en clair, mais aussi parce que l'on utilise un compte du domaine. La bonne pratique consiste à chiffrer le mot de passe, notamment par l'intermédiaire d'un certificat, et en utilisant les ConfigurationData de PowerShell DSC.
Mais, alors comment faire sans ? Deux options sont là pour nous aider, voyons ce qu'elle nous dise.
- PsDscAllowPlainTextPassword
Le paramètre "PsDscAllowPlainTextPassword" vous permet, lorsqu'il est définit sur "true", d'autoriser les mots de passe en clair, bien que ce ne soit pas recommandé. On va donc pouvoir l'utiliser dans notre cas présent.
- PSDscAllowDomainUser
Ensuite, que le mot de passe des identifiants soit chiffré ou non, PowerShell DSC continuera à vous avertir ! En fait, ce qui ne va pas lui plaire c'est qu'un compte du domaine Active Directory soit utilisé. Ceci est logique, là encore pour des raisons de sécurité, puisque si votre compte admin est hacké, alors le pirate pourra :
- Déchiffrer votre mot de passe en clair dans le fichier compilé MOF
- Utiliser le chiffré du mot de passe (chiffré par certificat) pour le rejoué au sein d'autres configurations
Pour, malgré tout, utiliser un compte du domaine on va s'appuyer sur l'option PsDscAllowDomainUser qui, elle aussi lorsqu'elle est sur "true", vous autorise l'utilisation d'un compte domaine.
- En résumé
Avec ces deux paramètres, on sera tranquille pour appliquer correctement notre configuration, mais gros warning sur la sécurité ! Il conviendra déjà de ne pas stocker le mot de passe en clair dans une variable au sein du fichier PS1, puis de supprimer les fichiers compilés MOF après une exécution en mode push.
L'idéal est d'utiliser un mot de passe sécurisé par un certificat (donc inutile de passer sur true la valeur PsDscAllowPlainTextPassword), puis, de passer sur true la directive PsDscAllowDomainUser.
Maintenant, il est temps de passer à la construction de notre configuration, nous verrons notamment configurer les deux options PsDscAllowPlainTextPassword et PsDscAllowDomainUser
III. PowerShell DSC - Ressource "Group"
Je vous propose d'ouvrir votre éditeur PowerShell, puis commencez par déclarer la configuration que l'on va créer et appeler "AddADGroupToLocalGroup" :
Configuration AddADGroupToLocalGroup{ }
On va ensuite ajouter un paramètre qui servira à passer les credentials nécessaires à l'interrogation de l'annuaire Active Directory. On en profite aussi pour importer les ressources DSC nécessaires.
Configuration AddADGroupToLocalGroup{ # Param pour les credentials param( [System.Management.Automation.PSCredential]$DomainCredential ) # Importer les ressources DSC Import-DscResource –ModuleName PSDesiredStateConfiguration }
Ensuite, on va déclarer le bloc "Node" directement au sein du bloc de configuration afin d'y indiquer ensuite les actions à réaliser.
Configuration AddADGroupToLocalGroup{ # Param pour les credentials param( [System.Management.Automation.PSCredential]$DomainCredential ) # Importer les ressources DSC Import-DscResource –ModuleName PSDesiredStateConfiguration # Noeud Node $AllNodes.NodeName { } }
Venons en maintenant à l'action que nous souhaitons réaliser, c'est-à-dire ajouter un groupe Active Directory comme membre d'un groupe local d'un ensemble de machines cibles. On va s'appuyer sur la ressource Group, pour laquelle on va utiliser plusieurs paramètres : GroupName qui correspond au nom du groupe Windows, Ensure qui aura la valeur "Present" pour que DSC s'assure que notre groupe AD est bien membre du groupe local, puis le paramètre credential. Et enfin, le paramètre MembersToInclude qui permet d'indiquer le groupe AD à ajouter au groupe spécifié dans GroupName.
Remarque : Il est à noter qu'il existe le paramètre MembersToExclude qui sert à supprimer des membres d'un groupe.
Voici le code que l'on inclura directement dans le bloc Node :
# Ajouter le groupe IT_Users à "Utilisateurs du Bureau à distance" Group ITUsers { GroupName = "Utilisateurs du Bureau à distance" Ensure = "Present" Credential = $DomainCredential MembersToInclude = "IT-CONNECT\IT_users" }
Enfin, le dernier bloc de code important et utile au bon fonctionnement correspond aux données de configuration, que l'on va stocker dans la variable $ConfigurationData et que l'on passera au paramètre du même nom lorsque l'on va pousser notre config sur les nœuds.
On va cibler dans cet exemple le nœud SERVER01 et vous remarquerez que l'on positionne bien sur $true les deux paramètres évoqués précédemment pour la gestion des credentials.
$ConfigurationData = @{ AllNodes = @( @{ NodeName = "SERVER01" PsDscAllowPlainTextPassword = $true PSDscAllowDomainUser = $true } ) }
Ce qui donnera le code complet suivant :
# Configuration DSC pour ajouter un groupe AD au sein d'un groupe local des serveurs # Attention : Autoriser l'exécution de scripts PS1 sur les noeuds Configuration AddADGroupToLocalGroup{ # Param pour les credentials param( [System.Management.Automation.PSCredential]$DomainCredential ) # Importer les ressources DSC Import-DscResource –ModuleName PSDesiredStateConfiguration # Noeud Node $AllNodes.NodeName { # Ajouter le groupe IT_Users à "Utilisateurs du Bureau à distance" Group ITUsers { GroupName = "Utilisateurs du Bureau à distance" Ensure = "Present" Credential = $DomainCredential MembersToInclude = "IT-CONNECT\IT_users" } } } $ConfigurationData = @{ AllNodes = @( @{ NodeName = "SERVER01" PsDscAllowPlainTextPassword = $true PSDscAllowDomainUser = $true } ) }
On va se déplacer dans le dossier dans lequel on souhaite stocker les fichiers compilés de DSC, puis pousser la config après avoir généré les fichiers en invoquant notre configuration avec les bons paramètres :
Set-Location "D:\DSC\Conf" # On définit une variable pour demander la saisie des credentials, que l'on passera à DomainCredential $Cred = Get-Credential -UserName "IT-CONNECT\flo.admin" -Message "Password, please Sir" # Générer fichier MOF AddADGroupToLocalGroup -DomainCredential $Cred -ConfigurationData $ConfigurationData # Exécuter la configuration (push) Start-DscConfiguration -Path .\AddADGroupToLocalGroup -Wait -Verbose -Force -Credential (Get-Credential)
Après quelques secondes d'exécution sur chaque nœud, la configuration doit être effective ! En plus, il n'y a pas de module supplémentaire à installer sur les nœuds car on s'appuie sur une ressource native de PowerShell DSC. Grâce au mode Verbose activé dans la dernière commande ci-dessus, vous pourrez suivre de façon plus précise le déroulement de l'opération.
Maintenant, à vous de jouer ! 🙂