PowerShell
Manejo de secretos y credenciales
Buscar..
Introducción
En Powershell, para evitar almacenar la contraseña en texto claro , utilizamos diferentes métodos de cifrado y la almacenamos como una cadena segura. Cuando no esté especificando una clave o una clave segura, esto solo funcionará para el mismo usuario que en la misma computadora podrá descifrar la cadena cifrada si no está usando Claves / Claves de seguridad. Cualquier proceso que se ejecute bajo esa misma cuenta de usuario podrá descifrar esa cadena cifrada en esa misma máquina.
Solicitando Credenciales
Para solicitar credenciales, casi siempre debe usar el cmdlet Get-Credential
:
$credential = Get-Credential
Nombre de usuario rellenado previamente:
$credential = Get-Credential -UserName 'myUser'
Agregue un mensaje de solicitud personalizado:
$credential = Get-Credential -Message 'Please enter your company email address and password.'
Acceso a la contraseña de texto sin formato
La contraseña en un objeto de credencial es un [SecureString]
cifrado. La forma más sencilla es obtener un [NetworkCredential]
que no almacena la contraseña cifrada:
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
El método auxiliar ( .GetNetworkCredential()
) solo existe en los objetos [PSCredential]
.
Para tratar directamente con un [SecureString]
, use los métodos .NET:
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
Trabajar con credenciales almacenadas
Para almacenar y recuperar credenciales cifradas fácilmente, use la serialización XML incorporada de PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Para volver a importar:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
Lo importante a recordar es que, de forma predeterminada, utiliza la API de protección de datos de Windows, y la clave utilizada para cifrar la contraseña es específica tanto para el usuario como para la máquina en la que se ejecuta el código.
Como resultado, la credencial cifrada no puede ser importada por un usuario diferente ni por el mismo usuario en una computadora diferente.
Al encriptar varias versiones de la misma credencial con diferentes usuarios en ejecución y en diferentes computadoras, puede tener el mismo secreto disponible para múltiples usuarios.
Al poner el nombre del usuario y la computadora en el nombre del archivo, puede almacenar todos los secretos encriptados de una manera que permita que el mismo código los use sin codificar nada:
Encriptador
# run as each user, and on each computer
$credential = Get-Credential
$credential | Export-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
El código que utiliza las credenciales almacenadas:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
La versión correcta del archivo para el usuario en ejecución se cargará automáticamente (o fallará porque el archivo no existe).
Almacenar las credenciales en forma cifrada y pasarlas como parámetro cuando sea necesario
$username = "[email protected]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.
## Import Password with AES
$username = "[email protected]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever you want.