Partager via


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 :

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

  2. 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