Включение ключа, управляемого клиентом

Эта статья является второй частью в серии учебников из четырех частей. Первая часть содержит общие сведения о ключах, управляемых клиентом, их функциях и рекомендациях перед их включением в реестре. В этой статье описано, как включить ключ, управляемый клиентом, с помощью Azure CLI, портал Azure или шаблона Azure Resource Manager.

Предварительные требования

Включение ключа, управляемого клиентом, с помощью Azure CLI

Создание группы ресурсов

Выполните команду az group create , чтобы создать группу ресурсов, в которой будет храниться хранилище ключей, реестр контейнеров и другие необходимые ресурсы:

az group create --name <resource-group-name> --location <location>

Создание управляемого удостоверения, назначаемого пользователем

Настройте управляемое удостоверение , назначаемое пользователем, для реестра, чтобы получить доступ к хранилищу ключей:

  1. Выполните команду az identity create , чтобы создать управляемое удостоверение:

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. В выходных данных команды запишите id значения и principalId , чтобы настроить доступ к реестру с помощью хранилища ключей:

    {
      "clientId": "xxxx2bac-xxxx-xxxx-xxxx-192cxxxx6273",
      "clientSecretUrl": "https://control-eastus.identity.azure.net/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myidentityname/credentials?tid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&oid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&aid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myresourcegroup",
      "location": "eastus",
      "name": "myidentityname",
      "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "resourceGroup": "myresourcegroup",
      "tags": {},
      "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  3. Для удобства храните id значения и principalId в переменных среды:

    identityID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'id' --output tsv)
    
    identityPrincipalID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'principalId' --output tsv)
    

Создайте хранилище ключей.

  1. Выполните команду az keyvault create , чтобы создать хранилище ключей, в котором можно хранить управляемый клиентом ключ для шифрования реестра.

  2. По умолчанию новое хранилище ключей автоматически включает параметр обратимого удаления . Чтобы предотвратить потерю данных из-за случайного удаления ключей или хранилищ ключей, рекомендуется включить параметр защиты от очистки :

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. Для удобства запишите идентификатор ресурса хранилища ключей и сохраните значение в переменных среды:

    keyvaultID=$(az keyvault show --resource-group <resource-group-name> --name <key-vault-name> --query 'id' --output tsv)
    

Включение доступа к хранилищу ключей для доверенных служб

Если хранилище ключей защищено брандмауэром или виртуальной сетью (частной конечной точкой), необходимо включить параметры сети, чтобы разрешить доступ доверенным службам Azure. Дополнительные сведения см. в разделе Настройка сетевых параметров Azure Key Vault.

Включение управляемых удостоверений для доступа к хранилищу ключей

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

Первый вариант — настроить политику доступа для хранилища ключей и задать разрешения ключа для доступа с помощью управляемого удостоверения, назначаемого пользователем:

  1. Выполните команду az keyvault set policy . Передайте ранее созданную и сохраненную переменную среды значение principalID.

  2. Задайте для ключей getразрешения , unwrapKeyи wrapKey:

    az keyvault set-policy \
      --resource-group <resource-group-name> \
      --name <key-vault-name> \
      --object-id $identityPrincipalID \
      --key-permissions get unwrapKey wrapKey
    
    

Второй вариант — использовать управление доступом на основе ролей Azure (RBAC) для назначения разрешений управляемому удостоверению, назначаемому пользователем, и доступа к хранилищу ключей. Выполните команду az role assignment create и назначьте Key Vault Crypto Service Encryption User роль управляемому удостоверению, назначаемому пользователем:

az role assignment create --assignee $identityPrincipalID \
  --role "Key Vault Crypto Service Encryption User" \
  --scope $keyvaultID

