Encriptar password en PowerShell

En este post vamos a ver uno de los procedimientos que podemos usar para guardar passwords en ficheros encriptados que posteriormente usaremos para nuestros scripts.

¿Cuantos scripts nos hemos encontrado con los password en texto plano dentro de los mismos?

Obviamente esto no es seguro. Vamos a ver una forma sencilla de evitar esto.

Con las siguientes lineas de código generaremos los ficheros necesarios para su posterior uso.

$KeyFile = "D:\just2kloud.vmware"

#Generamos la clave de encriptación y la volcamos al keyfile
$Key = New-Object Byte[] 32 [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Key)
$Key | out-file $KeyFile

#Creamos el fichero de password y lo encriptamos con nuestro keyfile
$PasswordFile = "D:\just2kloud.vcenter"
$Key = Get-Content $KeyFile
$Password = "Password_del_usuario" | ConvertTo-SecureString -AsPlainText -Force
$Password | ConvertFrom-SecureString -key $Key | Out-File $PasswordFile

Con esto ya tenemos generado el fichero key «just2kloud.vmware» y el fichero de password «just2kloud.vcenter» encriptado en base a nuestra key. Una vez generados no es necesario volver a hacerlo al menos que cambiemos el password del usuario.

Vemos ahora un ejemplo de uso de estos dos ficheros, en el que simplemente conectaremos contra nuestro vCenter.

#Definimos vCenter
$VCENTER="vcenter.just2kloud.com"
#Definimos el usuario de conexión a vCenter
$vCenterUser = "just2kloud@just2kloud.local"

#Definimos la ubicación del password file generado
$PasswordFile = "D:\just2kloud.vcenter"

#Definimos la ubicación del key file generado y leemos el contenido
$KeyFile = "D:\just2kloud.vmware"
$Key = Get-Content $KeyFile

#Creamos un fichero de credenciales con toda la info anterior
$Credential =New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $vCenterUser, (Get-Content $PasswordFile | ConvertTo-SecureString -Key $Key)

#Conectamos a vCenter con el fichero de credenciales generado
Connect-VIServer -server $VCENTER -Credential $Credential -WarningAction Ignore | out-null

#Resto de codigo del script
#Desconectar de vCenter as usual

Y con esto ya no necesitamos usar nuestro password en texto plano de forma insegura.

Para hacerlo aun mas seguro, deberíamos estudiar donde ubicamos nuestros ficheros key y password, a poder ser separados y en un share securizado por ejemplo, esto lo dejo para cada caso concreto de uso.

Ahora vamos a ver como crear una función de PowerShell, de manera que no tengamos que reutilizar tanto código en todos nuestros scripts, en nuestro caso siempre usamos el usuario «just2kloud@just2kloud.local» para lanzar los scripts, pero se podría hacer que la función acepte la entrada del parámetro «$user».

#Función que lee los ficheros encriptados de password y devuelve unas credenciales de conexión

function Get-CredentialsToConnect () {
    $user = "just2kloud@just2kloud.local"
    $password_file = "D:\just2kloud.vcenter"
    $key_file = "D:\just2kloud.vmware"
    $key = Get-Content $key_file
    $credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,(Get-content $password_file | ConvertTo-SecureString -key $key)
    return $credentials
}

Esta función la podemos guardar dentro de un modulo de PowerShell y hacer que ese modulo se cargue en nuestro profile de PowerShell, de manera que podamos usarla sin reescribir código en cada script, para conectar a vCenter una vez el modulo se carga automáticamente en PowerShell se haría por ejemplo así.

$Credential = Get-CredentialsToConnect
Connect-VIServer -server vcenter.just2kloud.com -Credential $Credential -WarningAction Ignore | out-null

Comparte si te gusta 🙂

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.