Delen via


Azure Key Vault gebruiken om een veilige parameterwaarde door te geven tijdens de Bicep-implementatie

In plaats van een veilige waarde (zoals een wachtwoord) rechtstreeks in uw Bicep-bestand of parameterbestand te plaatsen, kunt u de waarde ophalen uit een Azure Key Vault tijdens een implementatie. Wanneer een module een string parameter met secure:true modifier verwacht, kunt u de functie getSecret gebruiken om een sleutelkluisgeheim te verkrijgen. De waarde zelf wordt nooit getoond, omdat u alleen verwijst naar de sleutelkluis-id.

Belangrijk

In dit artikel wordt uitgelegd hoe u een gevoelige waarde als sjabloonparameter doorgeeft. Wanneer het geheim wordt doorgegeven als parameter, kan de sleutelkluis bestaan in een ander abonnement dan de resourcegroep waarin u implementeert.

In dit artikel wordt niet beschreven hoe u een eigenschap van een virtuele machine instelt op de URL van een certificaat in een sleutelkluis. Zie Een certificaat van Azure Key Vault installeren op een virtuele machine voor een quickstartsjabloon van dat scenario.

Sleutelkluizen en geheimen implementeren

Als u tijdens de implementatie van Bicep toegang wilt krijgen tot een sleutelkluis, stelt u enabledForTemplateDeployment deze in op de sleutelkluis.true

Als u al een sleutelkluis hebt, moet u ervoor zorgen dat sjabloonimplementaties zijn toegestaan.

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

Als u een nieuwe sleutelkluis wilt maken en een geheim wilt toevoegen, gebruikt u:

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"

Als eigenaar van de sleutelkluis hebt u automatisch toegang tot het maken van geheimen. Als de gebruiker die met geheimen werkt niet de eigenaar van de sleutelkluis is, verleent u toegang met:

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

Zie voor meer informatie over het maken van sleutelkluizen en het toevoegen van geheimen:

Toegang verlenen tot de geheimen

De gebruiker die het Bicep-bestand implementeert, moet de Microsoft.KeyVault/vaults/deploy/action machtiging hebben voor het bereik van de resourcegroep en sleutelkluis. De rollen Eigenaar en Inzender verlenen beide deze toegang. Als u de sleutelkluis hebt gemaakt, bent u de eigenaar en hebt u de machtiging.

In de volgende procedure ziet u hoe u een rol maakt met de minimale machtiging en hoe u de gebruiker toewijst.

  1. Een JSON-bestand voor een aangepaste roldefinitie maken:

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

    Vervang '00000000-0000-0000-00000-000000000000' door de abonnements-id.

  2. Maak de nieuwe rol met behulp van het JSON-bestand:

    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>
    

    De voorbeelden wijzen de aangepaste rol toe aan de gebruiker op het niveau van de resourcegroep.

Wanneer u een sleutelkluis gebruikt met het Bicep-bestand voor een beheerde toepassing, moet u toegang verlenen tot de service-principal van de resourceprovider van het apparaat. Zie Toegangssleutelkluisgeheim bij het implementeren van Azure Managed Applications voor meer informatie.

Geheimen ophalen in Bicep-bestand

U kunt de functie getSecret in Bicep-bestanden gebruiken om een sleutelkluisgeheim te verkrijgen. Houd er rekening mee dat de getSecret functie uitsluitend van toepassing is op een Microsoft.KeyVault/vaults resource. Daarnaast is het beperkt tot gebruik binnen de params sectie van een module en kan deze alleen worden gebruikt met parameters met de @secure() decorator.

Een andere functie die functie wordt aangeroepen az.getSecret() , kan worden gebruikt in Bicep-parameterbestanden om sleutelkluisgeheimen op te halen. Zie Geheimen ophalen in het parameterbestand voor meer informatie.

Omdat de getSecret functie alleen kan worden gebruikt in de params sectie van een module. We gaan een sql.bicep maken in dezelfde map als het main.bicep-bestand met de volgende inhoud:

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

Zoals u ziet in het voorgaande Bicep-bestand, heeft de adminPassword parameter een @secure() decorator.

Het volgende Bicep-bestand gebruikt de sql.bicep als een module. Het Bicep-bestand verwijst naar een bestaande sleutelkluis en roept de getSecret functie aan om het sleutelkluisgeheim op te halen en geeft vervolgens de waarde als parameter door aan de 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')
  }
}

Geheimen ophalen in parametersbestand

Als u geen module wilt gebruiken, kunt u sleutelkluisgeheimen ophalen in het parameterbestand. De benadering varieert echter, afhankelijk van of u een JSON-parameterbestand of een Bicep-parameterbestand gebruikt.

Met het volgende Bicep-bestand wordt een SQL-server geïmplementeerd die een beheerderswachtwoord bevat. De wachtwoordparameter is ingesteld op een beveiligde tekenreeks. Maar de Bicep geeft niet op waar die waarde vandaan komt.

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

Maak nu een parameterbestand voor het voorgaande Bicep-bestand.

Bicep-parameterbestand

az.getSecret functie kan worden gebruikt in een .bicepparam bestand om de waarde van een geheim op te halen uit een sleutelkluis.

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

Geef in het JSON-parameterbestand een parameter op die overeenkomt met de naam van de parameter in het Bicep-bestand. Voor de parameterwaarde verwijst u naar het geheim uit de sleutelkluis. U verwijst naar het geheim door de resource-id van de sleutelkluis en de naam van het geheim door te geven:

In het volgende parameterbestand moet het sleutelkluisgeheim al bestaan en geeft u een statische waarde op voor de resource-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>"
    }
  }
}

Als u een andere versie van het geheim dan de huidige versie wilt gebruiken, neemt u de secretVersion eigenschap op.

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

Volgende stappen