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:
- Ange och hämta en hemlighet med hjälp av CLI
- Ange och hämta en hemlighet med hjälp av PowerShell
- Ange och hämta en hemlighet med hjälp av portalen
- Ange och hämta en hemlighet med hjälp av .NET
- Ange och hämta en hemlighet med hjälp av Node.js
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.
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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" ] }
Ersätt "00000000-0000-0000-0000-0000000000000" med prenumerations-ID:t.
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
- Allmän information om nyckelvalv finns i Vad är Azure Key Vault?
- Fullständiga exempel på att referera till nyckelhemligheter finns i key vault-exempel på GitHub.
- En Learn-modul som beskriver hur du skickar ett säkert värde från ett nyckelvalv finns i Hantera komplexa molndistributioner med hjälp av avancerade ARM-mallfunktioner.