Utiliser Azure Key Vault pour passer un secret à partir d’un coffre de clés en tant que paramètre lors du déploiement de Bicep
Au lieu d’entrer une valeur sécurisée, telle qu’un mot de passe, directement dans votre fichier Bicep ou votre fichier de paramètres, vous pouvez récupérer la valeur à partir d’un coffre Azure Key Vault pendant un déploiement. Lorsqu’un module attend un paramètre string
avec un modificateur secure:true
, vous pouvez utiliser la fonction getSecret
pour obtenir un secret de coffre de clés. La valeur n’est jamais exposée, car vous référencez uniquement son ID de coffre de clés.
Important
Cet article est consacré à la transmission d’une valeur sensible comme paramètre de modèle. Quand le secret est transmis comme paramètre, le coffre de clés peut exister dans un autre abonnement que le groupe de ressources sur lequel vous effectuez le déploiement.
Cet article n’explique pas comment définir une propriété de machine virtuelle sur l’URL d’un certificat dans un coffre de clés. Pour obtenir un modèle de démarrage rapide de ce scénario, consultez WinRM sur une machine virtuelle Windows.
Déployer des coffres de clés et des secrets
Pour accéder à un coffre de clés lors d’un déploiement Bicep, définissez enabledForTemplateDeployment
sur true
dans le coffre de clés.
Si vous disposez déjà d’un coffre de clés, vérifiez qu’il autorise les déploiements de modèles.
az keyvault update --name ExampleVault --enabled-for-template-deployment true
Pour créer un coffre Key Vault et ajouter un secret, utilisez :
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"
En tant que propriétaire du coffre de clés, vous avez automatiquement accès à la création de secrets. Si l’utilisateur qui utilise les secrets n’est pas le propriétaire du coffre de clés, octroyez l’accès avec :
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Pour plus d’informations sur la création de coffres de clés et l’ajout des secrets, consultez :
- Définir et récupérer un secret à l'aide de l'interface de ligne de commande (CLI)
- Définir et récupérer un secret à l’aide de PowerShell
- Définir et récupérer un secret à l'aide du portail Azure
- Définir et récupérer un secret à l'aide de .NET
- Définir et récupérer un secret à l'aide de Node.js
Accorder l'accès aux secrets
L’utilisateur qui déploie le fichier Bicep doit disposer de l’autorisation Microsoft.KeyVault/vaults/deploy/action
pour l’étendue du groupe de ressources et du coffre de clés. Les rôles propriétaire et contributeur accordent cet accès. Si vous avez créé le coffre de clés, vous êtes le propriétaire et vous avez donc l’autorisation.
La procédure suivante montre comment créer un rôle avec les permissions minimales et comment affecter l’utilisateur.
Créez un fichier JSON personnalisé avec une définition de rôle :
{ "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" ] }
Remplacez « 00000000-0000-0000-0000-000000000000 » par l’ID d’abonnement.
Utilisez le fichier JSON pour créer le nouveau rôle :
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>
L’exemple attribue le rôle personnalisé à l’utilisateur au niveau du groupe de ressources.
Quand vous utilisez un coffre de clés avec le fichier Bicep pour une Application managée, vous devez accorder l’accès au principal de service du fournisseur de ressources d’appliance. Pour plus d’informations, consultez Accéder au secret de coffre de clés pendant le déploiement d’applications managées Azure.
Récupérer des secrets dans un fichier Bicep
Vous pouvez utiliser la fonction getSecret
dans des fichiers Bicep pour obtenir un secret de coffre de clés. Notez que la fonction getSecret
est exclusivement applicable à une ressource Microsoft.KeyVault/vaults
. En outre, son utilisation est restreinte à la section params
d’un module et peut uniquement être utilisée avec des paramètres avec l’élément décoratif @secure()
.
Une autre fonction appelée fonction az.getSecret()
peut être utilisée dans des fichiers de paramètres Bicep pour récupérer des secrets de coffre de clés. Pour obtenir plus d’informations, consultez Récupérer des secrets dans un fichier de paramètres.
Étant donné que la fonction getSecret
ne peut être utilisée que dans la section params
d’un module, créez un fichier sql.bicep dans le même répertoire que le fichier main.bicep avec le contenu suivant :
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'
}
}
Le paramètre adminPassword
a un élément décoratif @secure()
dans le fichier précédent.
Le fichier Bicep suivant consomme sql.bicep en tant que module. Le fichier Bicep référence un coffre de clés existant, appelle la fonction getSecret
pour récupérer le secret du coffre de clés, puis passe la valeur en tant que paramètre au module :
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')
}
}
Récupérer des secrets dans un fichier de paramètres
Si vous ne souhaitez pas utiliser un module, vous pouvez récupérer des secrets de coffre de clés dans un fichier de paramètres. Cependant, l’approche varie selon que vous utilisez un fichier de paramètres Bicep ou JSON.
Le modèle fichier Bicep déploie un serveur SQL qui comprend un mot de passe administrateur. Alors que le paramètre de mot de passe est défini sur une chaîne sécurisée, Bicep ne spécifie pas l’origine de cette valeur :
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'
}
}
Ensuite, créez un fichier de paramètres pour le fichier Bicep précédent.
Fichier de paramètres Bicep
La fonction az.getSecret
peut être utilisée dans un fichier .bicepparam
pour récupérer la valeur d’un secret à partir d’un coffre de clés :
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>')
Fichier de paramètres JSON
Dans un fichier de paramètres JSON, spécifiez un paramètre qui correspond au nom du paramètre dans le fichier Bicep. Pour la valeur du paramètre, référencez le secret du coffre de clés ; pour ce faire, transmettez l’identificateur de ressource du coffre de clés et le nom du secret. Dans le fichier de paramètres suivant, le secret du coffre de clés doit déjà exister, et vous définissez une valeur statique pour son ID de ressource :
{
"$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 vous devez utiliser une version du secret autre que la version actuelle, incluez une propriété secretVersion
:
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Étapes suivantes
- Pour obtenir des informations générales sur les coffres de clés, consultez À propos d’Azure Key Vault.
- Pour obtenir des exemples GitHub complets illustrant comment référencer des secrets de coffre de clés, consultez keyvaultexamples.
- Pour suivre un module Learn qui explique comment utiliser un coffre de clés pour transmettre une valeur sécurisée, consultez Gérer des déploiements cloud complexes à l’aide des fonctionnalités avancées JSON de modèle ARM.