Partager via


Utiliser Azure Key Vault pour passer une valeur de paramètre sécurisée pendant le déploiement de Bicep

Au lieu de placer 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 ne traite pas de la définition d’une propriété de machine virtuelle sur l’URL d’un certificat dans un coffre de clés. Vous trouverez un modèle de démarrage rapide de ce scénario dans Installer un certificat à partir d’Azure Key Vault sur une machine virtuelle.

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 Key Vault, 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 :

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.

  1. Créez un fichier JSON de définition de rôle personnalisé :

    {
      "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.

  2. Créez le nouveau rôle à l’aide du fichier JSON :

    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.

Car vous ne pouvez utiliser la fonction getSecret que dans la section params d’un module. Nous allons créer un 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'
  }
}

Notez dans le fichier Bicep précédent, le paramètre adminPassword a un élément décoratif @secure().

Le fichier Bicep suivant consomme le 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 en fonction de votre utilisation d’un fichier de paramètres JSON ou d’un fichier de paramètres Bicep.

Le modèle fichier Bicep déploie un serveur SQL qui comprend un mot de passe administrateur. Le paramètre du mot de passe est défini sur une chaîne sécurisée. Toutefois, le fichier Bicep ne spécifie pas d’où vient 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'
  }
}

À présent, créez un fichier de paramètres pour le fichier Bicep.

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 le 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. Vous référencez le secret en transmettant 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, utilisez la propriété secretVersion.

"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"

Étapes suivantes