管理模板中的机密

已完成

在部署期间将安全值(例如密码)作为参数传递时,可以从 Azure Key Vault 检索该值。

在参数文件中引用 Key Vault 和机密。

该值永远不会公开,因为只会引用其 Key Vault ID。

Key Vault 可以存在于与将其部署到的资源组不同的订阅中。

部署 Key Vault 和机密

若要创建 Key Vault 和机密,请使用 Azure CLI 或 PowerShell。

若要从资源管理器部署访问此 Key Vault 中的机密,Key Vault 属性“enabledForTemplateDeployment”必须为 true。

使用 Azure CLI

以下代码片段是一个示例,说明如何使用 Azure CLI 部署 Key Vault 和机密:

keyVaultName='{your-unique-vault-name}'
resourceGroupName='{your-resource-group-name}'
location='centralus'
userPrincipalName='{your-email-address-associated-with-your-subscription}'

# Create a resource group
az group create --name $resourceGroupName --location $location

# Create a Key Vault
az keyvault create \
  --name $keyVaultName \
  --resource-group $resourceGroupName \
  --location $location \
  --enabled-for-template-deployment true
az keyvault set-policy --upn $userPrincipalName --name $keyVaultName --secret-permissions set delete get list

# Create a secret with the name, vmAdminPassword
password=$(openssl rand -base64 32)
echo $password
az keyvault secret set --vault-name $keyVaultName --name 'vmAdminPassword' --value $password

启用密钥访问权限

除了将 Key Vault 属性“enabledForTemplateDeployment”设置为 true 之外,部署模板的用户必须对 Key Vault 范围具有 Microsoft.KeyVault/vaults/deploy/action 权限。

此外,还包括资源组和 Key Vault。 所有者和参与者角色均授予该访问权限。

如果你创建 Key Vault,你就是所有者,因此你本身就有权限。

但是,如果 Key Vault 位于不同的订阅下,则 Key Vault 的所有者必须授予访问权限。

通过静态 ID 引用机密

Key Vault 在参数文件中引用,而不是在模板中引用。

下图显示了参数文件如何引用机密并将该值传递到模板。

Diagram showing the illustration of the flow of a secret during template deployment. The parameter file references the secret from the template and passes that value to the template.

以下模板部署包含管理员密码的 SQL 数据库。

密码参数设置为安全字符串。 但是,模板未指定该值的来源:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminLogin": {
      "type": "string"
    },
    "adminPassword": {
      "type": "securestring"
    },
    "sqlServerName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[parameters('sqlServerName')]",
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2015-05-01-preview",
      "location": "[resourceGroup().location]",
      "tags": {},
      "properties": {
        "administratorLogin": "[parameters('adminLogin')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      }
    }
  ],
  "outputs": {
  }
}

现在你可以为前面的模板创建一个参数文件。 在参数文件中,指定一个与模板中参数名称匹配的参数。

对于参数值,请引用 Key Vault 中的机密。 可以通过传递 Key Vault 的资源标识符和机密的名称来引用机密。

Key Vault 机密必须已存在于以下参数文件中,并且你为其资源 ID 提供静态值。

在本地复制此文件,并设置订阅 ID、保管库名称和 SQL 服务器名称:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "adminLogin": {
            "value": "exampleadmin"
        },
        "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "/subscriptions/<subscription-id>/resourceGroups/examplegroup/providers/Microsoft.KeyVault/vaults/<vault-name>"
              },
              "secretName": "examplesecret"
            }
        },
        "sqlServerName": {
            "value": "<your-server-name>"
        }
    }
}

需要部署模板并将参数文件传递给模板。

有关详细信息,请参阅在部署过程中使用 Azure Key Vault 传递安全参数值

此网页中还提供了一些详细信息,用于引用具有动态 ID 的机密。