Búsqueda de sitios web

Desbloqueo de secretos de PowerShell


Así que he estado trabajando duro y tratando de hacer más con los módulos Secrets Management de Microsoft, ahora que ya no están en estado de prelanzamiento. Puede instalar los módulos Microsoft.PowerShell.SecretStore y Microsoft.PowerShell.SecretManagement (necesitará ambos) desde la Galería de PowerShell. Puede encontrar módulos de extensión que se basan en los módulos de Microsoft para trabajar con otros almacenes de claves o almacenes secretos. Ejecute find-module -tag secretmanagement para buscar módulos adicionales. Pero de lo que quiero hablar hoy se relaciona con los módulos de Microsoft. Sin embargo, podría aplicarse a usted con cualquiera de los módulos de extensión. El desafío es utilizar los módulos de administración de secretos con un script de perfil de PowerShell.

Variables definidas

En mi secuencia de comandos de perfil de PowerShell, llamo a una secuencia de comandos que define una serie de variables. Estos son elementos que uso a lo largo del día, a menudo junto con PSDefaultParameterValues. Cosas como claves API y tokens guardados. Solía almacenar estos valores en el archivo de secuencia de comandos, pero decidí mover estos elementos a un almacén secreto utilizando los módulos de administración de secretos de Microsoft. Modifiqué el script para configurar las variables obteniendo los valores de la tienda.

$foo = Get-Secret -name foo -vault Secrets -AsPlainText

Al iniciar una nueva sesión de PowerShell, esto funcionó. Hasta cierto punto. Iniciaría PowerShell y luego se me solicitaría la contraseña de la bóveda. Esto no es una carga tan grande, pero tiene implicaciones.

Programar trabajos

En mi escritorio, hay otras cosas que pueden iniciar PowerShell. Específicamente, elementos como ScheduledJobs. De forma predeterminada, cuando configura un trabajo programado, el trabajo inicia una nueva sesión de PowerShell que ejecutará los scripts de su perfil. Pero ahora hay un problema. Cuando se ejecuta un trabajo programado, el script del perfil solicitará una contraseña. Pero esto no sucede de forma interactiva, por lo que no puedo proporcionarlo.

Podría modificar el trabajo programado para no cargar el perfil. Pero eso supone mucho trabajo extra. Y tal vez algunos de mis trabajos programados necesitan el perfil. Necesito desbloquear mediante programación el almacén secreto para poder definir mis variables. Este es también el desafío al que se enfrenta al intentar integrar la gestión de secretos en cualquier tipo de proceso automatizado.

Separe la contraseña

Primero, permítanme señalar que mi enfoque no es la única solución, ni siquiera la mejor. Siempre que se trata de secretos o información confidencial, siempre existen riesgos, desafíos y compensaciones. En mi situación, la solución fue separar la contraseña de la bóveda de la bóveda. Con eso quiero decir que necesitaba otra forma de obtener la contraseña que no requiriera ninguna interacción.

Tomé la contraseña de la bóveda y la almacené en un mensaje CMS protegido usando Protect-CMSMessage. El documento sólo se puede leer en una computadora con las claves privadas de cifrado de documentos necesarias. Guardé el archivo en un archivo de texto usando el nombre de la computadora como parte del nombre del archivo.

$vPass = "C:\scripts\$($env:computername)-vault.txt"
$myVault = "Secrets"

Desbloqueando secretos

En el script de mi perfil, puedo cancelar la protección de la contraseña, convertirla nuevamente en una cadena segura y usarla para desbloquear la bóveda.

$q = Unprotect-CmsMessage -Path $vPass | ConvertTo-SecureString -AsPlainText -Force
Unlock-SecretStore -Password $q -PasswordTimeout 28800

Trabajo en casa y no tengo demasiadas preocupaciones de seguridad, por lo que también establezco el tiempo de espera de la contraseña en 8 horas, de modo que si necesito acceder a la bóveda más tarde ese mismo día, no necesito volver a ingresar la contraseña. Una vez que se desbloquea la falla, puedo usar Get-Secret para recuperar los valores y configurar mis variables. Debido a que mis nombres secretos son idénticos a las variables que uso, puedo recorrer una lista. Aquí está el fragmento de código completo.

$vPass = "C:\scripts\$($env:computername)-vault.txt"
$myVault = "Secrets"

if (Test-Path $vPass) {
    $q = Unprotect-CmsMessage -Path $vPass | ConvertTo-SecureString -AsPlainText -Force
    Unlock-SecretStore -Password $q -PasswordTimeout 28800

    $vars = "foo", "bar", "secret", "secret2", "apikey",  "gitkey","bitlykey"

    foreach ($var in $vars) {
         Set-Variable -Name $var -Value (Get-Secret -Name $var -Vault $myVault -AsPlainText) -Scope global
    }
    #secure string variables
    $bitly = Get-Secret -Name bitly -Vault $myVault
    $artd = Get-Secret -Name company -Vault $myVault
}

Este código se ejecuta como parte del script de mi perfil. También tengo algunos secretos que quiero que permanezcan como cadenas seguras.

Resumen

Con esta solución, puedo almacenar secretos en la bóveda de gestión de secretos y utilizarlos en mi perfil. Y el perfil también se puede utilizar con trabajos programados. Depende de usted encontrar el mejor método para almacenar y recuperar de forma segura la contraseña de la bóveda.

Puede obtener más información sobre el módulo de gestión de secretos visitando el repositorio del módulo.

Artículos relacionados