Включение ключа, управляемого клиентом
Эта статья является второй частью в серии учебников из четырех частей. Первая часть содержит общие сведения о ключах, управляемых клиентом, их функциях и рекомендациях перед их включением в реестре. В этой статье описано, как включить ключ, управляемый клиентом, с помощью Azure CLI, портал Azure или шаблона Azure Resource Manager.
Предварительные требования
- Установите Azure CLI или подготовьтесь к использованию Azure Cloud Shell.
- Войдите на портал Azure.
Включение ключа, управляемого клиентом, с помощью Azure CLI
Создание группы ресурсов
Выполните команду az group create , чтобы создать группу ресурсов, в которой будет храниться хранилище ключей, реестр контейнеров и другие необходимые ресурсы:
az group create --name <resource-group-name> --location <location>
Создание управляемого удостоверения, назначаемого пользователем
Настройте управляемое удостоверение , назначаемое пользователем, для реестра, чтобы получить доступ к хранилищу ключей:
Выполните команду az identity create , чтобы создать управляемое удостоверение:
az identity create \ --resource-group <resource-group-name> \ --name <managed-identity-name>
В выходных данных команды запишите
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" }
Для удобства храните
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)
Создайте хранилище ключей.
Выполните команду az keyvault create , чтобы создать хранилище ключей, в котором можно хранить управляемый клиентом ключ для шифрования реестра.
По умолчанию новое хранилище ключей автоматически включает параметр обратимого удаления . Чтобы предотвратить потерю данных из-за случайного удаления ключей или хранилищ ключей, рекомендуется включить параметр защиты от очистки :
az keyvault create --name <key-vault-name> \ --resource-group <resource-group-name> \ --enable-purge-protection
Для удобства запишите идентификатор ресурса хранилища ключей и сохраните значение в переменных среды:
keyvaultID=$(az keyvault show --resource-group <resource-group-name> --name <key-vault-name> --query 'id' --output tsv)
Включение доступа к хранилищу ключей для доверенных служб
Если хранилище ключей защищено брандмауэром или виртуальной сетью (частной конечной точкой), необходимо включить параметры сети, чтобы разрешить доступ доверенным службам Azure. Дополнительные сведения см. в разделе Настройка сетевых параметров Azure Key Vault.
Включение управляемых удостоверений для доступа к хранилищу ключей
Существует два способа разрешить управляемым удостоверениям доступ к хранилищу ключей.
Первый вариант — настроить политику доступа для хранилища ключей и задать разрешения ключа для доступа с помощью управляемого удостоверения, назначаемого пользователем:
Выполните команду az keyvault set policy . Передайте ранее созданную и сохраненную переменную среды значение
principalID
.Задайте для ключей
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
Создание ключа и получение идентификатора ключа
Выполните команду az keyvault key create , чтобы создать ключ в хранилище ключей:
az keyvault key create \ --name <key-name> \ --vault-name <key-vault-name>
В выходных данных команды запишите идентификатор ключа (
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", [...]
Для удобства сохраните формат, выбранный для идентификатора ключа, в переменной
$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/\/[^/]*$//")
Создание реестра с использованием управляемого клиентом ключа
Выполните команду az acr create , чтобы создать реестр на уровне служб "Премиум" и включить ключ, управляемый клиентом.
Передайте значения идентификатора управляемого удостоверения (
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:
Выполните действия, чтобы создать назначаемое пользователем удостоверение.
Сохраните имя удостоверения, чтобы использовать его на последующих шагах.
Создайте хранилище ключей.
Выполните действия, описанные в кратком руководстве по созданию хранилища ключей с помощью портал Azure.
При создании хранилища ключей для ключа, управляемого клиентом, на вкладке Основные сведения включите параметр Защита от очистки . Этот параметр помогает предотвратить потерю данных из-за случайного удаления ключей или хранилищ ключей.
Включение доступа к хранилищу ключей для доверенных служб
Если хранилище ключей находится под защитой брандмауэра или виртуальной сети (частной конечной точки), включите параметр сети, чтобы разрешить доступ доверенным службам Azure. Дополнительные сведения см. в разделе Настройка сетевых параметров Azure Key Vault.
Включение управляемых удостоверений для доступа к хранилищу ключей
Существует два способа разрешить управляемым удостоверениям доступ к хранилищу ключей.
Первый вариант — настроить политику доступа для хранилища ключей и задать разрешения ключа для доступа с помощью управляемого удостоверения, назначаемого пользователем:
- Перейдите в хранилище ключей.
- Выберите пункт Параметры>Политика доступа > +Добавить политику доступа.
- Выберите Разрешения ключа, а затем выберите Получить, Распаковка ключа и Упаковка ключа.
- В разделе Выбор субъекта выберите имя ресурса для управляемого удостоверения, назначаемого пользователем.
- Нажмите кнопку Добавить, а затем нажмите кнопку Сохранить.
Другой вариант — назначить Key Vault Crypto Service Encryption User
роль RBAC управляемому удостоверению, назначаемому пользователем, в области хранилища ключей. Подробные инструкции см. в статье Назначение ролей Azure с помощью портала Microsoft Azure.
Создание ключа
Создайте ключ в хранилище ключей и используйте его для шифрования реестра. Выполните приведенные ниже действия, если необходимо выбрать конкретную версию ключа, управляемого клиентом. Кроме того, может потребоваться создать ключ перед созданием реестра, если доступ к хранилищу ключей ограничен частной конечной точкой или выбранными сетями.
- Перейдите в хранилище ключей.
- Последовательно выберите Параметры>Ключи.
- Выберите + создать или импортировать и введите уникальное имя для ключа.
- Примите остальные значения по умолчанию и нажмите кнопку Создать.
- После создания выберите ключ и его текущую версию. Скопируйте ИД ключа для версии ключа.
Создание реестра контейнеров
- Последовательно выберите Создать ресурс>Контейнеры>Реестр контейнеров.
- На вкладке Основные сведения выберите или создайте группу ресурсов, а затем введите имя реестра. В поле SKU выберите пункт Премиум.
- На вкладке Шифрование для параметра Ключ, управляемый клиентом, выберите Включено.
- В поле Удостоверение выберите созданное управляемое удостоверение.
- В поле Шифрование выберите один из следующих вариантов:
- Выберите Выбрать из Key Vault, а затем выберите существующее хранилище ключей и ключ или щелкните Создать. Выбранная клавиша отключена и включает автоматическую смену ключей.
- Выберите Ввести URI ключаи укажите идентификатор существующего ключа. Вы можете указать URI ключа с управлением версиями (для ключа, который необходимо сменить вручную) или универсальный код ресурса (URI) неверсивного ключа (который включает автоматическую смену ключей). См. шаги по созданию ключа в предыдущем разделе.
- Выберите Review + create (Просмотреть и создать).
- Нажмите кнопку Создать, чтобы активировать реестр.
Отображение состояния шифрования
Чтобы просмотреть состояние шифрования реестра на портале, перейдите к реестру. В разделе Параметры выберите Шифрование.
Включение ключа, управляемого клиентом, с помощью шаблона Resource Manager
Шаблон Resource Manager можно использовать для создания реестра контейнеров и включения шифрования с помощью ключа, управляемого клиентом:
Скопируйте следующее содержимое шаблона 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]" } ] }
Выполните действия, описанные в предыдущих разделах, чтобы создать следующие ресурсы:
- Хранилище ключей, идентифицируемое по имени
- Ключ хранилища ключей, идентифицируемый по идентификатору ключа
Выполните команду 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>
Выполните команду az acr encryption show , чтобы показать состояние шифрования реестра:
az acr encryption show --name <registry-name>
Дальнейшие действия
Перейдите к следующей статье , чтобы пошаговые инструкции по смене управляемых клиентом ключей, обновлению версий ключей и отзыву ключа, управляемого клиентом.