Gérer des identifiants

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de décrire comment gérer des identifiants avec PowerShell.

Contexte

Dans le cadre de rédaction de scripts PowerShell, ils peuvent être amenés à être joués de façon automatique et récurrente.

A ce titre, s'ils doivent utiliser des identifiants pour se connecter à des ressources, il est bien évidemment fortement déconseillé de stocker des mots de passe en clair dans les scripts.

Une des solutions pour éviter l'usage de mots de passe en clair est d'utiliser un objet Credential (identifiant). Cet objet, au travers de la méthode Export-Clixml, permet de stocker le mot de passe :

  • de façon cryptée sur les système Windows
  • sous forme de tableau de caractères Unicode sur les systèmes non-Windows.

"Export-Clixml exporte uniquement les informations d'identification cryptées sous Windows. Sur les systèmes d'exploitation non Windows tels que macOS et Linux, les informations d'identification sont exportées sous forme de texte brut stocké sous forme de tableau de caractères Unicode. Cela fournit un certain obscurcissement mais ne fournit pas de chiffrement."[1]

La solution présentée ici est une solution parmi d'autres, et ne fait pas autorité en la matière.

Mise en œuvre

Dans l'idée, il faudra avoir 3 fichiers :

  • un fichier dans lequel stocker le mot de passe
  • un script permettant de créer les identifiants
  • un script lambda ayant besoin d'utiliser un des mots de passe stockés

Fichier pour mot de passe

La gestion des mots de passe au travers de la méthode Export-Clixml ne permet pas de stocker plusieurs utilisateurs. En effet, un identifiant correspond à un objet et la méthode Export-Clixml stocke un objet dans un fichier.

Il va donc falloir respecter une convention de nommage afin de pouvoir organiser les mots de passe. Par exemple : <serveur>_<utilisateur>.xml.

Il faudra également stocker ces fichiers dans un répertoire dont l'accès sera sécurisé. Par exemple : <chemin_du_dossier>/<mon_dossier_caché>.

Ainsi, nous pourrions avoir, par exemple, un dossier /data/scripts/.credentials qui contiendrait les fichiers suivants :

/data/scripts/.credentials/myserver1_root.xml
/data/scripts/.credentials/myserver2_www.xml
/data/scripts/.credentials/mybackupserver_admin.xml

Script de création d'identifiant

Le script suivant, nommé, par exemple, create_credentials.ps1, est utilisable de façon interactive :

 1 #!/usr/bin/pwsh
 2 
 3 ## Script pour créer des credentials
 4 
 5 ## Initialisation des variables
 6 # Stockage des fichiers de credentials
 7 $location = "/data/scripts/.credentials"
 8 
 9 # Demande du serveur concerné par les credentials
10 $server = Read-Host -Prompt 'Veuiller renseigner le serveur '
11 
12 # Demande du nom d'utilisateur et du mot de passe
13 $cred = Get-Credential -Message "Veuillez renseigner l'utilisateur et le mot de passe :"
14 
15 # Fichier dans lequel enregistrer les credentials
16 $file = $($location + "/" + $server + "_" + $cred.UserName + "_ps.xml")
17 
18 # Enregistrement des credentials dans un fichier
19 $cred | Export-Clixml -Path $file
20 
21 # Sécurisation du fichier en modifiant ses droits d'accès
22 chmod 0600 $file
23 
24 Write-Host "Fichier de credentials $file créé avec succès !"

La seule contrainte sera de penser à renseigner la ligne 7 pour indiquer dans quel dossier sera enregistré le fichier d'identifiant.

Script appelant un identifiant

Une fois le ou les fichier(s) d'identifiant créé(s), il(s) devra/devront être appelé(s) de la façon suivante :

#!/usr/bin/pwsh

# Penser à utiliser le script create_credentials.ps1 pour créer les credentials

## Initialisation variables
# Dossier des identifiants
$CredsFileLocation="/data/scripts/.credentials"

# Construction des fichiers d'identifiants à utiliser
$FileCredsA=$($CredsFileLocation + "/" + $serverA+ "_" + $userA+ "_ps.xml")
$FileCredsB=$($CredsFileLocation + "/" + $serverB+ "_" + $userB+ "_ps.xml")

# Importation des credentials
$CredsA=Import-Clixml -Path $FileCredsA
$CredsB=Import-Clixml -Path $FileCredsB

# Exemple d'utilisation d'un objet d'identifiant
New-SSHSession -ComputerName $serverA -Credential $CredsA

# Exemple d'utilisation avec récupération en clair du mot de passe de l'utilisateur B
$PasswdB=$CredsB.GetNetworkCredential().Password

Références