Seguridad en Azure Pipelines con Azure Key Vault

Después de la actualización dl último post sobre llamar a la API de LCS desde Azure DevOps me di cuenta que crear una pipeline con una contraseña a la vista no era muy seguro. ¿Cómo podemos añadir un extra de seguridad a pipelines? Una vez más podemos acudir a una herramienta de Azure para ayudarnos, Azure Key Vault.

Azure Key Vault

Key Vault es un servicio que nos permite guardar certificados o secretos de forma segura y usarlos en nuestras apps o servicios. Y como muchos otros servicios de Azure tiene un coste pero es muy bajo y, para un uso normal, la factura será de 1 céntimo o ninguno al mes. ¡No seáis rancios con la seguridad!

Quizás ya conozcáis Azure Key Vault porque lo podemos usar en Microsoft Dynamics 365 for Finance and Operations en Administración del sistema. Por ejemplo es como guardamos el certificado que se usa para el SII en España o el NF-e brasileño para luego usarlos en las llamadas a los servicios web.

Asegurando tus Pipelines de Azure DevOps

Gracias a la task de Azure Key Vault (que es open source como muchas otras tasks) recuperar un secreto de un Key Vault no tiene secreto (badum tssss).

Crear el Key Vault

Ve a tu suscripción de Azure y busca Key vaults en la barra de búsqueda superior. Si no tienes una puedes obtener una gratuita con un crédito de 170€/200$ durante 30 días y probar esto y más cosas.

En la página del Key Vault haz clic en «Create key vault» y rellena los campos:

Puedes seguir con las otras pestañas pero no hace falta, con clicar en «Review & Create» tendremos el Key Vault listo.

Añadir la task a DevOps

Ahora vamos a Azure DevOps y creamos un pipeline nuevo o editamos uno que ya exista. Añadimos la tarea al agente y buscamos por azure key vault:

Es posible que tengáis que añadir la tarea del marketplace primero, si es así recordad que necesitaréis permisos a nivel de organización y no sólo del proyecto de AZDO en el que estáis. Ahora vamos a la tarea y seleccionamos la suscripción:

Una vez seleccionada hacemos clic en el botón «Authorize». Esto va a crear un service principal en vuestra suscripción, lo usaremos más adelante. Después de autorizar seleccionamos el key vault que hemos creado en el primer paso. Y ahora volvemos a Azure.

Configuración y creación de los secretos

Vamos al key vault, seleccionamos «Access policies» y hacemos clic en «Add Access Policy»:

Cuando autorizamos la task de DevOps para que accediera a nuestra suscripción, se creó un service principal que ahora tenemos que seleccionar para que pueda leer y usar los secretos en nuestro pipeline. Hacemos clic en «Select principal»:

Y en la barra de búsqueda ponemos el nombre de la suscripción, el principal debería empezar con ese nombre y terminar con el ID de la suscripción. Lo seleccionamos y hacemos clic en «Select»:

Ahora desplegamos el lookup de «Secret permissions» y en «Secret Management Operations» seleccionamos Get y List:

Si quisieramos usar también certificados o claves deberíamos hacer lo mismo. Finalmente hacemos clic en el botón «Add» y no os olvidéis de darle al «Save» o no se guardará nada!

Ahora ya podemos crear el secreto en el key vault. Vamos a «Secrets» y hacemos clic en «Generate/Import», completamos los campos y le damos a «Create» para guardar:

Usando los secretos en tus pipelines

Ya tenemos todo listo para usar el secreto en el pipeline. Voy a añadir una tarea de PowerShell para llamar a la API de DB de LCS usando d365fo.tools, pero cambiaré todas las variables por los secrets:

# Write your PowerShell commands here.

Install-PackageProvider nuget -Scope CurrentUser -Force -Confirm:$false



Install-Module -Name AZ -AllowClobber -Scope CurrentUser -Force -Confirm:$False -SkipPublisherCheck



Install-Module -Name d365fo.tools -AllowClobber -Scope CurrentUser -Force -Confirm:$false
   


Get-D365LcsApiToken -ClientId "$(myAppId)" -Username "$(myUserName)" -Password "$(mySecretPassword)" -LcsApiUri "https://lcsapi.lcs.dynamics.com" -Verbose | Set-D365LcsApiConfig -ProjectId $(myProjectId)
 


Get-D365LcsDatabaseBackups

Como véis incluso he puesto el AAD AppId en un secreto.

Lo que hace la task de Azure Key Vault es obtener los secretos de Azure y guardarlos en variables cuando se ejecuta el pipeline:

Así podemos acceder al valor con la notación $(variableName) en el script de PowerShell. Si intentas sacar el valor por pantalla usando el Write-Host todo lo que obtendrás son tres asteriscos. Si pudieramos ver el valor de los secretos de una forma tan fácil todo esto no tendría mucho sentido.

Si ahora comprobamos el resultado de ejecutar el comando Get-D365LcsDatabaseBackups veremos como de bien funciona:

Incluso ahora el valor del Id de proyecto no se muestra porque era uno de nuestros secretos!

Y así es como podemos añadir un poco de seguridad extra a nuestro Dev ALM!

Deja un comentario

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.