Använda Azure Key Vault för att skicka en hemlighet från ett nyckelvalv som en parameter under Bicep-distributionen
I stället för att ange 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 en secure:true
modifierare kan du använda getSecret
funktionen 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 WinRM på en virtuell Windows-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 Azure Portal
- 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 anpassad JSON-fil med en 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.
USe JSON-filen för att skapa den nya rollen:
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 getSecret
funktionen 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 skapar du en sql.bicep-fil 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'
}
}
Parametern adminPassword
har en @secure()
dekoratör i föregående fil.
Följande Bicep-fil använder sql.bicep som en modul. Bicep-filen refererar till ett befintligt nyckelvalv, anropar getSecret
funktionen för att hämta nyckelvalvets hemlighet 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 en parameterfil. Metoden varierar dock beroende på om du använder en JSON- eller Bicep-parameterfil.
Följande Bicep-fil distribuerar en SQL-server som innehåller ett administratörslösenord. Även om lösenordsparametern är inställd på en säker sträng anger Bicep inte värdets ursprung:
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 sedan en parameterfil för föregående Bicep-fil.
Bicep-parameterfil
Funktionen az.getSecret
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 en JSON-parameterfil anger du en parameter som matchar namnet på parametern i Bicep-filen. För parametervärdet refererar du till hemligheten från nyckelvalvet. du gör detta 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 ska du inkludera en secretVersion
egenskap:
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Nästa steg
- Allmän information om nyckelvalv finns i Om Azure Key Vault
- Fullständiga GitHub-exempel på hur du refererar till key vault-hemligheter finns i keyvaultexamples.
- En Learn-modul som beskriver hur du använder ett nyckelvalv för att skicka ett säkert värde finns i Hantera komplexa molndistributioner med hjälp av avancerade JSON ARM-mallfunktioner.