Развертывание кластера AKS с конфиденциальными контейнерами и автоматически созданной политикой
В этой статье вы используете Azure CLI для развертывания кластера Служба Azure Kubernetes (AKS) и настройки конфиденциальных контейнеров (предварительная версия) с помощью автоматически созданной политики безопасности. Затем вы развернете приложение как конфиденциальный контейнер. Дополнительные сведения см. в обзоре конфиденциальных контейнеров AKS.
Как правило, приступая к работе с конфиденциальными контейнерами AKS, необходимо выполнить следующие действия.
- Развертывание или обновление кластера AKS с помощью Azure CLI
- Добавьте заметку в манифест YAML pod, чтобы пометить модуль pod как использование конфиденциальных контейнеров
- Добавление политики безопасности в манифест YAML pod
- Развертывание приложения в конфиденциальных вычислениях
Необходимые компоненты
Azure CLI версии 2.44.1 или более поздней версии. Запустите
az --version
, чтобы определить версию и запуститеaz upgrade
для обновления версии. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.Расширение
aks-preview
Azure CLI версии 0.5.169 или более поздней.Расширение Azure CLI конфиденциального
confcom
контейнера 0.3.3 или более поздней версии.confcom
требуется для создания политики безопасности.Зарегистрируйте функцию в подписке
Preview
Azure.AKS поддерживает конфиденциальные контейнеры (предварительная версия) версии 1.25.0 и выше.
Удостоверение рабочей нагрузки и федеративные учетные данные удостоверения. Учетные данные удостоверения рабочей нагрузки позволяют приложениям Kubernetes безопасно получать доступ к ресурсам Azure с помощью идентификатора Microsoft Entra на основе учетных записей службы с заметкой. Если вы не знакомы с Идентификация рабочей нагрузки Microsoft Entra, ознакомьтесь с Идентификация рабочей нагрузки Microsoft Entra обзором и ознакомьтесь с тем, как удостоверение рабочей нагрузки работает с AKS.
Удостоверение, используемое для создания кластера, имеет соответствующие минимальные разрешения. Дополнительные сведения о доступе и удостоверении для AKS см. в разделе "Параметры доступа и удостоверения" для Служба Azure Kubernetes (AKS).
Чтобы управлять кластером Kubernetes, используйте клиент командной строки Kubernetes kubectl. Azure Cloud Shell поставляется с
kubectl
. Kubectl можно установить локально с помощью команды az aks install-cli .Конфиденциальные контейнеры в AKS предоставляют боковую открытый код контейнер для аттестации и выпуска безопасного ключа. Боковая машина интегрируется с служба управления ключами (KMS), например Azure Key Vault, для освобождения ключа в группу контейнеров после завершения проверки. Развертывание управляемого модуля HSM управляемого хранилища ключей Azure (аппаратного модуля безопасности) является необязательным, но рекомендуется поддерживать целостность и аттестацию на уровне контейнера. См. статью "Подготовка и активация управляемого HSM " для развертывания управляемого устройства HSM.
Установка расширения Azure CLI для aks-preview
Внимание
Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.
Чтобы установить расширение aks-preview, выполните следующую команду:
az extension add --name aks-preview
Выполните следующую команду, чтобы обновить до последней версии расширения:
az extension update --name aks-preview
Установка расширения Azure CLI для конференц-связи
Чтобы установить расширение confcom, выполните следующую команду:
az extension add --name confcom
Выполните следующую команду, чтобы обновить до последней версии расширения:
az extension update --name confcom
Регистрация флага компонента KataCcIsolationPreview
Зарегистрируйте флаг компонента KataCcIsolationPreview
, используя команду az feature register, как показано в указанном ниже примере.
az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"
Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show :
az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"
Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью команды az provider register:
az provider register --namespace "Microsoft.ContainerService"
Развертывание нового кластера
Создайте кластер AKS с помощью команды az aks create и укажите следующие параметры:
- --os-sku: AzureLinux. В этом предварительном выпуске поддерживается только os-sku Linux для Azure.
- --node-vm-size: любой размер виртуальной машины Azure, поддерживающий защищенные дочерние виртуальные машины AMD SEV-SNP. Например, Standard_DC8as_cc_v5 виртуальные машины.
- --enable-workload-identity: позволяет создавать Идентификация рабочей нагрузки Microsoft Entra, позволяя pod использовать удостоверение Kubernetes.
- --enable-oidc-issuer: включает издателя OpenID Connect (OIDC). Он позволяет идентификатору Microsoft Entra или другой платформе управления удостоверениями поставщика облачных служб и платформой управления доступом обнаруживать открытые ключи подписывания сервера API.
- --workload-runtime: укажите KataCcIsolation , чтобы включить функцию конфиденциальных контейнеров в пуле узлов.
az aks create --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <1.25.0 and above> --os-sku AzureLinux --node-vm-size Standard_DC8as_cc_v5 --workload-runtime KataCcIsolation --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Когда кластер готов, получите учетные данные кластера с помощью команды az aks get-credentials .
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Развертывание в существующем кластере
Чтобы использовать эту функцию с существующим кластером AKS, необходимо выполнить следующие требования:
- Выполните действия, чтобы зарегистрировать флаг компонента KataCcIsolationPreview .
- Убедитесь, что кластер работает под управлением Kubernetes версии 1.25.0 и выше.
- Включите удостоверение рабочей нагрузки в кластере, если это еще не так.
Используйте следующую команду, чтобы включить конфиденциальные контейнеры (предварительная версия), создав пул узлов для размещения.
Добавьте пул узлов в кластер AKS с помощью команды az aks nodepool add . Укажите следующие параметры:
- --resource-group: введите имя существующей группы ресурсов, чтобы создать кластер AKS в.
- --cluster-name: введите уникальное имя кластера AKS, например myAKSCluster.
- --name: введите уникальное имя для пула узлов кластеров, например nodepool2.
- --workload-runtime: укажите KataCcIsolation , чтобы включить функцию в пуле узлов. Наряду с параметром
--workload-runtime
эти другие параметры должны соответствовать следующим требованиям. В противном случае команда завершается ошибкой и сообщает о проблеме с соответствующими параметрами. - --os-sku: AzureLinux. В этом предварительном выпуске поддерживается только os-sku Linux для Azure.
- --node-vm-size: любой размер виртуальной машины Azure, поддерживающий защищенную дочерними виртуальными машинами AMD SEV-SNP, работает вложенная виртуализация. Например, Standard_DC8as_cc_v5 виртуальные машины.
В следующем примере пул узлов пользователя добавляется в myAKSCluster с двумя узлами в nodepool2 в myResourceGroup:
az aks nodepool add --resource-group myResourceGroup --name nodepool2 –-cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC8as_cc_v5 --workload-runtime KataCcIsolation
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Выполните команду az aks update, чтобы включить конфиденциальные контейнеры (предварительная версия) в кластере.
az aks update --name myAKSCluster --resource-group myResourceGroup
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Когда кластер готов, получите учетные данные кластера с помощью команды az aks get-credentials .
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Настройка контейнера
Прежде чем настроить доступ к Azure Key Vault и секрету, а также развернуть приложение в качестве конфиденциального контейнера, необходимо выполнить настройку удостоверения рабочей нагрузки.
Чтобы настроить удостоверение рабочей нагрузки, выполните следующие действия, описанные в статье "Развертывание и настройка удостоверения рабочей нагрузки".
- Получение URL-адреса издателя OIDC
- Создание управляемого удостоверения
- Создание учетной записи службы Kubernetes
- Установка учетных данных федеративного удостоверения
Внимание
Необходимо задать переменные среды из раздела "Экспорт переменных среды" в статье "Развертывание и настройка удостоверения рабочей нагрузки", чтобы продолжить работу с этим руководством. Не забудьте задать переменную SERVICE_ACCOUNT_NAMESPACE
kafka
и выполнить команду kubectl create namespace kafka
перед настройкой удостоверения рабочей нагрузки.
Развертывание доверенного приложения с контейнером kata-cc и аттестации
Следующие действия по настройке сквозного шифрования для сообщений Kafka с помощью ключей шифрования, управляемых модулями безопасности оборудования Azure (mHSM). Ключ освобождается только в том случае, если потребитель Kafka выполняется в конфиденциальном контейнере с контейнером подготовки секретов аттестации Azure, внедренным в модуль pod.
Эта конфигурация основана на следующих четырех компонентах:
- Кластер Kafka: простой кластер Kafka, развернутый в пространстве имен Kafka в кластере.
- Производитель Kafka: Производитель Kafka, работающий в качестве ванильного модуля Kubernetes, который отправляет зашифрованные пользовательские сообщения с помощью открытого ключа в раздел Kafka.
- Потребитель Kafka: модуль pod потребителей Kafka, работающий с средой выполнения kata-cc, оснащен контейнером безопасного выпуска ключа, чтобы получить закрытый ключ для расшифровки сообщений Kafka и отрисовки сообщений в веб-интерфейсе.
В этом выпуске предварительной версии мы рекомендуем для тестирования и оценки создавать или использовать существующий ресурс уровня Azure Key Vault Premium для поддержки хранения ключей в аппаратном модуле безопасности (HSM). Не рекомендуется использовать хранилище ключей рабочей среды. Если у вас нет Azure Key Vault, см. статью "Создание хранилища ключей" с помощью Azure CLI.
Предоставьте созданному ранее управляемому удостоверению и учетной записи доступ к хранилищу ключей. Назначение удостоверений офицера шифрования Key Vault и ролей Пользователя шифрования Key Vault Azure RBAC.
Примечание.
Управляемое удостоверение — это значение, которое вы назначаете переменной
USER_ASSIGNED_IDENTITY_NAME
.Чтобы добавить назначения ролей, необходимо иметь
Microsoft.Authorization/roleAssignments/write
иMicrosoft.Authorization/roleAssignments/delete
разрешения, такие как администратор доступа к данным Key Vault, администратор доступа пользователей или владелец.Для поддержки ключей, защищенных HSM, необходимо использовать номер SKU Хранилища ключей уровня "Премиум".
Выполните следующую команду, чтобы задать область:
AKV_SCOPE=$(az keyvault show --name <AZURE_AKV_RESOURCE_NAME> --query id --output tsv)
Выполните следующую команду, чтобы назначить роль офицера шифрования Key Vault.
az role assignment create --role "Key Vault Crypto Officer" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
Выполните следующую команду, чтобы назначить роль пользователя шифрования Key Vault.
az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
Установите кластер Kafka в пространстве имен kafka, выполнив следующую команду:
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
Выполните следующую команду, чтобы применить
kafka
файл CR кластера.kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
Подготовьте ключ шифрования и расшифровки RSA с помощью скрипта Bash для рабочей нагрузки из GitHub. Сохраните файл как
setup-key.sh
.MAA_ENDPOINT
Задайте переменную среды с полным доменным именем URI аттестации, выполнив следующую команду.export MAA_ENDPOINT="$(az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-)"
Убедитесь, что полное доменное имя URI attest имеет правильный формат (MAA_ENDPOINT не должен включать префикс "https://"):
echo $MAA_ENDPOINT
Примечание.
Сведения о настройке Microsoft Аттестация Azure см. в кратком руководстве по настройке Аттестация Azure с помощью Azure CLI.
Скопируйте следующий манифест YAML и сохраните его как
consumer.yaml
.apiVersion: v1 kind: Pod metadata: name: kafka-golang-consumer namespace: kafka labels: azure.workload.identity/use: "true" app.kubernetes.io/name: kafka-golang-consumer spec: serviceAccountName: workload-identity-sa runtimeClassName: kata-cc-isolation containers: - image: "mcr.microsoft.com/aci/skr:2.7" imagePullPolicy: Always name: skr env: - name: SkrSideCarArgs value: ewogICAgImNlcnRjYWNoZSI6IHsKCQkiZW5kcG9pbnRfdHlwZSI6ICJMb2NhbFRISU0iLAoJCSJlbmRwb2ludCI6ICIxNjkuMjU0LjE2OS4yNTQvbWV0YWRhdGEvVEhJTS9hbWQvY2VydGlmaWNhdGlvbiIKCX0gIAp9 command: - /bin/skr volumeMounts: - mountPath: /opt/confidential-containers/share/kata-containers/reference-info-base64 name: endor-loc - image: "mcr.microsoft.com/acc/samples/kafka/consumer:1.0" imagePullPolicy: Always name: kafka-golang-consumer env: - name: SkrClientKID value: kafka-encryption-demo - name: SkrClientMAAEndpoint value: sharedeus2.eus2.test.attest.azure.net - name: SkrClientAKVEndpoint value: "myKeyVault.vault.azure.net" - name: TOPIC value: kafka-demo-topic command: - /consume ports: - containerPort: 3333 name: kafka-consumer resources: limits: memory: 1Gi cpu: 200m volumes: - name: endor-loc hostPath: path: /opt/confidential-containers/share/kata-containers/reference-info-base64 --- apiVersion: v1 kind: Service metadata: name: consumer namespace: kafka spec: type: LoadBalancer selector: app.kubernetes.io/name: kafka-golang-consumer ports: - protocol: TCP port: 80 targetPort: kafka-consumer
Примечание.
Обновите значение переменной
SkrClientAKVEndpoint
среды pod, чтобы она соответствовала URL-адресу Azure Key Vault, за исключением значенияhttps://
протокола. Текущее значение заполнителя значения равноmyKeyVault.vault.azure.net
. Обновите значение переменнойSkrClientMAAEndpoint
среды pod со значениемMAA_ENDPOINT
. Можно найти значениеMAA_ENDPOINT
, выполнив командуecho $MAA_ENDPOINT
или командуaz attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-
.Создайте политику безопасности для манифеста YAML потребителя Kafka и получите хэш политики безопасности, хранящейся в переменной
WORKLOAD_MEASUREMENT
, выполнив следующую команду:export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
Чтобы создать асимметричную пару ключей RSA (открытые и закрытые ключи), запустите
setup-key.sh
скрипт с помощью следующей команды.<Azure Key Vault URL>
Значение должно быть<your-unique-keyvault-name>.vault.azure.net
export MANAGED_IDENTITY=${USER_ASSIGNED_CLIENT_ID} bash setup-key.sh "kafka-encryption-demo" <Azure Key Vault URL>
Примечание.
Переменная
MANAGED_IDENTITY
envionment требуется скриптомsetup-key.sh
Bash.Открытый ключ будет сохранен
kafka-encryption-demo-pub.pem
после выполнения скрипта Bash.
Внимание
Если возникла ошибка
ForbiddenByRbac
, может потребоваться ждать до 24 часов, так как серверные службы для управляемых удостоверений поддерживают кэш на URI ресурса до 24 часов. См. также: устранение неполадок Azure RBAC.Чтобы убедиться, что ключи успешно отправлены в хранилище ключей, выполните следующие команды:
az account set --subscription <Subscription ID> az keyvault key list --vault-name <KeyVault Name> -o table
Скопируйте следующий манифест YAML и сохраните его как
producer.yaml
.apiVersion: v1 kind: Pod metadata: name: kafka-producer namespace: kafka spec: containers: - image: "mcr.microsoft.com/acc/samples/kafka/producer:1.0" name: kafka-producer command: - /produce env: - name: TOPIC value: kafka-demo-topic - name: MSG value: "Azure Confidential Computing" - name: PUBKEY value: |- -----BEGIN PUBLIC KEY----- MIIBojAN***AE= -----END PUBLIC KEY----- resources: limits: memory: 1Gi cpu: 200m
Примечание.
Обновите значение, которое начинается с
-----BEGIN PUBLIC KEY-----
и заканчивается строками-----END PUBLIC KEY-----
с содержимым, изkafka-encryption-demo-pub.pem
которого было создано на предыдущем шаге.consumer
Разверните манифесты YAMLproducer
с помощью сохраненных ранее файлов.kubectl apply -f consumer.yaml
kubectl apply -f producer.yaml
Получите IP-адрес веб-службы с помощью следующей команды:
kubectl get svc consumer -n kafka
Скопируйте и вставьте внешний IP-адрес службы потребителей в браузер и просмотрите расшифрованное сообщение.
Следующий пример напоминает выходные данные команды:
Welcome to Confidential Containers on AKS! Encrypted Kafka Message: Msg 1: Azure Confidential Computing
Кроме того, необходимо попытаться запустить потребитель в качестве обычного модуля pod Kubernetes, удалив и
kata-cc runtime class
удаляя спецификациюskr container
. Так как вы не запускаете потребитель с классом среды выполнения kata-cc, вам больше не нужна политика.Удалите всю политику и снова просмотрите сообщения в браузере после повторного развертывания рабочей нагрузки. Сообщения отображаются как зашифрованный в кодировке Base64 зашифрованный текст, так как закрытый ключ шифрования не может быть извлечен. Невозможно получить ключ, так как потребитель больше не работает в конфиденциальной среде, и
skr container
отсутствует, предотвращая расшифровку сообщений.
Очистка
После завершения оценки этой функции, чтобы избежать расходов Azure, очистите ненужные ресурсы. Если вы развернули новый кластер в рамках оценки или тестирования, можно удалить кластер с помощью команды az aks delete .
az aks delete --resource-group myResourceGroup --name myAKSCluster
Если вы включили конфиденциальные контейнеры (предварительная версия) в существующем кластере, вы можете удалить модули pod с помощью команды kubectl delete pod .
kubectl delete pod pod-name
Следующие шаги
- Дополнительные сведения о выделенных узлах Azure для узлов с кластером AKS для использования аппаратной изоляции и контроля за событиями обслуживания платформы Azure.
Azure Kubernetes Service