viernes, 23 de septiembre de 2016

Como utilizar las credenciales de forma segura en PowerShell

Powershell requiere en algunos de sus comandos el uso de las credenciales de usuario, para poder utilizarlas en llamadas a otros servicios (como por ejemplo al usar "Send-MailMessage").

Inicialmente, podemos crear una variable que contenga estas credenciales, y luego utilizarla a nuestro antojo. Una forma común de hacerlo sería con un script del tipo:

$userName = Get-ADUser "myUserLoginName" -Properties name | Select-Object -ExpandProperty Name
$password = "myPassword"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $userName, $secstr


Sin embargo, esta práctica no es muy recomendable, pues estamos añadiendo en nuestros scripts el password de nuestro usuario en claro, y cualquiera que abra nuestro fichero de scripts podría verlo y copiarlo sin problemas.

Para evitar esto, siempre es importante exportar nuestras credenciales cifradas en un fichero XML externo, y recuperarlas cuando sea necesario, sin necesidad de mostrar el password en ninguna de nuestras líneas.

Lo primero que haríamos sería generar ese fichero .XML en una ruta específica de nuestro servidor. Para ello ejecutaremos las siguientes líneas en nuestro PowerShell (evidentemente, directo en la consola, para no meter el password en ningún script)

$credPath = "C:\URLdeNuestraCarpetaEnElServer\myUser.xml"
$userName = Get-ADUser "myUserLoginName" -Properties name | Select-Object -ExpandProperty Name
$password = "myPassword"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $userName, $secstr | Export-Clixml $credPath


Tras ello, podremos verificar que el fichero "myUser.xml" se ha creado correctamente en la ruta indicada. Si tratamos de abrirlo, comprobaremos que el password está completamente encriptado, así que ya nadie podrá descifrarlo aunque tuviera acceso al fichero.

Ahora, en nuestros scripts de PowerShell, siempre que tengamos que utilizar esta credencial, podemos obtenerla de forma directa y sencilla con la siguiente línea:

$cred = Import-Clixml $credPath 

Podemos crear tantas credenciales de diversos usuarios como queramos, e invocarlas de la misma forma (modificando la ruta de acceso en cada caso).

Y.. ¡¡Esto es todo!! Siempre nos ahorraremos dolores de cabeza si, cuando implementamos algo en nuestra granja, lo hacemos utilizando las buenas prácticas que vamos aprendiendo a lo largo de nuestro camino.

Como siempre, espero que a alguien le sirva de ayuda.

¡¡Un saludo!!

No hay comentarios: