Azure 资源管理器 - 无法在访问策略中使用 Microsoft App Service 部署 Keyvault

Azure Resource Manager - Cannot deploy Keyvault with Microsoft App Service in access policy

所以我正在尝试使用 Azure Devops Pipelines 和 ARM 模板来整理我所有的 Azure 基础设施。这非常艰难,但我可以看到部署在 5 分钟内为我提供 20 个资源的好处,这些资源都很好!

但是,我遇到了一个问题。我想部署一个新的 Keyvault。打勾,简单!我想存储一个 x509 证书,它是我的 Web 应用程序使用的通配符证书。打勾轻松搞定。现在我想创建一个 "Microsoft.Web/Certificates" 证书资源,然后我可以使用它为我的 Web 应用程序创建 SSL 自定义绑定。这失败了:

"The service does not have access to '...microsoft.keyvault/vaults/gs-prd1-kv-apps' Key Vault.

合理地在此处的示例模板中有详细记录:https://github.com/Azure/azure-quickstart-templates/tree/master/201-web-app-certificate-from-key-vault。事实证明,**Microsoft.Azure.Websites" 资源提供者无权访问 Keyvault。要解决此问题,指导是 运行 powershell 或 az cli 命令将 RP 添加到我的新 Keyvault

Set-AzureRmKeyVaultAccessPolicy -VaultName KEY_VAULT_NAME -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets get

问题是,我需要在 Devops 管道或 ARM 模板中执行此操作,但我完全不知道如何操作。

我已经尝试将 az 命令添加到新的构建任务中,但是 运行 管道的服务原则也没有添加它的正确权限。

有人可以帮忙吗?必须有一种方法可以使用 x509 证书部署 Keyvault 并将此资源分配给 Web 应用程序?

我想我会分享我现在对这个问题的有效解决方案。因此,让我们澄清一下我们要在 ARM 模板中部署什么:

  • 一个新的 KeyVault (Microsoft.KeyVault/vaults),它有一个以 pkcs12 格式作为秘密存储的 x509 证书
  • 新的应用服务计划 (Microsoft.Web/serverfarms)
  • 应用服务计划中的
  • 一个新的网络证书 (Microsoft.Web/certificates),可用于通过 HTTPS 定义自定义域名。这是放置在新 KeyVault
  • 中的 x509 证书

除了用于创建应用服务计划的资源提供者没有新 Keyvault 的访问策略并且因此无法提取 x509 证书外,这一切都可以正常工作。这记录在问题中引用的示例模板中。指导是 运行 为资源提供者添加访问策略的命令。但是,正如我在问题中所述,我们正在尝试完全在 ARM 模板中执行此操作。

解决方案是在 ARM 模板中定义资源提供程序的访问策略。但是,有两个问题:

  1. 我不确定要使用哪个资源提供程序
  2. 我不知道如何获取此资源提供者使用的服务主体的 ObjectId

我从 那里得到了提示并做了以下事情。

1.创建新的 Keyvault 并将 x509 证书作为秘密添加到其中

2。 运行 用于获取 "Microsoft Azure App Service"

服务主体的 az CLI 命令
az ad sp list --display-name "Microsoft Azure App Service"

这会显示该服务的许多属性,包括我可以复制以用于 ARM 模板的 [objectId]

3。在 ARM 模板 中为 "Microsoft Azure App Service" 服务主体创建一个 Keyvault 访问策略资源 - 使用上面的 [objectId]。仅授予此委托人 "Get" 机密权限。

4.为其创建应用服务计划和新的 Web 证书资源


现在,当我 运行 Microsoft Azure 应用服务主体有权从新的 Keyvault 检索 x509 证书并在服务计划中创建 Web 证书资源的模板时。