demande de rappel immédiat

Ou stocker le mot de passe d'un script ?

Posted by Jean-Paul Blanc Tuesday, June 07, 2011 5:44:00 AM
Rate this Content 0 Votes

 

 

Vers le téléchargement des scripts.

 

Le principe consiste à chiffre le mot de passe ou la chaine de connexion sur le disque.

L'ordinateur en tant qu'utilisateur.

Les deux scripts qui suivent utilisent l'assembly de sécurité du Framework .NET. pour chiffrer le secret. Une particularité intéressante, pour les machines de type serveur, est qu'il est possible de protégé le secret par l'identité de la machine. Je part du principe que toute personne ayant accès à la machine (qui peut exécuter du code sur la machine) peut avoir accès au mot de passe.

Remarque : Il est a noter que le tableau d'entier issue du chiffrement est ensuite codé en base 64 ce qui assure son intégrité lors de transfert à travers des systèmes hétérogènes ou lors d'ouverture du fichier contenant le secret chiffré par des éditeurs peu scrupuleux. Cela rend le secret chiffré éditable.

# Assembly du Framework .NET nécessaire
Add-Type -assembly System.Security

# Chaine à chiffrer
$passwordASCII = Read-Host -Prompt "Entrer le mot de passe"

# Passage en tableau d'entier
$enc = [system.text.encoding]::Unicode
$clearPWD_ByteArray = $enc.GetBytes( $passwordASCII.tochararray())

# chiffrememnt
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$bakCryptedPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Protect($clearPWD_ByteArray, $null, $secLevel)

# Passage en Base 64 et stockage
$B64PWD_ByteArray = [Convert]::ToBase64String($bakCryptedPWD_ByteArray)
Set-Content -LiteralPath c:\Temp\pass.txt -Value $B64PWD_ByteArray

Attention : J'ai pris soin d'utiliser unicode comme mécanisme de codage au passage de la chaine de caractère au tableau d'entiers et inversement. Cela m'assure de restituer des éventuels caractères spéciaux (caractères accentués).

# Assembky du Framework .NET nécessaire
Add-Type -assembly System.Security

# Récupération depuis la Base 64 et stockage
$resCryptedPWD_ByteArray = [Convert]::FromBase64String((Get-Content -LiteralPath c:\Temp\pass.txt))

# Déchiffrement
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine
$clearPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Unprotect( $resCryptedPWD_ByteArray, $null, $secLevel )

# Récupération du tableau d'entier
$enc = [system.text.encoding]::Unicode
$enc.GetString($clearPWD_ByteArray)

Différentes Portées.

En fonction de la porté de protection on peut assurer un chiffrment pour une personne ou un ordinateur

  • CurrentUser : Les données protégées sont associées à l'utilisateur en cours. Seuls les threads exécutés dans le contexte utilisateur en cours peuvent ôter la protection des données
  • LocalMachine : Les données protégées sont associées au contexte de l'ordinateur. Tout processus qui s'exécute sur l'ordinateur peut ôter la protection des données. Cette valeur d'énumération est généralement utilisée dans les applications spécifiques au serveur qui s'exécutent sur un serveur où les utilisateurs non fiables n'ont pas accès.
Sur le principe de la poortée utilisateur si le système cible supporte l'EFS (Encrypted File System) il est assez simple de chiffrer un fichier.

Set-Content -Path c:\Temp\pass.txt -Value "le texte à Protéger" -Force

# Chiffrement du fichier (si EFS est supporté)
$file = Get-Item c:\Temp\pass.txt
$file.Encrypt()

Read-Host -Prompt "Vérifiez le fichier apparait en vert" 

# Il est lisible par l'utilisateur uniquement
Get-Content c:\Temp\pass.txt 

Read-Host -Prompt "Le chiffrement va être supprimé"

# Supprime le chiffrement
$file = Get-Item c:\Temp\pass.txt
$file.Decrypt()
Comments are closed on this post.