Używanie usługi Azure Key Vault do przekazywania wpisu tajnego jako parametru podczas wdrażania aplikacji Bicep
W tym artykule wyjaśniono, jak używać usługi Azure Key Vault do przekazywania wpisu tajnego jako parametru podczas wdrażania aplikacji Bicep. Zamiast wprowadzać bezpieczną wartość, np. hasło bezpośrednio do pliku lub pliku parametrów Bicep, możesz pobrać wartość z usługi Azure Key Vault podczas wdrażania.
Gdy moduł oczekuje parametru ciągu z zastosowanym modyfikatoremsecure:true
, możesz użyć getSecret
funkcji w celu uzyskania wpisu tajnego magazynu kluczy. Nie uwidaczniasz wartości, ponieważ odwołujesz się tylko do jej identyfikatora magazynu kluczy.
Ważne
W tym artykule opisano sposób przekazywania poufnej wartości jako parametru szablonu. Po przekazaniu wpisu tajnego jako parametru magazyn kluczy może istnieć w innej subskrypcji niż grupa zasobów, do której wdrażasz.
W tym artykule nie opisano sposobu ustawiania właściwości maszyny wirtualnej na adres URL certyfikatu w magazynie kluczy. Aby zapoznać się z szablonem szybkiego startu tego scenariusza, zobacz WinRM na maszynie wirtualnej z systemem Windows.
Aby uzyskać dostęp do magazynu kluczy podczas wdrażania Bicep, ustaw dla enabledForTemplateDeployment
magazynu kluczy wartość true
.
Jeśli masz już magazyn kluczy, upewnij się, że zezwala na wdrożenia szablonów.
az keyvault update --name ExampleVault --enabled-for-template-deployment true
Aby utworzyć nowy magazyn kluczy i dodać wpis tajny, użyj:
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"
Właściciel magazynu kluczy automatycznie ma dostęp do tworzenia wpisów tajnych. Jeśli użytkownik, który pracuje z wpisami tajnymi, nie jest właścicielem magazynu kluczy, możesz udzielić dostępu:
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Aby uzyskać więcej informacji na temat tworzenia magazynów kluczy i dodawania wpisów tajnych, zobacz:
- Ustawianie i pobieranie wpisu tajnego przy użyciu interfejsu wiersza polecenia platformy Azure
- Ustawianie i pobieranie wpisu tajnego przy użyciu programu Azure PowerShell
- Ustawianie i pobieranie wpisu tajnego przy użyciu witryny Azure Portal
- Ustawianie i pobieranie wpisu tajnego przy użyciu platformy .NET
- Ustawianie i pobieranie wpisu tajnego przy użyciu Node.js
Użytkownik, który wdraża plik Bicep, musi mieć Microsoft.KeyVault/vaults/deploy/action
uprawnienie do zakresu grupy zasobów i magazynu kluczy. Role Właściciel i Współautor przyznają ten dostęp. Jeśli utworzono magazyn kluczy, jesteś właścicielem i masz uprawnienie.
Poniższa procedura pokazuje, jak utworzyć rolę z minimalnym uprawnieniem i jak przypisać użytkownika:
Utwórz niestandardowy plik JSON z definicją roli:
{ "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" ] }
Zastąp wartość "00000000-0000-0000-0000-000000000000" identyfikatorem subskrypcji.
Użyj pliku JSON, aby utworzyć nową rolę:
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>
Powyższe przykłady przypisują użytkownikowi rolę niestandardową na poziomie grupy zasobów.
Jeśli używasz magazynu kluczy z plikiem Bicep dla aplikacji zarządzanej, musisz udzielić dostępu do jednostki usługi dostawcy zasobów urządzenia. Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu do wpisu tajnego usługi Key Vault podczas wdrażania aplikacji zarządzanych platformy Azure.
Możesz użyć getSecret
funkcji w pliku Bicep, aby uzyskać wpis tajny magazynu kluczy. Funkcji getSecret
można używać tylko z zasobem Microsoft.KeyVault/vaults
. Ponadto można go używać tylko w params
sekcji modułu i tylko z parametrami, które mają @secure()
dekorator.
Możesz użyć innej funkcji wywoływanej az.getSecret()
w pliku parametrów Bicep, aby pobrać wpisy tajne magazynu kluczy. Aby uzyskać więcej informacji, zobacz Pobieranie wpisów tajnych w pliku parametrów.
getSecret
Ponieważ funkcja może być używana tylko w params
sekcji modułu, utwórz plik sql.bicep w tym samym katalogu co plik main.bicep o następującej zawartości:
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'
}
}
Parametr adminPassword
ma @secure()
dekorator w poprzednim pliku.
Poniższy plik Bicep używa pliku sql.bicep jako modułu. Plik Bicep odwołuje się do istniejącego magazynu kluczy, wywołuje getSecret
funkcję w celu pobrania wpisu tajnego magazynu kluczy, a następnie przekazuje wartość jako parametr do modułu:
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')
}
}
Jeśli nie chcesz używać modułu, możesz pobrać wpisy tajne magazynu kluczy w pliku parametrów. Jednak podejście różni się w zależności od tego, czy używasz pliku parametrów JSON, czy Bicep.
Poniższy plik Bicep wdraża serwer SQL zawierający hasło administratora. Chociaż parametr hasła jest ustawiony na bezpieczny ciąg, Bicep nie określa źródła tej wartości:
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'
}
}
Następnie utwórz plik parametrów dla poprzedniego pliku Bicep.
Funkcja az.getSecret
może służyć w .bicepparam
pliku do pobierania wartości wpisu tajnego z magazynu kluczy:
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>')
W pliku parametrów JSON określ parametr zgodny z nazwą parametru w pliku Bicep. W przypadku wartości parametru należy odwołać się do wpisu tajnego z magazynu kluczy. Przekaż identyfikator zasobu magazynu kluczy i nazwę wpisu tajnego. W poniższym pliku parametrów wpis tajny magazynu kluczy musi już istnieć. Należy podać wartość statyczną dla identyfikatora zasobu.
{
"$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>"
}
}
}
Jeśli musisz użyć wersji wpisu tajnego innej niż bieżąca secretVersion
, dołącz właściwość:
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
- Aby uzyskać ogólne informacje na temat magazynów kluczy, zobacz About Azure Key Vault (Informacje o usłudze Azure Key Vault).
- Aby zapoznać się z kompletnymi przykładami usługi GitHub, które pokazują, jak odwoływać się do wpisów tajnych magazynu kluczy, zobacz Przykłady magazynu kluczy.
- Aby zapoznać się z modułem Learn, w którym opisano sposób używania magazynu kluczy do przekazywania bezpiecznej wartości, zobacz Manage complex cloud deployments by using advanced JSON ARM template features (Zarządzanie złożonymi wdrożeniami w chmurze przy użyciu zaawansowanych funkcji szablonu usługi ARM JSON).