Administración de secretos en la plantilla de Resource Manager mediante la lectura en Azure Key Vault

Completado

La infraestructura como código (IaC) hace referencia a la descripción de los requisitos de la infraestructura, como archivos de texto legibles para el usuario. Las plantillas de Azure Resource Manager (ARM) son una forma de infraestructura como código.

Al igual que el código de la aplicación, puede administrar el código de la infraestructura en un sistema de control de versiones como Git. Esto le permite colaborar con otras personas y realizar un seguimiento de los cambios de los requisitos de la infraestructura a medida que evolucionan.

Al igual que sucede con el código de la aplicación, no conviene codificar de forma rígida información confidencial (como contraseñas y claves de API) en las plantillas de ARM. De lo contrario, cualquier persona que tenga acceso de lectura al repositorio podrá acceder también a esta información secreta.

Aunque solo las personas autorizadas de su organización deben tener acceso a información confidencial, las plantillas de ARM también requieren esta información. Azure Key Vault es una manera de ayudar a proteger la información confidencial.

Azure Key Vault ayuda a proteger la información confidencial

Azure Key Vault es un servicio en la nube que funciona como almacén de secretos seguro. Key Vault le permite crear múltiples contenedores seguros denominados almacenes. Estos almacenes están respaldados por módulos de seguridad de hardware (HSM). Los almacenes ayudan a reducir las posibilidades de que se produzca una pérdida accidental de información de seguridad centralizando el almacenamiento de los secretos de aplicación. Los almacenes también controlan y registran el acceso a todo lo que almacenan.

Key Vault es capaz de almacenar claves y secretos. Sus numerosas características lo convierten en una buena opción para administrar los secretos, pero también para su proceso de implementación.

  • Control de acceso basado en rol. Puede administrar su almacén de claves con varios roles para asegurarse de que se pueda usar con las aplicaciones, así como con diferentes niveles de administradores.

  • Permiso a usuarios y aplicaciones. El almacén de claves se puede configurar para que puedan acceder a él tanto usuarios específicos como las aplicaciones. En el caso de las aplicaciones, hay que crear una entidad de servicio. De hecho, puede configurar el almacén de claves para que solo puedan acceder a él entidades de servicio.

    Nota:

    Una entidad de servicio es una identidad creada para su uso con aplicaciones, servicios hospedados y herramientas automatizadas para acceder a los recursos de Azure. Se restringe el acceso a los recursos solo con la asignación a una entidad de seguridad de un rol o de un subconjunto de roles con derechos de acceso limitados. Este enfoque le proporciona un control más granular sobre el número de entidades que pueden acceder a los recursos.

  • Posibilidad de interactuar con una plantilla de ARM. Durante la implementación de una plantilla de ARM, puede leer desde un almacén de claves, pero para que esto funcione se requiere un poco de configuración. En la siguiente sección encontrará más detalles.

Configuración de permisos

Ha elegido Key Vault como un servicio donde almacenar sus credenciales. Quiere poder leer secretos desde ahí durante la implementación para que, por ejemplo, pueda establecer la contraseña de una máquina virtual.

Hay varios pasos de configuración que debe realizar para configurar Key Vault de modo que se pueda leer durante la implementación. Los pasos son:

  1. Habilitar Key Vault para la implementación. Es necesario permitir la lectura de Key Vault durante la implementación. Puede esta configuración durante la creación o modificándola más adelante.

  2. El usuario necesita el permiso de implementación en el grupo de recursos. Esto no varía con respecto a otras implementaciones. Sin embargo, si no ha creado el grupo de recursos, puede asignar un rol para asegurarse de que puede realizar la implementación en él.

  3. El usuario necesita un acceso adecuado al almacén de claves. Debe asegurarse de que tiene el acceso adecuado al almacén de claves cuando lo lea durante la implementación. Al crear un almacén de claves, se crea una directiva de acceso que otorga al usuario derechos para administrar todos los secretos, las claves y los certificados.

Configuración de Key Vault para la implementación

Configure su instancia de Key Vault para que se puedan leer las credenciales en él durante la implementación de una plantilla de ARM.

Para habilitar la instancia de Key Vault para la implementación, hay un valor que puede confirmar, ya sea durante la creación de la instancia de Key Vault o como un parámetro que pueda modificar en un momento posterior. En PowerShell, es un cambio denominado -EnabledForTemplateDeployment. En la CLI de Azure, es un argumento denominado --enabled-for-template-deployment que también necesita que se pase el valor true.

Nota:

Además, la CLI de Azure requiere que se pase un booleano con el valor true.

El usuario necesita el permiso de implementación en Key Vault y en el grupo de recursos

Antes de intentar implementar y leer secretos desde el almacén de claves, tiene que asegurarse de que dispone del permiso de implementación. Hay dos roles que otorgan este permiso:

  • Owner: si creó el almacén de claves, tendrá este rol automáticamente.
  • Contributor: este rol le concede acceso para administrar todos los secretos. Si no ha creado el almacén de claves, el método más sencillo es asignarse a sí mismo el rol Contributor.

Otra opción es crear y asignar un rol personalizado y asegurarse de que el rol contiene el permiso Microsoft.KeyVault/vaults/deploy/action.

Configuración del archivo de parámetros de implementación

En lugar de especificar cada parámetro y los valores correspondientes como pares clave-valor durante la implementación, puede usar un archivo de parámetros.

En este archivo de parámetros se especifica qué almacén de claves y qué secreto de ese almacén de claves le interesan. Para ello, hay que modificar un parámetro y, después, actualizar la plantilla de implementación para que use este parámetro.

Nota:

La plantilla no tiene ninguna noción de que exista un almacén de claves o su secreto. La configuración que está realizando tiene lugar en el archivo de parámetros.

Configuración de un almacén de claves y un secreto para un parámetro

En el archivo de parámetros, y en relación con un parámetro concreto, señale a un almacén de claves en el que tenga permiso de implementación. Luego, especifique el secreto que le interese. Señale el secreto por su nombre. Durante la implementación, esta configuración se resolverá en el valor del secreto. Aquí tenemos un parámetro denominado myPassword que se configura para usar un almacén de claves específico y que usa un secreto denominado databaseSecret.

"myPassword" : {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
      "secretName": "databaseSecret"
    }
  }
}

En el código JSON anterior, se especifica el identificador completo del almacén de claves y se solicita el secreto databaseSecret. A continuación, se extrae el valor de este secreto y se asigna al parámetro myPassword.

Asignación del parámetro a la contraseña del recurso

Este paso no guarda relación con el almacén de claves, sino que consiste en asegurarse de que el recurso previsto usa el parámetro configurado para leer el valor del secreto del almacén de claves. Este es un fragmento de código abreviado de una máquina virtual, en el archivo de plantilla, que muestra el elemento adminPassword que lee del parámetro myPassword. El valor del secreto se leerá desde el almacén de claves en el momento de la implementación, y se asignará al elemento adminPassword.

{
  "osProfile": {
    "adminPassword": "[parameters('myPassword')]"
  }
}