【问题标题】:Issue with KeyVault reference in ARM templateARM 模板中的 KeyVault 参考问题
【发布时间】:2024-10-16 04:00:02
【问题描述】:

我正在尝试创建一个主密钥库,其中将包含所有证书以作为某个用户进行身份验证。

我有 2 个服务主体 => 一个用于我的应用程序,一个用于部署。 这个想法是部署服务主体可以访问 Key Vault 并将位于那里的证书添加到 Web 应用程序的存储区。

我已创建服务主体,并已授予他对密钥保管库的所有权限。我还为该密钥库启用了 ARM 模板中的访问机密。

使用 powershell,我能够以 Deploying SP 的身份登录并检索密钥(证书)。

但是,在部署 ARM 模板并引用密钥保管库时,这不起作用。我收到以下错误:

New-AzureRmResourceGroupDeployment : 11:16:44 - Resource Microsoft.Web/certificates 'test-certificate' failed with message '{
  "Code": "BadRequest",
  "Message": "The service does not have access to '/subscriptions/98f06e7e-1016-4088-843f-62690f3bb306/resourcegroups/rg-temp/providers/microsoft.keyvault/vaults/master-key-vault' Key 
Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.",
  "Target": null,
  "Details": [
    {
      "Message": "The service does not have access to '/subscriptions/xxxx/resourcegroups/xxx/providers/microsoft.keyvault/vaults/master-key-vault' Key 
Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation."
    },

我的 ARM 模板如下所示:

    {
     "type":"Microsoft.Web/certificates",
     "name":"test-certificate",
     "apiVersion":"2016-03-01",
     "location":"[resourceGroup().location]",
     "properties":{
        "keyVaultId":"[resourceId('rg-temp', 'Microsoft.KeyVault/vaults', 'master-key-vault')]",
        "keyVaultSecretName":"kv-certificate-test",
        "serverFarmId":"[resourceId('Microsoft.Web/serverfarms', 'asp-test')]"
     }
  },

这是一个错误吗?因为我能够使用 Deploy SP 检索证书:

 $key = Get-AzureKeyVaultSecret -VaultName "master-key-vault" -Name "testenvironmentcertificate"

这是我的 ARM 模板:(注意,Key Vault 位于另一个资源组中,而不是 ARM 模板中的资源)

{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [
    {
     "type":"Microsoft.Web/certificates",
     "name":"test-certificate",
     "apiVersion":"2016-03-01",
     "location":"[resourceGroup().location]",
     "properties":{
        "keyVaultId":"/subscriptions/xxx/resourceGroups/rg-temp/providers/Microsoft.KeyVault/vaults/xxx",
        "keyVaultSecretName":"testcert",
        "serverFarmId":"[resourceId('Microsoft.Web/serverfarms', 'asp-test')]"
     }
  },
    {
        "name": "wa-test1",
        "type": "Microsoft.Web/sites",
        "location": "[resourceGroup().location]",
        "apiVersion": "2016-08-01",
        "dependsOn": [
            "[concat('Microsoft.Web/serverfarms/', 'asp-test')]"
        ],
        "tags": {
            "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/asp-test')]": "Resource",
            "displayName": "wa-test1"
        },
        "properties": {
            "name": "wa-test1",
            "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', 'asp-test')]"
        }
    },
    {
        "name": "asp-test",
        "type": "Microsoft.Web/serverfarms",
        "location": "[resourceGroup().location]",
        "apiVersion": "2014-06-01",
        "dependsOn": [],
        "tags": {
            "displayName": "appServicePlan"
        },
        "properties": {
            "name": "asp-test",
            "sku": "Free",
            "workerSize": "Small",
            "numberOfWorkers": 1
        }
    }
]
}

【问题讨论】:

  • 可以分享一下模板吗?您可以删除敏感信息
  • 我已经编辑了我的问题 :)
  • 好的,乍一看这看起来不错,我不确定可能出了什么问题,您能否创建另一个密钥保管库并使用您的订阅管理员来部署模板(并验证管理员是否有获得了 keyvault 的所有权利,并且 keyvault 允许模板部署?)?
  • 我尝试使用我的订阅管理员用户通过 Powershell 创建一个新的 Key Vault。我还通过 powershell 将证书添加到密钥库中。当我尝试部署 ARM 模板时仍然出现相同的错误。但是,当使用 PowerShell 检索秘密时,我得到了一个结果...

标签: azure azure-powershell azure-keyvault arm-template azure-template


【解决方案1】:

我认为您缺少资源提供者访问 Key Vault 的权限,因此 WebApp 正在使用自己的资源提供者来执行此操作,您需要授予该 RP 访问密钥库的权限:

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

参考:

https://azure.github.io/AppService/2016/05/24/Deploying-Azure-Web-App-Certificate-through-Key-Vault.html

【讨论】:

  • 我已选中 => 我的密钥保管库 => 高级访问策略下的第二个复选框。即使在部署 ARM 模板时使用我的订阅管理员,也会给我同样的错误,有什么想法吗?
  • 我已经执行了这个命令,但是我没有使用 'abfa0a7c-a6b6-4736-8310-5855508787cd' 而是我的部署 SP id。谢谢回复,可以了!
【解决方案2】:

我尝试了所有答案,但都没有奏效。这对我有用:

设置密钥保管库上两个服务主体的访问权限:


在这里阅读更多:

https://devsdaily.com/key-vault-failed-to-sync-the-certificate-the-service-does-not-have-access-to-key-vault/

【讨论】:

    【解决方案3】:

    由于控制台出错,我无法通过Set-AzureRmKeyVaultAccessPolicy 命令添加策略。

    但是,我可以通过 Azure Web 界面解决问题,方法是打开 KeyVault 访问控制 (IAM) 并将 Key Vault ReaderKey Vault Secrets User 角色添加到 Microsoft.Azure.Websites

    我也写了同样的答案here

    【讨论】: