Share via


Använda Azure Key Vault för att skicka säkert parametervärde under Bicep-distributionen

I stället för att placera ett säkert värde (som ett lösenord) direkt i Bicep-filen eller parameterfilen kan du hämta värdet från ett Azure Key Vault under en distribution. När en modul förväntar sig en string parameter med secure:true modifierare kan du använda funktionen getSecret för att hämta en nyckelvalvshemlighet. Värdet exponeras aldrig eftersom du bara refererar till dess nyckelvalvs-ID.

Viktigt!

Den här artikeln fokuserar på hur du skickar ett känsligt värde som en mallparameter. När hemligheten skickas som en parameter kan nyckelvalvet finnas i en annan prenumeration än den resursgrupp som du distribuerar till.

Den här artikeln beskriver inte hur du anger en virtuell datoregenskap till ett certifikats URL i ett nyckelvalv. En snabbstartsmall för det scenariot finns i Installera ett certifikat från Azure Key Vault på en virtuell dator.

Distribuera nyckelvalv och hemligheter

Om du vill komma åt ett nyckelvalv under Bicep-distributionen anger du enabledForTemplateDeployment nyckelvalvet till true.

Om du redan har ett nyckelvalv kontrollerar du att det tillåter malldistributioner.

az keyvault update  --name ExampleVault --enabled-for-template-deployment true

Om du vill skapa ett nytt nyckelvalv och lägga till en hemlighet använder du:

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"

Som ägare till nyckelvalvet har du automatiskt åtkomst till att skapa hemligheter. Om användaren som arbetar med hemligheter inte är ägare till nyckelvalvet beviljar du åtkomst med:

az keyvault set-policy \
  --upn <user-principal-name> \
  --name ExampleVault \
  --secret-permissions set delete get list

Mer information om hur du skapar nyckelvalv och lägger till hemligheter finns i:

Bevilja åtkomst till hemligheterna

Den användare som distribuerar Bicep-filen måste ha Microsoft.KeyVault/vaults/deploy/action behörighet för resursgruppens och nyckelvalvets omfång. Rollerna Ägare och Deltagare beviljar båda den här åtkomsten. Om du har skapat nyckelvalvet är du ägare och har behörigheten.

Följande procedur visar hur du skapar en roll med minsta behörighet och hur du tilldelar användaren.

  1. Skapa en JSON-fil för anpassad rolldefinition:

    {
      "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/00000000-0000-0000-0000-000000000000"
      ]
    }
    

    Ersätt "00000000-0000-0000-0000-0000000000000" med prenumerations-ID:t.

  2. Skapa den nya rollen med JSON-filen:

    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>
    

    Exemplen tilldelar den anpassade rollen till användaren på resursgruppsnivå.

När du använder ett nyckelvalv med Bicep-filen för ett hanterat program måste du bevilja åtkomst till tjänstens huvudnamn för apparatresursprovidern . Mer information finns i Access Key Vault secret when deploying Azure Managed Applications (Åtkomst till Key Vault-hemlighet när du distribuerar Azure Managed Applications).

Hämta hemligheter i Bicep-filen

Du kan använda funktionen getSecret i Bicep-filer för att hämta en nyckelvalvshemlighet. Observera att getSecret funktionen endast gäller för en Microsoft.KeyVault/vaults resurs. Dessutom är den begränsad till användning i params avsnittet i en modul och kan endast användas med parametrar med dekoratören @secure() .

En annan funktion som kallas az.getSecret() funktion kan användas i Bicep-parameterfiler för att hämta key vault-hemligheter. Mer information finns i Hämta hemligheter i parameterfilen.

getSecret Eftersom funktionen bara kan användas i avsnittet i params en modul. Nu ska vi skapa en sql.bicep i samma katalog som filen main.bicep med följande innehåll:

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'
  }
}

Observera att parametern adminPassword i föregående Bicep-fil har en @secure() dekoratör.

Följande Bicep-fil använder sql.bicep som en modul. Bicep-filen refererar till ett befintligt nyckelvalv och anropar getSecret funktionen för att hämta nyckelvalvshemligheten och skickar sedan värdet som en parameter till modulen.

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')
  }
}

Hämta hemligheter i parameterfilen

Om du inte vill använda en modul kan du hämta key vault-hemligheter i parameterfilen. Metoden varierar dock beroende på om du använder en JSON-parameterfil eller en Bicep-parameterfil.

Följande Bicep-fil distribuerar en SQL-server som innehåller ett administratörslösenord. Lösenordsparametern är inställd på en säker sträng. Men Bicep anger inte var värdet kommer ifrån.

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'
  }
}

Skapa nu en parameterfil för föregående Bicep-fil.

Bicep-parameterfil

az.getSecret -funktionen kan användas i en .bicepparam fil för att hämta värdet för en hemlighet från ett nyckelvalv.

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>')

JSON-parameterfil

I JSON-parameterfilen anger du en parameter som matchar namnet på parametern i Bicep-filen. För parametervärdet refererar du till hemligheten från nyckelvalvet. Du refererar till hemligheten genom att skicka resursidentifieraren för nyckelvalvet och namnet på hemligheten:

I följande parameterfil måste nyckelvalvshemligheten redan finnas och du anger ett statiskt värde för dess resurs-ID.

{
  "$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>"
    }
  }
}

Om du behöver använda en annan version av hemligheten än den aktuella versionen ska du secretVersion inkludera egenskapen.

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

Nästa steg