Použití trezoru klíčů Azure Key Vault k předávání hodnoty zabezpečeného parametru během nasazování
Místo vložení zabezpečené hodnoty (například hesla) přímo do šablony nebo souboru parametrů můžete hodnotu načíst ze služby Azure Key Vault během nasazení. Hodnotu načtete odkazem na trezor klíčů a tajný klíč v souboru parametrů. Tato hodnota se nikdy nezostavuje, protože odkazujete pouze na JEHO ID trezoru klíčů.
Důležité
Tento článek se zaměřuje na to, jak předat citlivou hodnotu jako parametr šablony. Když se tajný klíč předá jako parametr, může trezor klíčů existovat v jiném předplatném než ve skupině prostředků, do které nasazujete.
Tento článek se nezabývá nastavením vlastnosti virtuálního počítače na adresu URL certifikátu v trezoru klíčů. Šablonu rychlého startu tohoto scénáře najdete v tématu Instalace certifikátu ze služby Azure Key Vault na virtuálním počítači.
Nasazení trezorů klíčů a tajných kódů
Pokud chcete získat přístup k trezoru klíčů během nasazování šablony, nastavte enabledForTemplateDeployment
ho na true
.
Pokud už trezor klíčů máte, ujistěte se, že umožňuje nasazení šablon.
az keyvault update --name ExampleVault --enabled-for-template-deployment true
Pokud chcete vytvořit nový trezor klíčů a přidat tajný klíč, použijte:
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"
Jako vlastník trezoru klíčů máte automaticky přístup k vytváření tajných kódů. Pokud potřebujete umožnit jinému uživateli vytvářet tajné kódy, použijte:
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Zásady přístupu nejsou potřeba, pokud uživatel nasazuje šablonu, která načte tajný klíč. Přidejte uživatele do zásad přístupu jenom v případě, že uživatel potřebuje pracovat přímo s tajnými kódy. Oprávnění k nasazení jsou definována v další části.
Další informace o vytváření trezorů klíčů a přidávání tajných kódů najdete v tématech:
- Nastavení a načtení tajného kódu pomocí rozhraní příkazového řádku
- Nastavení a načtení tajného kódu pomocí PowerShellu
- Nastavení a načtení tajného kódu pomocí portálu
- Nastavení a načtení tajného kódu pomocí .NET
- Nastavení a načtení tajného kódu pomocí Node.js
Udělení přístupu k tajným kódům nasazení
Uživatel, který šablonu nasadí, musí mít Microsoft.KeyVault/vaults/deploy/action
oprávnění pro obor skupiny prostředků a trezoru klíčů. Když tento přístup zkontrolujete, Azure Resource Manager zabrání neschválenému uživateli v přístupu k tajnému kódu předáním ID prostředku trezoru klíčů. Přístup k nasazení můžete udělit uživatelům bez udělení přístupu k zápisu k tajným kódům.
Role Vlastník i Přispěvatel udělí tento přístup. Pokud jste vytvořili trezor klíčů, jste vlastníkem a máte oprávnění.
Ostatním uživatelům udělte Microsoft.KeyVault/vaults/deploy/action
oprávnění. Následující postup ukazuje, jak vytvořit roli s minimálním oprávněním a přiřadit ji uživateli.
Vytvořte soubor JSON s vlastní definicí role:
{ "Name": "Key Vault resource manager template deployment operator", "IsCustom": true, "Description": "Lets you deploy a resource manager template 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" ] }
Nahraďte "0000000-0000-0000-0000-000000000000" ID předplatného.
Vytvořte novou roli pomocí souboru JSON:
az role definition create --role-definition "<path-to-role-file>" az role assignment create \ --role "Key Vault resource manager template deployment operator" \ --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \ --assignee <user-principal-name> \ --resource-group ExampleGroup
Ukázky přiřadí uživateli vlastní roli na úrovni skupiny prostředků.
Při použití trezoru klíčů se šablonou pro spravovanou aplikaci musíte udělit přístup k instančnímu objektu poskytovatele prostředků zařízení. Další informace najdete v tématu Přístup k tajnému kódu služby Key Vault při nasazování spravovaných aplikací Azure.
Odkazovat na tajné kódy se statickým ID
Při tomto přístupu odkazujete na trezor klíčů v souboru parametrů, nikoli na šablonu. Následující obrázek ukazuje, jak soubor parametrů odkazuje na tajný klíč a předá danou hodnotu šabloně.
Kurz: Integrace služby Azure Key Vault v nasazení šablon Resource Manageru používá tuto metodu.
Následující šablona nasadí sql server, který obsahuje heslo správce. Parametr hesla je nastavený na zabezpečený řetězec. Šablona ale neurčí, odkud tato hodnota pochází.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"sqlServerName": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"adminLogin": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
}
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01",
"name": "[parameters('sqlServerName')]",
"location": "[parameters('location')]",
"properties": {
"administratorLogin": "[parameters('adminLogin')]",
"administratorLoginPassword": "[parameters('adminPassword')]",
"version": "12.0"
}
}
]
}
Teď vytvořte soubor parametrů pro předchozí šablonu. V souboru parametrů zadejte parametr, který odpovídá názvu parametru v šabloně. Pro hodnotu parametru odkazujte na tajný klíč z trezoru klíčů. Na tajný kód odkazujete předáním identifikátoru prostředku trezoru klíčů a názvu tajného kódu:
V následujícím souboru parametrů musí tajný klíč trezoru klíčů již existovat a pro ID prostředku zadáte statickou hodnotu.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminLogin": {
"value": "exampleadmin"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>"
},
"secretName": "ExamplePassword"
}
},
"sqlServerName": {
"value": "<your-server-name>"
}
}
}
Pokud potřebujete použít jinou verzi tajného kódu než aktuální verzi, uveďte secretVersion
vlastnost.
"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"
Nasaďte šablonu a předejte soubor parametrů:
az group create --name SqlGroup --location westus2
az deployment group create \
--resource-group SqlGroup \
--template-uri <template-file-URI> \
--parameters <parameter-file>
Referenční tajné kódy s dynamickým ID
Předchozí část ukázala, jak předat statické ID prostředku pro tajný klíč trezoru klíčů z parametru. V některých scénářích potřebujete odkazovat na tajný klíč trezoru klíčů, který se liší podle aktuálního nasazení. Nebo můžete chtít předat do šablony hodnoty parametrů místo vytvoření referenčního parametru v souboru parametrů. Řešením je dynamicky generovat ID prostředku pro tajný klíč trezoru klíčů pomocí propojené šablony.
ID prostředku v souboru parametrů nelze dynamicky generovat, protože v souboru parametrů nejsou povolené výrazy šablony.
Do nadřazené šablony přidáte vnořenou šablonu a předáte parametr, který obsahuje dynamicky generované ID prostředku. Následující obrázek ukazuje, jak parametr v propojené šabloně odkazuje na tajný klíč.
Následující šablona dynamicky vytvoří ID trezoru klíčů a předá ho jako parametr.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location where the resources will be deployed."
}
},
"vaultName": {
"type": "string",
"metadata": {
"description": "The name of the keyvault that contains the secret."
}
},
"secretName": {
"type": "string",
"metadata": {
"description": "The name of the secret."
}
},
"vaultResourceGroupName": {
"type": "string",
"metadata": {
"description": "The name of the resource group that contains the keyvault."
}
},
"vaultSubscription": {
"type": "string",
"defaultValue": "[subscription().subscriptionId]",
"metadata": {
"description": "The name of the subscription that contains the keyvault."
}
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2020-10-01",
"name": "dynamicSecret",
"properties": {
"mode": "Incremental",
"expressionEvaluationOptions": {
"scope": "inner"
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminLogin": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
},
"location": {
"type": "string"
}
},
"variables": {
"sqlServerName": "[concat('sql-', uniqueString(resourceGroup().id, 'sql'))]"
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01",
"name": "[variables('sqlServerName')]",
"location": "[parameters('location')]",
"properties": {
"administratorLogin": "[parameters('adminLogin')]",
"administratorLoginPassword": "[parameters('adminPassword')]"
}
}
],
"outputs": {
"sqlFQDN": {
"type": "string",
"value": "[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
}
}
},
"parameters": {
"location": {
"value": "[parameters('location')]"
},
"adminLogin": {
"value": "ghuser"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(parameters('vaultSubscription'), parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
},
"secretName": "[parameters('secretName')]"
}
}
}
}
}
]
}
Další kroky
- Obecné informace o trezorech klíčů najdete v tématu Co je Azure Key Vault?
- Kompletní příklady odkazů na tajné klíče najdete v příkladech trezoru klíčů na GitHubu.
- Modul Learn, který se zabývá předáváním zabezpečené hodnoty z trezoru klíčů, najdete v tématu Správa složitých cloudových nasazení pomocí pokročilých funkcí šablon ARM.