Добавление шифрования служба управления ключами и т. д. в кластер Служба Azure Kubernetes

В этой статье показано, как включить шифрование неактивных секретов Служба Azure Kubernetes (AKS) в хранилище ключей и т. д. с помощью Azure Key Vault и подключаемого модуля служба управления ключами (KMS). Подключаемый модуль KMS можно использовать для:

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

Дополнительные сведения об использовании KMS см. в разделе "Шифрование неактивных секретных данных".

Необходимые компоненты

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
  • Azure CLI 2.39.0 или более поздней версии. Чтобы узнать, какая версия используется, выполните команду az --version. Если вам необходимо выполнить установку или обновление, обратитесь к статье Установка Azure CLI.

Предупреждение

KMS поддерживает интеграцию с виртуальной сетью сервера API (предварительная версия).

Вы можете проверить kubectl get po -n kube-system результаты и показать, что выполняется модуль pod konnectivity-agent. Если модуль pod запущен, кластер AKS использует Konnectivity. При использовании интеграции виртуальной сети сервера API можно выполнить az aks show -g -n команду, чтобы убедиться, что enableVnetIntegration для параметра задано значение true.

Ограничения

При интеграции шифрования KMS etcd с AKS действуют следующие ограничения:

  • Удаление ключа, хранилища ключей или связанного удостоверения не поддерживается.
  • Шифрование KMS etcd не работает с управляемым удостоверением, назначаемым системой. Перед включением функции необходимо задать политику доступа к хранилищу ключей. Управляемое удостоверение, назначаемое системой, недоступно до создания кластера. Рассмотрим зависимость цикла.
  • Azure Key Vault с брандмауэром, чтобы разрешить общедоступный доступ, не поддерживается, так как он блокирует трафик из подключаемого модуля KMS в хранилище ключей.
  • Максимальное количество секретов, поддерживаемых кластером с включенным kmS, равно 2000. Однако важно отметить, что KMS версии 2 не ограничивается этим ограничением и может обрабатывать большее количество секретов.
  • Не поддерживается собственное хранилище ключей Azure (BYO) из другого клиента.
  • С включенной функцией KMS нельзя изменить связанный режим хранилища ключей (общедоступный и закрытый). Чтобы обновить режим хранилища ключей, сначала необходимо отключить KMS, а затем снова включить его.
  • Если кластер включил KMS, имеет хранилище закрытых ключей и не использует туннель интеграции виртуальной сети API Server, вы не сможете остановить и запустить кластер.
  • Использование API Масштабируемые наборы виртуальных машин для масштабирования узлов в кластере до нуля. Затем кластер исчезает и становится неустранимым.
  • После отключения KMS невозможно уничтожить ключи. Уничтожение ключей приводит к остановке работы сервера API.

KMS поддерживает хранилище открытых ключей или закрытое хранилище ключей.

Включение KMS для хранилища открытых ключей

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

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

Предупреждение

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

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

Создание хранилища ключей и ключа для хранилища открытых ключей, отличных от RBAC

Используйте az keyvault create для создания хранилища ключей без использования управления доступом на основе ролей Azure (Azure RBAC):

az keyvault create --name MyKeyVault --resource-group MyResourceGroup

Используйте az keyvault key create для создания ключа:

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Используется az keyvault key show для экспорта идентификатора ключа:

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

В этом примере хранится идентификатор KEY_IDключа.

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

Используется az keyvault create для создания хранилища ключей с помощью Azure RBAC:

export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup  --enable-rbac-authorization true --query id -o tsv)

Назначьте себе разрешения для создания ключа:

az role assignment create --role "Key Vault Crypto Officer" --assignee-object-id $(az ad signed-in-user show --query id --out tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

Используйте az keyvault key create для создания ключа:

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Используется az keyvault key show для экспорта идентификатора ключа:

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

В этом примере хранится идентификатор KEY_IDключа.

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

Используется az identity create для создания управляемого удостоверения, назначаемого пользователем:

az identity create --name MyIdentity --resource-group MyResourceGroup

Используйте az identity show для получения идентификатора объекта удостоверения:

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

В предыдущем примере сохраняется значение идентификатора IDENTITY_OBJECT_IDобъекта удостоверения.

Используйте az identity show для получения идентификатора ресурса удостоверения:

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

В этом примере сохраняется значение идентификатора IDENTITY_RESOURCE_IDресурса удостоверения.

Назначение разрешений для расшифровки и шифрования хранилища открытых ключей

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

Назначение разрешений для хранилища открытых ключей, отличного от RBAC

Если хранилище ключей не задано, --enable-rbac-authorizationможно использовать az keyvault set-policy для создания политики хранилища ключей Azure.

az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Назначение разрешений для хранилища открытых ключей RBAC

Если для хранилища ключей задано --enable-rbac-authorizationзначение , назначьте роль пользователя шифрования Key Vault, чтобы предоставить расшифровку и шифрование разрешений.

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Создание кластера AKS с открытым хранилищем ключей и включение шифрования KMS и т. д.

Чтобы включить шифрование KMS и т. д., создайте кластер AKS с помощью команды az aks create . Вы можете использовать --enable-azure-keyvault-kms--azure-keyvault-kms-key-vault-network-accessпараметры и --azure-keyvault-kms-key-id параметры с az aks create.

az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

Обновление существующего кластера AKS для включения шифрования KMS и т. д. для хранилища открытых ключей

Чтобы включить шифрование KMS etcd для существующего кластера, используйте команду az aks update . Вы можете использовать --enable-azure-keyvault-kms--azure-keyvault-kms-key-vault-network-accessпараметры и --azure-keyvault-kms-key-id параметры с az-aks-update.

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

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

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Смена существующих ключей в хранилище открытых ключей

После изменения идентификатора ключа (включая изменение имени ключа или версии ключа), можно использовать команду az aks update . Для смены существующих ключей --enable-azure-keyvault-kms--azure-keyvault-kms-key-vault-network-accessв KMS можно использовать параметры и --azure-keyvault-kms-key-id параметрыaz-aks-update.

Предупреждение

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

После смены ключа предыдущий ключ (key1) по-прежнему кэшируется и не должен быть удален. Если вы хотите немедленно удалить предыдущий ключ (key1), необходимо дважды повернуть ключ. Затем кэшируются ключ 2 и key3, а ключ1 можно удалить, не затрагивая существующий кластер.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $NEW_KEY_ID 

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

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Включение KMS для хранилища закрытых ключей

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

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

Предупреждение

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

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

Используется az keyvault create для создания хранилища закрытых ключей:

az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

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

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

Используется az identity create для создания управляемого удостоверения, назначаемого пользователем:

az identity create --name MyIdentity --resource-group MyResourceGroup

Используйте az identity show для получения идентификатора объекта удостоверения:

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

В предыдущем примере сохраняется значение идентификатора IDENTITY_OBJECT_IDобъекта удостоверения.

Используйте az identity show для получения идентификатора ресурса удостоверения:

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

В этом примере сохраняется значение идентификатора IDENTITY_RESOURCE_IDресурса удостоверения.

Назначение разрешений для расшифровки и шифрования хранилища закрытых ключей

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

Назначение разрешений для хранилища закрытых ключей, отличных от RBAC

Примечание.

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

Если хранилище ключей не задано, --enable-rbac-authorizationможно использовать az keyvault set-policy для создания политики хранилища ключей в Azure:

az keyvault set-policy -n MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Назначение разрешений для хранилища закрытых ключей RBAC

Если хранилище ключей задано, --enable-rbac-authorizationназначьте роль Azure RBAC, включающую расшифровку и шифрование разрешений:

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Для хранилищ закрытых ключей роль участника Key Vault требуется для создания приватного канала между хранилищем закрытых ключей и кластером.

az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Создание кластера AKS с закрытым хранилищем ключей и включение шифрования KMS и т. д.

Чтобы включить шифрование KMS и т. д. для хранилища закрытых ключей, создайте кластер AKS с помощью команды az aks create . С помощью параметров и параметров можно использовать --enable-azure-keyvault-kms--azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access.--azure-keyvault-kms-key-vault-resource-idaz-aks-create

az aks create --name myAKSCluster --resource-group MyResourceGroup --assign-identity $IDENTITY_RESOURCE_ID --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Обновление существующего кластера AKS для включения шифрования KMS и т. д. для хранилища закрытых ключей

Чтобы включить шифрование KMS etcd в существующем кластере с закрытым хранилищем ключей, используйте команду az aks update . С помощью параметров и параметров можно использовать --enable-azure-keyvault-kms--azure-keyvault-kms-key-id--azure-keyvault-kms-key-vault-network-access.--azure-keyvault-kms-key-vault-resource-idaz-aks-update

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

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

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Смена существующих ключей в хранилище закрытых ключей

После изменения идентификатора ключа (включая имя ключа и версию ключа), можно использовать команду az aks update . С помощью параметров и --azure-keyvault-kms-key-vault-resource-id параметров az-aks-update можно --azure-keyvault-kms-key-vault-network-access--enable-azure-keyvault-kms--azure-keyvault-kms-key-idповернуть существующие ключи KMS.

Предупреждение

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

После смены ключа предыдущий ключ (key1) по-прежнему кэшируется и не должен быть удален. Если вы хотите немедленно удалить предыдущий ключ (key1), необходимо дважды повернуть ключ. Затем кэшируются ключ 2 и key3, а ключ1 можно удалить, не затрагивая существующий кластер.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

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

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Обновление режима хранилища ключей

Примечание.

Чтобы изменить другое хранилище ключей с другим режимом (общедоступным или частным), можно запустить az aks update напрямую. Чтобы изменить режим подключенного хранилища ключей, необходимо сначала отключить KMS, а затем снова включить его с помощью новых идентификаторов хранилища ключей.

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

Отключение KMS в кластере

Отключите KMS в существующем кластере и опустите хранилище ключей:

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Изменение режима хранилища ключей

Обновите хранилище ключей от общедоступного до закрытого:

az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Включение KMS для кластера с помощью обновленного хранилища ключей

Включите KMS с помощью обновленного хранилища закрытых ключей:

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

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

Отключение KMS

Перед отключением KMS можно использовать следующую команду Azure CLI, чтобы проверка включить ли KMS:

az aks list --query "[].{Name:name, KmsEnabled:securityProfile.azureKeyVaultKms.enabled, KeyId:securityProfile.azureKeyVaultKms.keyId}" -o table

Если результаты подтверждают, что KMS включен, выполните следующую команду, чтобы отключить KMS в кластере:

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

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

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Поддержка KMS версии 2

Начиная с AKS версии 1.27, включение функции KMS настраивает KMS версии 2. При использовании KMS версии 2 вы не ограничиваетесь 2000 секретами, поддерживаемыми более ранними версиями. Дополнительные сведения см. в разделе "Улучшения KMS версии 2".

Миграция на KMS версии 2

Если версия кластера позже 1.27, и вы уже включили KMS, обновление до KMS 1.27 или более поздней версии заблокировано. Выполните следующие действия для миграции в KMS версии 2.

  1. Отключите KMS в кластере.
  2. Выполните миграцию хранилища.
  3. Обновите кластер до версии 1.27 или более поздней.
  4. Включите KMS в кластере.
  5. Выполните миграцию хранилища.

Отключение KMS для переноса хранилища

Чтобы отключить KMS в существующем кластере, используйте az aks update команду с аргументом --disable-azure-keyvault-kms :

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Перенос хранилища

Чтобы обновить все секреты, используйте kubectl get secrets команду с аргументом --all-namespaces :

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Обновление кластера AKS

Чтобы обновить кластер AKS, используйте az aks upgrade команду. Задайте версию или более позднюю версию 1.27.x с помощью аргумента --kubernetes-version .

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <AKS version>

Приведем пример:

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version 1.27.1

Включение KMS после миграции хранилища

Вы можете снова включить функцию KMS в кластере, чтобы зашифровать секреты. После этого кластер AKS использует KMS версии 2. Если вы не хотите выполнить миграцию в KMS версии 2, можно создать новый кластер версии 1.27 или более поздней с включенным параметром KMS.

Перенос хранилища для KMS версии 2

Чтобы повторно зашифровать все секреты в KMS версии 2, используйте kubectl get secrets команду с аргументом --all-namespaces :

kubectl get secrets --all-namespaces -o json | kubectl replace -f -