Azure Blueprint - Создание веб-сертификата из секретного хранилища ключей дает ошибку запрещенного доступа - PullRequest
0 голосов
/ 28 февраля 2020

У нас есть большой шаблон azure, который создает для нас множество артефактов. Одним из артефактов является 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"]
    }   
}

Так что приятно дождаться, что мы сначала создадим план обслуживания и хранилище ключей, а затем попробовали прочитать сертификат orgin из секретного хранилища ключей. Затем мы получаем ошибку:

Служба не имеет доступа к хранилищу ключей {KEY VAULT PATH}. Убедитесь, что вы предоставили службе необходимые разрешения для выполнения операции запроса.

При поиске в inte rnet мы обнаружили, что можем предоставить дополнительные разрешения хранилищу ключей. С такими вещами, как следующая команда powershell:

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

Источник этого сценария: Проблема со ссылкой KeyVault в шаблоне ARM

Но проблема в том, что разрешения перезаписываются определением артефакта, которое создает хранилище ключей, поэтому его нельзя установить с помощью Power shell. Но я не могу понять это правильно в проекте. Для других пользователей я уже установил разрешения, когда мы создаем хранилище ключей, и это работает. Но добавить это, как показано ниже, не работает.

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

Так что теперь остается загадкой, как создать хранилище ключей и использовать секрет в следующем артефакте.

1 Ответ

0 голосов
/ 02 марта 2020

Я заметил, что вы использовали один и тот же guid abfa0a7c-a6b6-4736-8310-5855508787cd как в PowerShell Set-AzureRmKeyVaultAccessPolicy, так и в шаблоне ARM, что и послужило причиной.

В Set-AzureRmKeyVaultAccessPolicy нам нужно передать Application ID(i.e. Client ID) для -ServicePrincipalName, описание здесь . Но в шаблоне ARM нам нужно передать Object ID субъекта службы ( не регистрация приложения ), он отличается от Application ID.

Для получения Object ID участника службы, вы можете использовать powershell Get-AzureRmADServicePrincipal, на моем скриншоте я использую новую команду Az, в вашем случае, просто используйте Get-AzureRmADServicePrincipal напрямую, Id - это Object ID, в котором вы нуждаетесь.

Примечание : убедитесь, что у вашей учетной записи, зарегистрированной в PowerShell, есть разрешение на получение участника службы в вашем клиенте AAD.

Get-AzureRmADServicePrincipal -ApplicationId abfa0a7c-a6b6-4736-8310-5855508787cd

enter image description here

Затем в вашем шаблоне ARM используйте Object ID вместо Application ID, он будет работать нормально.

{
   "objectId": "<Object ID>",
   "tenantId": "[parameters('tenantId')]",
   "permissions": {
     "secrets": [
       "get"
     ]
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...