Создание ключа и получение идентификатора ключа

  1. Выполните команду az keyvault key create , чтобы создать ключ в хранилище ключей:

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. В выходных данных команды запишите идентификатор ключа (kid):

    [...]
      "key": {
        "crv": null,
        "d": null,
        "dp": null,
        "dq": null,
        "e": "AQAB",
        "k": null,
        "keyOps": [
          "encrypt",
          "decrypt",
          "sign",
          "verify",
          "wrapKey",
          "unwrapKey"
        ],
        "kid": "https://mykeyvault.vault.azure.net/keys/mykey/<version>",
        "kty": "RSA",
    [...]
    
  3. Для удобства сохраните формат, выбранный для идентификатора ключа, в переменной $keyID среды. Идентификатор ключа можно использовать с версией или без нее.

Смена ключей

Вы можете выбрать ручную или автоматическую смену клавиш.

Шифрование реестра с помощью управляемого клиентом ключа с версией ключа позволит сменить ключи вручную только в Реестр контейнеров Azure. В приведенном примере сохраняется свойство kid ключа.

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

Шифрование реестра с помощью управляемого клиентом ключа путем пропуска версии ключа позволит автоматической смене ключей обнаружить новую версию ключа в Azure Key Vault. В этом примере из свойства kid ключа удаляется версия.

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

keyID=$(echo $keyID | sed -e "s/\/[^/]*$//")

Создание реестра с использованием управляемого клиентом ключа

  1. Выполните команду az acr create , чтобы создать реестр на уровне служб "Премиум" и включить ключ, управляемый клиентом.

  2. Передайте значения идентификатора управляемого удостоверения (id) и идентификатора ключа (kid), хранящиеся в переменных среды на предыдущих шагах:

    az acr create \
      --resource-group <resource-group-name> \
      --name <container-registry-name> \
      --identity $identityID \
      --key-encryption-key $keyID \
      --sku Premium
    

Показать статус шифрования

Выполните команду az acr encryption show , чтобы показать состояние шифрования реестра с помощью ключа, управляемого клиентом:

az acr encryption show --name <container-registry-name>

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

{
  "keyVaultProperties": {
    "identity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "keyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
    "keyRotationEnabled": true,
    "lastKeyRotationTimestamp": xxxxxxxx
    "versionedKeyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
  },
  "status": "enabled"
}

Включение ключа, управляемого клиентом, с помощью портал Azure

Создание управляемого удостоверения, назначаемого пользователем

Чтобы создать управляемое удостоверение, назначаемое пользователем, для ресурсов Azure в портал Azure:

  1. Выполните действия, чтобы создать назначаемое пользователем удостоверение.

  2. Сохраните имя удостоверения, чтобы использовать его на последующих шагах.

Снимок экрана: параметры создания назначаемого пользователем удостоверения в портал Azure.

Создайте хранилище ключей.

  1. Выполните действия, описанные в кратком руководстве по созданию хранилища ключей с помощью портал Azure.

  2. При создании хранилища ключей для ключа, управляемого клиентом, на вкладке Основные сведения включите параметр Защита от очистки . Этот параметр помогает предотвратить потерю данных из-за случайного удаления ключей или хранилищ ключей.

    Снимок экрана: параметры создания хранилища ключей в портал Azure.

Включение доступа к хранилищу ключей для доверенных служб

Если хранилище ключей находится под защитой брандмауэра или виртуальной сети (частной конечной точки), включите параметр сети, чтобы разрешить доступ доверенным службам Azure. Дополнительные сведения см. в разделе Настройка сетевых параметров Azure Key Vault.

Включение управляемых удостоверений для доступа к хранилищу ключей

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

Первый вариант — настроить политику доступа для хранилища ключей и задать разрешения ключа для доступа с помощью управляемого удостоверения, назначаемого пользователем:

  1. Перейдите в хранилище ключей.
  2. Выберите пункт Параметры>Политика доступа > +Добавить политику доступа.
  3. Выберите Разрешения ключа, а затем выберите Получить, Распаковка ключа и Упаковка ключа.
  4. В разделе Выбор субъекта выберите имя ресурса для управляемого удостоверения, назначаемого пользователем.
  5. Нажмите кнопку Добавить, а затем нажмите кнопку Сохранить.

Снимок экрана: параметры создания политики доступа к хранилищу ключей.

Другой вариант — назначить Key Vault Crypto Service Encryption User роль RBAC управляемому удостоверению, назначаемому пользователем, в области хранилища ключей. Подробные инструкции см. в статье Назначение ролей Azure с помощью портала Microsoft Azure.

Создание ключа

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

  1. Перейдите в хранилище ключей.
  2. Последовательно выберите Параметры>Ключи.
  3. Выберите + создать или импортировать и введите уникальное имя для ключа.
  4. Примите остальные значения по умолчанию и нажмите кнопку Создать.
  5. После создания выберите ключ и его текущую версию. Скопируйте ИД ключа для версии ключа.

Создание реестра контейнеров

  1. Последовательно выберите Создать ресурс>Контейнеры>Реестр контейнеров.
  2. На вкладке Основные сведения выберите или создайте группу ресурсов, а затем введите имя реестра. В поле SKU выберите пункт Премиум.
  3. На вкладке Шифрование для параметра Ключ, управляемый клиентом, выберите Включено.
  4. В поле Удостоверение выберите созданное управляемое удостоверение.
  5. В поле Шифрование выберите один из следующих вариантов:
    • Выберите Выбрать из Key Vault, а затем выберите существующее хранилище ключей и ключ или щелкните Создать. Выбранная клавиша отключена и включает автоматическую смену ключей.
    • Выберите Ввести URI ключаи укажите идентификатор существующего ключа. Вы можете указать URI ключа с управлением версиями (для ключа, который необходимо сменить вручную) или универсальный код ресурса (URI) неверсивного ключа (который включает автоматическую смену ключей). См. шаги по созданию ключа в предыдущем разделе.
  6. Выберите Review + create (Просмотреть и создать).
  7. Нажмите кнопку Создать, чтобы активировать реестр.

Снимок экрана: параметры создания зашифрованного реестра в портал Azure.

Отображение состояния шифрования

Чтобы просмотреть состояние шифрования реестра на портале, перейдите к реестру. В разделе Параметры выберите Шифрование.

Включение ключа, управляемого клиентом, с помощью шаблона Resource Manager

Шаблон Resource Manager можно использовать для создания реестра контейнеров и включения шифрования с помощью ключа, управляемого клиентом:

  1. Скопируйте следующее содержимое шаблона Resource Manager в новый файл и сохраните его как CMKtemplate.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "vault_name": {
          "defaultValue": "",
          "type": "String"
        },
        "registry_name": {
          "defaultValue": "",
          "type": "String"
        },
        "identity_name": {
          "defaultValue": "",
          "type": "String"
        },
        "kek_id": {
          "type": "String"
        }
      },
      "variables": {},
      "resources": [
        {
          "type": "Microsoft.ContainerRegistry/registries",
          "apiVersion": "2019-12-01-preview",
          "name": "[parameters('registry_name')]",
          "location": "[resourceGroup().location]",
          "sku": {
            "name": "Premium",
            "tier": "Premium"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
              "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]": {}
            }
          },
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "adminUserEnabled": false,
            "encryption": {
              "status": "enabled",
              "keyVaultProperties": {
                "identity": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').clientId]",
                "KeyIdentifier": "[parameters('kek_id')]"
              }
            },
            "networkRuleSet": {
              "defaultAction": "Allow",
              "virtualNetworkRules": [],
              "ipRules": []
            },
            "policies": {
              "quarantinePolicy": {
                "status": "disabled"
              },
              "trustPolicy": {
                "type": "Notary",
                "status": "disabled"
              },
              "retentionPolicy": {
                "days": 7,
                "status": "disabled"
              }
            }
          }
        },
        {
          "type": "Microsoft.KeyVault/vaults/accessPolicies",
          "apiVersion": "2018-02-14",
          "name": "[concat(parameters('vault_name'), '/add')]",
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "accessPolicies": [
              {
                "tenantId": "[subscription().tenantId]",
                "objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').principalId]",
                "permissions": {
                  "keys": [
                    "get",
                    "unwrapKey",
                    "wrapKey"
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
          "apiVersion": "2018-11-30",
          "name": "[parameters('identity_name')]",
          "location": "[resourceGroup().location]"
        }
      ]
    }
    
  2. Выполните действия, описанные в предыдущих разделах, чтобы создать следующие ресурсы:

    • Хранилище ключей, идентифицируемое по имени
    • Ключ хранилища ключей, идентифицируемый по идентификатору ключа
  3. Выполните команду az deployment group create , чтобы создать реестр с помощью предыдущего файла шаблона. При указании укажите новое имя реестра и назначаемое пользователем управляемое удостоверение, а также созданное имя хранилища ключей и идентификатор ключа.

    az deployment group create \
      --resource-group <resource-group-name> \
      --template-file CMKtemplate.json \
      --parameters \
        registry_name=<registry-name> \
        identity_name=<managed-identity> \
        vault_name=<key-vault-name> \
        key_id=<key-vault-key-id>
    
  4. Выполните команду az acr encryption show , чтобы показать состояние шифрования реестра:

    az acr encryption show --name <registry-name>
    

Дальнейшие действия

Перейдите к следующей статье , чтобы пошаговые инструкции по смене управляемых клиентом ключей, обновлению версий ключей и отзыву ключа, управляемого клиентом.