首页 > 解决方案 > 如何在通过 ARM 创建 Key Vault 时分配“Key Vault Secrets User”RBAC 角色

问题描述

我正在尝试使用 DevOps YAML 管道通过 ARM 部署一套新的资源,到目前为止一切都很好......除了重要的一点 - 在 Azure Key Vault 中管理机密。

关于这条管道有一些规定:

  1. Key Vault 必须通过 ARM 模板创建(完成)
  2. ARM 模板需要在新的 Key Vault 中存储机密(完成 - 我认为,无法检查)
  3. ARM 模板应将“Key Vault Secrets User”角色分配给服务原则(在新的 Key Vault 上),以便...
  4. YAML 管道(服务原则)可以获得对新机密的访问权限

我是否认为在创建 Key Vault 期间 - ARM 模板可以完全访问它,因此可以分配这些 RBAC 角色?我想我只是不确定如何实现它。

这是描述创建和密钥插入的 ARM 模板部分:

    {
        "type": "Microsoft.KeyVault/vaults",
        "apiVersion": "2021-04-01-preview",
        "name": "[variables('keyVaultName')]",
        "location": "[resourceGroup().location]",
        "tags": "[parameters('resourceTags')]",
        "properties": {
            "sku": {
                "family": "A",
                "name": "Standard"
            },
            "tenantId": "<<SOME TENANTID>>",
            "accessPolicies": [],
            "enabledForDeployment": false,
            "enabledForDiskEncryption": false,
            "enabledForTemplateDeployment": true,
            "enableSoftDelete": true,
            "softDeleteRetentionInDays": 90,
            "enableRbacAuthorization": true,
            "vaultUri": "[concat('https://', variables('keyVaultName'), '.vault.azure.net/')]",
            "provisioningState": "Succeeded"
        }
    },
    {
        "type": "Microsoft.KeyVault/vaults/secrets",
        "apiVersion": "2019-09-01",
        "name": "[concat(variables('keyVaultName'), '/apiKey')]",
        "location": "[parameters('location')]",
        "dependsOn": [
            "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]"
        ],
        "properties": {
            "value": "<<SOME API KEY >>"
        }
    },

标签: azureazure-devopsazure-resource-managerazure-keyvaultrbac

解决方案


尝试将此添加到模板中...首先是 roleDefinitionId:

"variables": {
    "KeyVaultSecretsUser": "4633458b-17de-408a-b874-0445c86b69e6"
}

然后是角色分配本身。

回复:那个principalId,不知道你想要什么。如果您想要principalId部署模板的用户(或服务主体),则必须将其作为参数传递,无法通过模板语言检索它 - 因此请根据需要更改该属性。如果主体不是服务主体(组或用户),则也要更改该principalType属性。

此外,如果您需要更改principalId还更新nameroleAssignment 上的属性,以便guid()维护幂等种子。

        {
            "scope": "[format('Microsoft.KeyVault/vaults/{0}', variables('keyVaultName'))]",
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2020-04-01-preview",
            "name": "[guid(resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName')), parameters('principalId'), variables('KeyVaultSecretsUser'))]",
            "dependsOn": [
                "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('KeyVaultSecretsUser')]",
                "principalId": "[parameters('principalId')]",
                "principalType": "ServicePrincipal"
            }
        }


推荐阅读