Azure蓝图-从密钥保管库密钥创建Web证书会导致访问被拒绝错误

时间:2020-02-28 18:39:54

标签: azure azure-resource-manager azure-keyvault

我们得到了这个巨大的天蓝色的蓝图模板,它为我们创建了很多工件。工件之一是Azure Key Vault。密钥保险箱已创建,所需的机密就在其中。

他尝试创建的其他工件之一是Microsoft.Web /证书。我们尝试使用下面的json

创建它
 {
    "name": "create-certificate",
    "kind": "template",
    "properties": {
        "template": {
            "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "parameters": {
                "name": {
                    "type": "string"
                },
                "location": {
                    "type": "string"
                },
                "vaultName": {
                    "type": "string"
                },
                "serverFarmId": {
                    "type": "string"
                }
            },
            "resources": [
                {
                    "type": "Microsoft.Web/certificates",
                    "name": "[parameters('name')]",
                    "apiVersion": "2016-03-01",
                    "location": "[parameters('location')]",
                    "properties": {
                        "keyVaultId": "[resourceId('Microsoft.KeyVault/vaults', parameters('vaultName'))]",
                        "keyVaultSecretName": "Origin-Certificate",
                        "serverFarmId": "[parameters('serverFarmId')]"
                    }
                }
            ]
        },
        "resourceGroup": "TD-RG",
        "parameters": {
            "name": {
                "value": "[concat(parameters('environmentSuffix'), '-Orgin')]"
            },
            "location": {
                "value": "[parameters('location')]"
            },
            "vaultName": {
                "value":"[concat(parameters('environmentSuffix'), '-Vault')]"
            },
            "ServerFarmId": {
                "value": "[artifacts('create-service-plan').outputs.ServerFarmId]"
            }
        },
        "dependsOn": ["create-service-plan", "create-key-vault"]
    }   
}

因此很高兴我们首先创建一个服务计划和密钥库,然后尝试从密钥库机密中读取原始证书。然后我们得到的错误是:

该服务无权访问“ {KEY VAULT PATH}” Key Vault。 请确保您已授予对 服务执行请求操作。

在Internet上搜索,我们发现我们可以为密钥库提供更多权限。带有以下powershell命令:

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

此脚本的来源:Issue with KeyVault reference in ARM template

但是,这样做的问题是,权限被创建密钥库的工件定义所覆盖,因此无法通过Power Shell进行设置。但是我无法在蓝图中做到这一点。对于其他用户,当我们创建密钥库时,我已经设置了权限,并且可以使用。但是像下面这样添加它是行不通的。

{
   "objectId": "abfa0a7c-a6b6-4736-8310-5855508787cd",
   "tenantId": "[parameters('tenantId')]",
   "permissions": {
     "secrets": [
       "get"
     ]
   }
 }

因此,现在如何创建密钥库并在下一个工件中使用秘密仍然是一个谜。

1 个答案:

答案 0 :(得分:0)

我注意到您在Powershell abfa0a7c-a6b6-4736-8310-5855508787cd和ARM模板中都使用了相同的GUID Set-AzureRmKeyVaultAccessPolicy,这就是原因。

Set-AzureRmKeyVaultAccessPolicy中,我们需要为Application ID(i.e. Client ID)传递-ServicePrincipalName,描述为here。但是在ARM模板中,我们需要传递服务主体的Object ID不是应用程序注册),它不同于Application ID

要获取服务主体的Object ID,可以使用Powershell Get-AzureRmADServicePrincipal,在我的屏幕快照中,我使用新的Az命令,在您的情况下,只需使用{{ 1}},Get-AzureRmADServicePrincipal就是您需要的Id

注意:确保登录Powershell的帐户具有在AAD租户中获取服务主体的权限。

Object ID

enter image description here

然后在您的ARM模板中,使用Get-AzureRmADServicePrincipal -ApplicationId abfa0a7c-a6b6-4736-8310-5855508787cd 代替Object ID,它将正常工作。

Application ID