Azure Key Vault gebruiken om een geheim als parameter door te geven tijdens de bicep-implementatie
In dit artikel wordt uitgelegd hoe u Azure Key Vault gebruikt om een geheim door te geven als parameter tijdens de bicep-implementatie. In plaats van een veilige waarde, zoals een wachtwoord, rechtstreeks in uw Bicep-bestand of parameterbestand in te voeren, kunt u de waarde ophalen uit Azure Key Vault tijdens een implementatie.
Wanneer een module een tekenreeksparameter verwacht waarop een secure:true
wijzigingsfunctie is toegepast, kunt u de getSecret
functie gebruiken om een sleutelkluisgeheim op te halen. U geeft de waarde niet weer 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 waarnaar u implementeert.
In dit artikel wordt niet beschreven hoe u een eigenschap van een virtuele machine (VM) instelt op de URL van een certificaat in een sleutelkluis. Zie WinRM op een Windows-VM 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 worden toegeslagen.
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"
De eigenaar van de sleutelkluis heeft automatisch toegang tot het maken van geheimen. Als de gebruiker die met geheimen werkt niet de eigenaar van de sleutelkluis is, kunt u toegang verlenen 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:
- Een geheim instellen en ophalen met behulp van de Azure CLI
- Een geheim instellen en ophalen met behulp van Azure PowerShell
- Een geheim instellen en ophalen met behulp van Azure Portal
- Een geheim instellen en ophalen met behulp van .NET
- Een geheim instellen en ophalen met behulp van Node.js
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:
Maak een aangepast JSON-bestand met een roldefinitie:
{ "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" ] }
Vervang '00000000-0000-0000-00000-000000000000' door de abonnements-id.
Gebruik het JSON-bestand om de nieuwe rol te maken:
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>
In de voorgaande voorbeelden wordt de aangepaste rol toegewezen aan de gebruiker op resourcegroepniveau.
Als u een sleutelkluis gebruikt met een Bicep-bestand voor een beheerde toepassing, moet u toegang verlenen tot de service-principal van de resourceprovider van het apparaat. Zie Toegang tot een Key Vault-geheim bij het implementeren van door Azure beheerde toepassingen voor meer informatie.
Geheimen ophalen in een Bicep-bestand
U kunt de getSecret
functie in een Bicep-bestand gebruiken om een sleutelkluisgeheim te verkrijgen. De getSecret
functie kan alleen worden gebruikt met een Microsoft.KeyVault/vaults
resource. Bovendien kan deze alleen worden gebruikt binnen de params
sectie van een module en alleen met parameters die de @secure()
decorator hebben.
U kunt een andere functie gebruiken die wordt aangeroepen az.getSecret()
in een Bicep-parametersbestand om sleutelkluisgeheimen op te halen. Zie Geheimen ophalen in een parameterbestand voor meer informatie.
Omdat de getSecret
functie alleen in de params
sectie van een module kan worden gebruikt, maakt u een sql.bicep-bestand 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'
}
}
De adminPassword
parameter heeft een @secure()
decorator in het voorgaande bestand.
Het volgende Bicep-bestand gebruikt sql.bicep als een module. Het Bicep-bestand verwijst naar een bestaande sleutelkluis, 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 een parameterbestand
Als u geen module wilt gebruiken, kunt u sleutelkluisgeheimen ophalen in een parameterbestand. De benadering varieert echter, afhankelijk van of u een JSON- of Bicep-parametersbestand gebruikt.
Met het volgende Bicep-bestand wordt een SQL-server geïmplementeerd die een beheerderswachtwoord bevat. Hoewel de wachtwoordparameter is ingesteld op een beveiligde tekenreeks, geeft Bicep niet de oorsprong van die waarde op:
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 vervolgens een parameterbestand voor het voorgaande Bicep-bestand.
Bicep-parametersbestand
De 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 een 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. Geef de resource-id van de sleutelkluis en de naam van het geheim door. In het volgende parameterbestand moet het sleutelkluisgeheim al bestaan. U geeft 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 het huidige geheim wilt gebruiken, neemt u een secretVersion
eigenschap op:
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Gerelateerde inhoud
- Zie Over Azure Key Vault voor algemene informatie over sleutelkluizen.
- Zie Voorbeelden van Key Vault voor volledige GitHub-voorbeelden die laten zien hoe u naar sleutelkluisgeheimen verwijst.
- Zie Complexe cloudimplementaties beheren met behulp van geavanceerde JSON ARM-sjabloonfuncties voor een Learn-module waarin wordt beschreven hoe u een sleutelkluis gebruikt om een veilige waarde door te geven.