Поделиться через


Развертывание кластера 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"

Развертывание нового кластера

  1. Создайте кластер AKS с помощью команды az aks create и укажите следующие параметры:

    • --os-sku: AzureLinux. В этом предварительном выпуске поддерживается только os-sku Linux для Azure.
    • --node-vm-size: любой размер виртуальной машины Azure, который является виртуальной машиной поколения 2 и поддерживает вложенную виртуализацию. Например, Standard_DC8as_cc_v5 виртуальные машины.
    • --enable-workload-identity: позволяет создавать Идентификация рабочей нагрузки Microsoft Entra, позволяя pod использовать удостоверение Kubernetes.
    • --enable-oidc-issuer: включает издателя OpenID Подключение (OIDC). Он позволяет идентификатору Microsoft Entra или другой платформе управления удостоверениями поставщика облачных служб и платформой управления доступом обнаруживать открытые ключи подписывания сервера API.

    Следующий пример обновляет кластер с именем myAKSCluster и создает один системный пул узлов в myResourceGroup:

    az aks create --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <1.25.0 and above> --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
    

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

  2. Когда кластер готов, получите учетные данные кластера с помощью команды az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Добавьте пул узлов пользователя в myAKSCluster с двумя узлами в nodepool2 в myResourceGroup с помощью команды az aks nodepool add . Укажите следующие параметры:

    • --workload-runtime: укажите KataCcIsolation , чтобы включить функцию конфиденциальных контейнеров в пуле узлов. При использовании этого параметра эти другие параметры должны соответствовать следующим требованиям. В противном случае команда завершается ошибкой и сообщает о проблеме с соответствующими параметрами.
    • --os-sku: AzureLinux. В этом предварительном выпуске поддерживается только os-sku Linux для Azure.
    • --node-vm-size: любой размер виртуальной машины Azure, который является виртуальной машиной поколения 2 и поддерживает вложенную виртуализацию. Например, Standard_DC8as_cc_v5 виртуальные машины.
    az aks nodepool add --resource-group myResourceGroup --name nodepool2 --cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

Развертывание в существующем кластере

Чтобы использовать эту функцию с существующим кластером AKS, необходимо выполнить следующие требования:

Используйте следующую команду, чтобы включить конфиденциальные контейнеры (предварительная версия), создав пул узлов для размещения.

  1. Добавьте пул узлов в кластер 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, который является виртуальной машиной поколения 2 и поддерживает вложенную виртуализацию. Например, 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_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

  2. Выполните команду az aks update, чтобы включить конфиденциальные контейнеры (предварительная версия) в кластере.

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

  3. Когда кластер готов, получите учетные данные кластера с помощью команды az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Настройка контейнера

Прежде чем настроить доступ к Azure Key Vault и секрету, а также развернуть приложение в качестве конфиденциального контейнера, необходимо выполнить настройку удостоверения рабочей нагрузки.

Чтобы настроить удостоверение рабочей нагрузки, выполните следующие действия, описанные в статье "Развертывание и настройка удостоверения рабочей нагрузки".

  • Получение URL-адреса издателя OIDC
  • Создание управляемого удостоверения
  • Создание учетной записи службы Kubernetes
  • Установка учетных данных федеративного удостоверения

Важно!

Необходимо задать переменные среды из раздела "Экспорт переменных среды" в статье "Развертывание и настройка удостоверения рабочей нагрузки", чтобы продолжить работу с этим руководством. Не забудьте задать переменную SERVICE_ACCOUNT_NAMESPACEkafkaи выполнить команду 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.

  1. Предоставьте созданному ранее управляемому удостоверению и учетной записи доступ к хранилищу ключей. Назначение удостоверений офицера шифрования Key Vault и ролей Пользователя шифрования Key Vault Azure RBAC.

    Примечание.

    • Управляемое удостоверение — это значение, которое вы назначаете переменной USER_ASSIGNED_IDENTITY_NAME .

    • Чтобы добавить назначения ролей, необходимо иметь Microsoft.Authorization/roleAssignments/write и Microsoft.Authorization/roleAssignments/delete разрешения, такие как доступ к данным Key Vault Администратор istrator, user Access Администратор istrator или Owner.

    • Для поддержки ключей, защищенных 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
    
  2. Установите кластер Kafka в пространстве имен kafka, выполнив следующую команду:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Выполните следующую команду, чтобы применить kafka файл CR кластера.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Подготовьте ключ шифрования и расшифровки RSA с помощью скрипта Bash для рабочей нагрузки из GitHub. Сохраните файл как setup-key.sh.

  5. 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.

  6. Скопируйте следующий манифест 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-.

  7. Создайте политику безопасности для манифеста YAML потребителя Kafka и получите хэш политики безопасности, хранящейся в переменной WORKLOAD_MEASUREMENT , выполнив следующую команду:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Чтобы создать асимметричную пару ключей 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.shBash.

    • Открытый ключ будет сохранен kafka-encryption-demo-pub.pem после выполнения скрипта Bash.

    Важно!

    Если возникла ошибка ForbiddenByRbac, может потребоваться ждать до 24 часов, так как серверные службы для управляемых удостоверений поддерживают кэш на URI ресурса до 24 часов. См. также: устранение неполадок Azure RBAC.

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

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Скопируйте следующий манифест 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 которого было создано на предыдущем шаге.

  11. consumer Разверните манифесты YAML producer с помощью сохраненных ранее файлов.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Получите IP-адрес веб-службы с помощью следующей команды:

    kubectl get svc consumer -n kafka
    
  13. Скопируйте и вставьте внешний IP-адрес службы потребителей в браузер и просмотрите расшифрованное сообщение.

    Следующий пример напоминает выходные данные команды:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Кроме того, необходимо попытаться запустить потребитель в качестве обычного модуля pod Kubernetes, удалив и kata-cc runtime class удаляя спецификациюskr container. Так как вы не запускаете потребитель с классом среды выполнения kata-cc, вам больше не нужна политика.

  15. Удалите всю политику и снова просмотрите сообщения в браузере после повторного развертывания рабочей нагрузки. Сообщения отображаются как зашифрованный в кодировке 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.