Gestión de contraseñas en PowerShell con SecureString

Como programador de scripts de PowerShell, en multitud de ocasiones necesitarás gestionar contraseñas para realizar una operación. En esta entrada te explico con 4 ejemplos cómo manejar variables encriptadas con PowerShell y establecer un sesión remota con ellas.

Recuerda que puedes encontrar todo el código usado en las entradas de PowerShell en el enlace al repositorio de GitHub para que puedas descargarlo.

ESCENARIO

Queremos conectarnos en remoto a un host con PowerShell y necesitamos hacer uso de una sesión donde se utilizarán contraseñas.

EJEMPLO 1: Leer un string por teclado y convertirlo en seguro

Para leer por teclado una contraseña y convertirla en segura deberemos de hacer uso de Read-Host para leer cadenas de caracteres y ConvertFrom-SecureString para transformar el texto claro en una cadena segura.

$Pass = Read-Host -AsSecureString "Introduce la contraseña" | ConvertFrom-SecureString 
EJEMPLO 2: Guardar, leer y desencriptar la contraseña en un archivo de texto

Con el mismo procedimiento de antes se puede añadir Out-File para guardar el string seguro a un fichero de texto.

Read-Host -AsSecureString "Introduce la contraseña" | ConvertFrom-SecureString | Out-File $TestFile

Para recuperar la cadena que hemos guardado antes utilizamos Get-Content de la siguiente forma:

$Pass = Get-Content $TestFile | ConvertTo-SecureString

Y si ahora queremos trabajar con el texto plano desde esa cadena de caracteres segura, se puede utilizar el siguiente comando:

[System.Net.NetworkCredential]::new("", $Pass).Password
EJEMPLO 3: Guardar en UNA VARIABLE y desencriptar la contraseña desde código

Se puede trabajar desde código con contraseñas, pasando el texto plano a un string seguro de la forma que te muestro a contnuación.

$Pass = ConvertTo-SecureString -String "lacontraseñainsegura" -AsPlainText -Force

NOTA: No te recomiendo esta forma de trabajar con variables que requieren seguridad. Ya que estás comprometiendo la contraseña al dejarla en texto claro en el código. Hay que evitar esto siempre que se pueda.

EJEMPLO 4: Establecer una sesión con EL USUARIO y la contraseña

Finalmente, para establecer la sesión contra otro host juntamos el usuario y la contraseña en una variable a la que llamo $Credential para después crear la sesión y trabajar con el otro host.

$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $TestUser, $Pass
$Session = New-PSSession -ComputerName $TestComputer -Credential $Credential