Добавление шифрования служба управления ключами и т. д. в кластер Служба Azure Kubernetes
В этой статье показано, как включить шифрование неактивных секретов Служба Azure Kubernetes (AKS) в хранилище ключей и т. д. с помощью Azure Key Vault и подключаемого модуля служба управления ключами (KMS). Подключаемый модуль KMS можно использовать для:
- Используйте ключ в хранилище ключей для шифрования etcd.
- создавать собственные ключи;
- Предоставьте шифрование неактивных данных для секретов, хранящихся в etcd.
- Смена ключей в хранилище ключей.
Дополнительные сведения об использовании KMS см. в разделе "Использование поставщика KMS для шифрования данных".
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Azure CLI 2.39.0 или более поздней версии. Чтобы узнать, какая версия используется, выполните команду
az --version
. Если вам необходимо выполнить установку или обновление, обратитесь к статье Установка Azure CLI.
Предупреждение
Начиная с 15 сентября 2024 г., Konnectivity больше не поддерживается для хранилищ закрытых ключей для новых подписок или подписок, которые ранее не использовали эту конфигурацию. Для подписок, которые в настоящее время используют эту конфигурацию или использовали ее за последние 60 дней, поддержка будет продолжаться до тех пор, пока AKS версии 1.30 не завершится срок действия для поддержки сообщества.
KMS поддерживает коннекттивность или интеграцию виртуальных сетей СЕРВЕРА API (предварительная версия) для хранилищ открытых ключей.
KMS поддерживает интеграцию виртуальных сетей API Server (предварительная версия) для частных и открытых хранилищ ключей.
Вы можете проверить 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 с параметром брандмауэра "Разрешить общедоступный доступ из определенных виртуальных сетей и IP-адресов" или "отключить общедоступный доступ" не поддерживается, так как он блокирует трафик от подключаемого модуля KMS к хранилищу ключей.
- Максимальное количество секретов, поддерживаемых кластером с включенным kmS, равно 2000. Однако важно отметить, что KMS версии 2 не ограничивается этим ограничением и может обрабатывать большее количество секретов.
- Не поддерживается собственное хранилище ключей Azure (BYO) из другого клиента.
- С включенной функцией KMS нельзя изменить связанный режим хранилища ключей (общедоступный и закрытый). Чтобы обновить режим хранилища ключей, сначала необходимо отключить KMS, а затем снова включить его.
- Если кластер включает KMS и имеет хранилище закрытых ключей, он должен использовать туннель интеграции виртуальной сети API-сервера (предварительная версия). Коннекттивность не поддерживается.
- Использование 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 -o 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 --name 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 \
--generate-ssh-keys
Обновление существующего кластера 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
.
Предупреждение
После смены ключей не забудьте обновить все секреты. Если вы не обновляете все секреты, секреты недоступны, если созданные ранее ключи не существуют или больше не работают.
KMS одновременно использует два ключа. После первого поворота ключа необходимо убедиться, что старые и новые ключи действительны (не истекли) до следующего поворота ключа. После смены второго ключа самый старый ключ можно безопасно удалить или с истекшим сроком действия.
После смены версии ключа KMS с новой keyId
, проверьте securityProfile.azureKeyVaultKms.keyId
json ресурсов AKS. Убедитесь, что используется новая версия ключа.
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.
Предупреждение
KMS поддерживает только интеграцию виртуальной сети СЕРВЕРА API (предварительная версия) для хранилища закрытых ключей.
Создание частного хранилища ключей и ключа
Предупреждение
Удаление ключа или хранилища ключей не поддерживается и приводит к тому, что секреты в кластере будут недоступны.
Если вам нужно восстановить хранилище ключей или ключ, ознакомьтесь с управлением восстановлением Azure Key Vault с обратимым удалением и защитой очистки.
Используется az keyvault create
для создания хранилища закрытых ключей:
az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
Используйте az keyvault key create
для создания ключа:
az keyvault key create --name MyKeyName --vault-name MyKeyVault
Создание или обновление ключей в хранилище закрытых ключей, у которых нет частной конечной точки, не поддерживается. Сведения об управлении хранилищами закрытых ключей см. в статье "Интеграция хранилища ключей с помощью Приватный канал 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 --name 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-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-id $KEY_ID \
--azure-keyvault-kms-key-vault-network-access "Private" \
--azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID \
--generate-ssh-keys
Обновление существующего кластера 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-id
az-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 можно удалить, не затрагивая существующий кластер.
После смены версии ключа KMS с новой keyId
, проверьте securityProfile.azureKeyVaultKms.keyId
json ресурсов AKS. Убедитесь, что используется новая версия ключа.
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
Для обновления всех секретов используйте приведенную ниже команду. Если эта команда не выполняется, секреты, созданные ранее, по-прежнему шифруются с помощью предыдущего ключа. Для больших кластеров может потребоваться разделить секреты по пространству имен или создать скрипт обновления.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Изменение режима хранилища ключей
Обновите хранилище ключей от общедоступного до закрытого:
az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled
Чтобы перейти из частного в общедоступный набор --public-network-access
, выполните Enabled
указанную выше команду.
Включение 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, обновление до версии 1.27 или более поздней будет заблокировано. Выполните следующие действия для миграции в KMS версии 2.
- Отключите KMS в кластере.
- Выполните миграцию хранилища.
- Обновите кластер до версии 1.27 или более поздней.
- Включите KMS в кластере.
- Выполните миграцию хранилища.
Отключение 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 -
Наблюдаемость KMS
JSON ресурса AKS
Конфигурацию KMS можно проверить в json ресурса AKS, выполнив следующие действия.
- Использование команды
az aks show
- С помощью портала Azure
В securityProfile.azureKeyVaultKms
разделе показана конфигурация KMS, включая хранилище ключей, ключ, текущие и предыдущие версии ключей.
Диагностика и решение проблем
Так как подключаемый модуль KMS является боковая машина kube-apiserver Pod, вы не можете получить к ней доступ напрямую. Чтобы улучшить наблюдаемость KMS, можно проверить состояние KMS следующим образом:
- Открытие страницы портала Azure кластера AKS
- Перейдите
Diagnose and solve problems
и найдитеKMS
- В
KMS
детекторе можно увидеть состояние KMS и если он находится в некоторых известных сценариях сбоя
Рассмотрим KeyExpired: Operation encrypt is not allowed on an expired key
пример:
Так как подключаемый модуль AKS KMS в настоящее время разрешает только хранилище ключей BYO и ключ, это ваша ответственность за управление жизненным циклом ключей. Если срок действия ключа истек, подключаемый модуль KMS не расшифровывает существующие секреты. Вам нужно
- Расширение срока действия ключа для работы KMS
- Смена версии ключа
Azure Kubernetes Service