Uso de Azure Key Vault para pasar un secreto desde un almacén de claves como parámetro durante la implementación de Bicep
En lugar de escribir un valor seguro como una contraseña directamente en el archivo de Bicep o en el archivo de parámetros, puede recuperar el valor de una Azure Key Vault durante una implementación. Cuando un módulo espera un parámetro string
con el modificador secure:true
, puede usar la getSecret
función para obtener un secreto del almacén de claves. El valor nunca se expone debido a que solo hace referencia a su identificador de almacén de claves.
Importante
Este artículo se centra en cómo se pasa un valor confidencial como parámetro de plantilla. Cuando el secreto se pasa como parámetro, el almacén de claves puede existir en una suscripción diferente del grupo de recursos al que va a implementar.
En este artículo no se explica cómo establecer una propiedad de máquina virtual en la dirección URL de un certificado en un almacén de claves. Para obtener una plantilla de inicio rápido de ese escenario, consulte WinRM en una máquina virtual Windows.
Implementación de almacenes de claves y secretos
Para acceder a un almacén de claves durante la implementación de Bicep, establezca enabledForTemplateDeployment
en el almacén de claves en true
.
Si ya tiene un almacén de claves, asegúrese de que permite implementaciones de plantillas.
az keyvault update --name ExampleVault --enabled-for-template-deployment true
Para crear un nuevo almacén de claves y agregar un secreto, use:
az group create --name ExampleGroup --location centralus
az keyvault create \
--name ExampleVault \
--resource-group ExampleGroup \
--location centralus \
--enabled-for-template-deployment true
az keyvault secret set --vault-name ExampleVault --name "ExamplePassword" --value "hVFkk965BuUv"
Como propietario del almacén de claves, tiene acceso de forma automática a la creación de secretos. Si el usuario que trabaja con los secretos no es el propietario del almacén de claves, conceda acceso con:
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Para más información sobre cómo crear almacenes de claves y agregar secretos, vea:
- Establecimiento y recuperación de un secreto mediante la CLI
- Establecimiento y recuperación de un secreto mediante PowerShell
- Establecer y recuperar un secreto mediante Azure Portal
- Establecimiento y recuperación de un secreto mediante .NET
- Establecimiento y recuperación de un secreto mediante Node.js
Concesión de acceso a los secretos
El usuario que implementa el archivo de Bicep debe tener el permiso Microsoft.KeyVault/vaults/deploy/action
para el ámbito del grupo de recursos y el almacén de claves. Los roles Propietario y Colaborador conceden este acceso. Si creó el almacén de claves, es el propietario y tiene el permiso.
En el procedimiento siguiente se muestra cómo crear un rol con el permiso mínimo y cómo asignar el usuario.
Cree un archivo JSON personalizado con una definición de rol:
{ "Name": "Key Vault Bicep deployment operator", "IsCustom": true, "Description": "Lets you deploy a Bicep file with the access to the secrets in the Key Vault.", "Actions": [ "Microsoft.KeyVault/vaults/deploy/action" ], "NotActions": [], "DataActions": [], "NotDataActions": [], "AssignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" ] }
Reemplace "00000000-0000-0000-0000-000000000000" por el identificador de la suscripción.
Use el archivo JSON para crear el nuevo rol:
az role definition create --role-definition "<path-to-role-file>" az role assignment create \ --role "Key Vault Bicep deployment operator" \ --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \ --assignee <user-principal-name>
Los ejemplos asignan el rol personalizado al usuario en el nivel de grupo de recursos.
Al usar un almacén de claves con el archivo de Bicep en una aplicación administrada, debe conceder acceso a la entidad de servicio del proveedor de recursos del dispositivo. Para más información, consulte Acceso al secreto de Key Vault al implementar Azure Managed Applications.
Recuperar secretos en el archivo Bicep
Puede usar la getSecret
función en archivos de Bicep para obtener un secreto del almacén de claves. Tenga en cuenta que la función getSecret
se aplica exclusivamente a un recurso Microsoft.KeyVault/vaults
. Además, está restringido al uso dentro de la sección params
de un módulo y solo se puede usar con parámetros con el decorador @secure()
.
Otra función denominada función az.getSecret()
se puede usar en archivos de parámetros de Bicep para recuperar secretos del almacén de claves. Para obtener más información, consulte Recuperar secretos en el archivo de parámetros.
Dado que la función getSecret
solo se puede usar en la sección params
de un módulo, cree un archivo sql.bicep en el mismo directorio que el archivo main.bicep con el siguiente contenido:
param sqlServerName string
param location string = resourceGroup().location
param adminLogin string
@secure()
param adminPassword string
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
El parámetro adminPassword
tiene un decorador @secure()
en el archivo anterior.
El siguiente archivo de Bicep consume sql.bicep como módulo. El archivo Bicep hace referencia a un almacén de claves existente, llama a la función getSecret
para recuperar el secreto del almacén de claves y, a continuación, pasa el valor como parámetro al módulo:
param sqlServerName string
param adminLogin string
param subscriptionId string
param kvResourceGroup string
param kvName string
resource kv 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
name: kvName
scope: resourceGroup(subscriptionId, kvResourceGroup )
}
module sql './sql.bicep' = {
name: 'deploySQL'
params: {
sqlServerName: sqlServerName
adminLogin: adminLogin
adminPassword: kv.getSecret('vmAdminPassword')
}
}
Recuperar secretos en el archivo de parámetros
Si no desea usar un módulo, puede recuperar secretos del almacén de claves en un archivo de parámetros. Sin embargo, el enfoque varía en función de si usa un archivo de parámetros JSON o Bicep.
El siguiente archivo de Bicep implementa un servidor SQL que incluye una contraseña de administrador. Aunque el parámetro contraseña se establece en una cadena segura, Bicep no especifica el origen de ese valor:
param sqlServerName string
param location string = resourceGroup().location
param adminLogin string
@secure()
param adminPassword string
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
A continuación, cree un archivo de parámetros para el archivo Bicep anterior.
Archivo de parámetros de Bicep
La función az.getSecret
se puede usar en un archivo .bicepparam
para recuperar el valor de un secreto de un almacén de claves:
using './main.bicep'
param sqlServerName = '<your-server-name>'
param adminLogin = '<your-admin-login>'
param adminPassword = az.getSecret('<subscription-id>', '<rg-name>', '<key-vault-name>', '<secret-name>', '<secret-version>')
Archivo de parámetros JSON
En un archivo de parámetros JSON, especifique un parámetro que coincida con el nombre del parámetro en el archivo de Bicep. Para el valor del parámetro, haga referencia al secreto del almacén de claves; Para ello, pase el identificador de recursos del almacén de claves y el nombre del secreto. En el siguiente archivo de parámetros, el secreto del almacén de claves ya debe existir y se proporciona un valor estático para su identificador de recurso:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminLogin": {
"value": "<your-admin-login>"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>"
},
"secretName": "ExamplePassword"
}
},
"sqlServerName": {
"value": "<your-server-name>"
}
}
}
Si necesita usar una versión del secreto distinto del actual, incluya una propiedad secretVersion
:
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Pasos siguientes
- Para obtener información general sobre los almacenes de claves, consulte Acerca de Azure Key Vault
- Para obtener ejemplos completos de GitHub sobre cómo hacer referencia a secretos del almacén de claves, consulte keyvaultexamples.
- Para ver un módulo de Learn que describe cómo usar un almacén de claves para pasar un valor seguro, consulte Administración de implementaciones complejas en la nube mediante características avanzadas de plantilla de ARM JSON.