Wdróż klaster AKS z poufnymi kontenerami i automatycznie wygenerowaną zasadą

W tym artykule użyjesz Azure CLI do wdrożenia klastra Azure Kubernetes Service (AKS) i skonfigurowania kontenerów poufnych (wersja zapoznawcza) z automatycznie wygenerowanymi zasadami zabezpieczeń. Następnie należy wdrożyć aplikację jako kontener poufny. Aby dowiedzieć się więcej, przeczytaj omówienie kontenerów poufnych usługi AKS.

Ogólnie rzecz biorąc, rozpoczęcie pracy z kontenerami poufnymi w usłudze AKS obejmuje następujące kroki.

  • Wdróż lub uaktualnij klaster usługi AKS przy użyciu Azure CLI.
  • Dodaj adnotację do manifestu YAML Poda, aby oznaczyć go jako używający kontenerów poufnych.
  • Dodaj zasady zabezpieczeń do manifestu YAML zasobnika.
  • Wdróż aplikację w przetwarzaniu poufnym.

Ważne

Począwszy od 30 listopada 2025 r., usługa Azure Kubernetes Service (AKS) nie obsługuje już ani nie zapewnia aktualizacji zabezpieczeń dla systemu Azure Linux 2.0. Obraz węzła systemu Azure Linux 2.0 jest zamrożony w wydaniu202512.06.0. Od 31 października 2026 r. obrazy węzłów zostaną usunięte i nie będzie można skalować pul węzłów. Przeprowadź migrację do obsługiwanej wersji systemu Linux platformy Azure, uaktualniając pule węzłów do obsługiwanej wersji rozwiązania Kubernetes lub migrując do systemu osSku AzureLinux3. Aby uzyskać więcej informacji, zapoznaj się z zgłoszeniem dotyczącym wycofania na GitHubie i ogłoszeniem o wycofaniu aktualizacji platformy Azure. Aby być na bieżąco z ogłoszeniami i aktualizacjami, śledź notatki o wydaniu AKS.

Wymagania wstępne

  • Najnowsza wersja interfejsu wiersza polecenia platformy Azure. Uruchom polecenie az version , aby znaleźć wersję i uruchomić polecenie az upgrade , aby uaktualnić wersję. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.
  • Najnowsza wersja rozszerzenia Azure CLI.
  • Najnowsza wersja rozszerzenia Azure CLI confcom Confidential Container. confcom jest wymagane do wygenerowania zasad zabezpieczeń.
  • Tożsamość obciążenia obliczeniowego i poświadczenie federacyjnej tożsamości. Poświadczenie tożsamości obciążenia umożliwia aplikacjom Kubernetes bezpieczny dostęp do zasobów platformy Azure przy użyciu identyfikatora Entra firmy Microsoft na podstawie kont usługi z adnotacjami. Jeśli nie znasz Tożsamość obciążeń Microsoft Entra, zapoznaj się z omówieniem Tożsamość obciążeń Microsoft Entra i zobacz, jak działa Workload Identity z usługą AKS.
  • Tożsamość używana do utworzenia klastra ma odpowiednie minimalne uprawnienia. Aby uzyskać więcej informacji na temat dostępu i tożsamości dla usługi AKS, zobacz Opcje dostępu i tożsamości dla usługi Azure Kubernetes Service (AKS).
  • Aby zarządzać klastrem Kubernetes, użyj narzędzia wiersza polecenia Kubernetes kubectl. Usługa Azure Cloud Shell jest dostarczana z usługą kubectl. Można zainstalować kubectl lokalnie za pomocą polecenia az aks install-cli.
  • Poufne kontenery w usłudze AKS zapewniają kontener typu open source sidecar na potrzeby uwierzytelniania i bezpiecznego wydania klucza. Przyczepka integruje się z usługa zarządzania kluczami (KMS), na przykład azure Key Vault, w celu wydania klucza do grupy kontenerów po zakończeniu walidacji. Wdrażanie zarządzanego modułu HSM usługi Azure Key Vault (sprzętowego modułu zabezpieczeń) jest opcjonalne, ale zalecane do obsługi integralności i zaświadczania na poziomie kontenera. Zobacz Przygotuj i aktywuj zarządzany HSM, aby wdrożyć zarządzany HSM.

Zainstaluj rozszerzenie Azure CLI aks-preview

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi, po uprzednim wyrażeniu zgody na ich użycie. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte wsparciem technicznym na zasadzie najlepszych starań. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

  1. Uruchom następujące polecenie, aby zainstalować aks-preview rozszerzenie:

    az extension add --name aks-preview
    
  2. Uruchom następujące polecenie, aby zaktualizować rozszerzenie do najnowszej wersji:

    az extension update --name aks-preview
    

Zainstaluj rozszerzenie Azure CLI confcom

  1. Uruchom następujące polecenie, aby zainstalować confcom rozszerzenie:

    az extension add --name confcom
    
  2. Uruchom następujące polecenie, aby zaktualizować rozszerzenie do najnowszej wersji:

    az extension update --name confcom
    

Zarejestruj flagę funkcji KataCcIsolationPreview

  1. Wykonaj polecenie az feature register, aby zarejestrować flagę funkcji KataCcIsolationPreview, jak pokazano w poniższym przykładzie:

    az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"
    
  2. Poczekaj kilka minut na wyświetlenie stanu Zarejestrowane. Uruchom polecenie , az feature show aby sprawdzić stan rejestracji:

    az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"
    
  3. Gdy stan to Zarejestrowano, uruchom polecenie az provider register, aby odświeżyć rejestrację dostawcy zasobów Microsoft.ContainerService:

    az provider register --namespace "Microsoft.ContainerService"
    

Tworzenie klastra z włączonymi kontenerami poufnymi

  1. Utwórz klaster usługi AKS za pomocą polecenia az aks create. Określ następujące parametry:

    • --os-sku: AzureLinux. Tylko os-sku systemu Linux na platformie Azure obsługuje tę funkcję w tej wersji zapoznawczej.
    • --node-vm-size: odpowiedni będzie każdy rozmiar maszyny wirtualnej platformy Azure, który obsługuje wirtualizację zagnieżdżoną dla podrzędnych maszyn wirtualnych chronionych przez AMD SEV-SNP. Na przykład Standard_DC8as_cc_v5 maszyny wirtualne.
    • --enable-workload-identity: Włącza tworzenie identyfikatora Tożsamość obciążeń Microsoft Entra, aby zasobniki mogły korzystać z tożsamości Kubernetes.
    • --enable-oidc-issuer: włącza wystawcę OpenID Connect (OIDC). Umożliwia platformie Microsoft Entra ID lub innej platformie zarządzania tożsamością i dostępem dostawcy chmury wykrywanie publicznych kluczy używanych do podpisywania przez serwer interfejsu API.
    • --workload-runtime: Ustaw KataCcIsolation, aby włączyć funkcję kontenerów poufnych w puli węzłów.
    az aks create --resource-group myResourceGroup --name myAKSCluster --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
    

    Po kilku minutach polecenie zostanie zakończone i zwróci informacje w formacie JSON dotyczące klastra.

  2. Gdy klaster będzie gotowy, pobierz poświadczenia klastra za pomocą polecenia az aks get-credentials.

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

Włącz kontenery poufne w istniejącym klastrze

Aby korzystać z tej funkcji z istniejącym klastrem usługi AKS, należy spełnić następujące wymagania:

Dodaj pulę węzłów z włączoną obsługą poufnych kontenerów

Użyj następującego polecenia, aby włączyć kontenery poufne (wersja zapoznawcza), tworząc pulę węzłów do ich obsługi.

  1. Dodaj pulę węzłów do klastra AKS za pomocą polecenia az aks nodepool add. Określ następujące parametry:

    • --resource-group: wprowadź nazwę istniejącej grupy zasobów, w ramach których ma zostać utworzony klaster usługi AKS.
    • --cluster-name: wprowadź unikatową nazwę klastra usługi AKS, taką jak myAKSCluster.
    • --name: wprowadź unikatową nazwę puli węzłów klastra, na przykład nodepool2.
    • --workload-runtime: określ KataCcIsolation, aby włączyć funkcję w puli węzłów. Wraz z parametrem --workload-runtime te inne parametry spełniają następujące wymagania. W przeciwnym razie polecenie kończy się niepowodzeniem i zgłasza problem z odpowiednimi parametrami.
    • --os-sku: AzureLinux. Tylko os-sku systemu Linux na platformie Azure obsługuje tę funkcję w tej wersji zapoznawczej.
    • --node-vm-size: odpowiedni będzie każdy rozmiar maszyny wirtualnej platformy Azure, który obsługuje wirtualizację zagnieżdżoną dla podrzędnych maszyn wirtualnych chronionych przez AMD SEV-SNP. Na przykład Standard_DC8as_cc_v5 maszyny wirtualne.

    Poniższy przykład dodaje pulę węzłów użytkownika do myAKSCluster z dwoma węzłami w nodepool2 w 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
    

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

  2. Uruchom polecenie az aks update, aby zsynchronizować konfigurację klastra po dodaniu puli węzłów poufnych kontenerów.

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

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

  3. Gdy klaster będzie gotowy, pobierz poświadczenia klastra za pomocą polecenia az aks get-credentials.

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

Wdrażanie i konfigurowanie tożsamości obciążenia

Przed skonfigurowaniem dostępu do usługi Azure Key Vault i tajemnicy oraz wdrożeniem aplikacji jako kontenera Poufny, należy ukończyć konfigurację tożsamości obciążenia.

Aby skonfigurować tożsamość obciążenia, wykonaj następujące kroki opisane w artykule Wdrażanie i konfigurowanie tożsamości obciążenia:

  • Pobierz adres URL wystawcy OIDC
  • Tworzenie tożsamości zarządzanej
  • Tworzenie konta usługi Kubernetes
  • Ustanawianie poświadczeń tożsamości federacyjnej

Ważne

Aby kontynuować ten samouczek, ustaw zmienne środowiskowe w sekcji Eksportowanie zmiennych środowiskowych w artykule Wdrażanie i konfigurowanie tożsamości obciążenia . Ustaw zmienną SERVICE_ACCOUNT_NAMESPACE na kafka, a następnie uruchom polecenie kubectl create namespace kafka przed skonfigurowaniem tożsamości obciążenia.

Rozmieść zaufaną aplikację przy użyciu kata-cc i kontenera uwierzytelniającego

Poniższe kroki umożliwiają skonfigurowanie szyfrowania end-to-end dla komunikatów Kafka przy użyciu kluczy szyfrowania zarządzanych przez Azure Managed Hardware Security Modules (Managed HSM). Klucz jest udostępniany tylko wtedy, gdy konsument Kafka działa w ramach Confidential Container, z kontenerem aprowizacji wpisów tajnych poświadczania Azure wstrzykniętym do poda.

Ta konfiguracja jest oparta na następujących trzech składnikach:

  • Klaster Kafka: prosty klaster Kafka wdrożony w przestrzeni nazw Kafka w ramach klastra.
  • Producent platformy Kafka: producent platformy Kafka działający jako zasobnik platformy Kubernetes, który wysyła zaszyfrowane komunikaty skonfigurowane przez użytkownika przy użyciu klucza publicznego do tematu platformy Kafka.
  • Użytkownik platformy Kafka: zasobnik klienta platformy Kafka, który działa ze środowiskiem uruchomieniowym kata-cc, pobiera klucz prywatny z kontenera bezpiecznego wydania klucza w celu odszyfrowania komunikatów platformy Kafka i renderuje komunikaty w internetowym interfejsie użytkownika.

W tej wersji zapoznawczej zalecamy przeprowadzenie testów i oceny, aby utworzyć lub użyć istniejącego zasobu warstwy Premium usługi Azure Key Vault do obsługi przechowywania kluczy w sprzętowym module zabezpieczeń (HSM). Nie zalecamy korzystania z magazynu kluczy produkcyjnych. Jeśli nie masz usługi Azure Key Vault, zobacz Tworzenie magazynu kluczy przy użyciu interfejsu wiersza polecenia platformy Azure.

  1. Przyznaj utworzonej wcześniej tożsamości zarządzanej oraz twojemu kontu dostęp do magazynu kluczy. Przypisz obie tożsamościom role Key Vault Crypto Officer i Key Vault Crypto User w ramach ról RBAC platformy Azure.

    Uwaga

    • Tożsamość zarządzana to wartość przypisana do zmiennej USER_ASSIGNED_IDENTITY_NAME .

    • Aby dodać przypisania ról, musisz mieć uprawnienia Microsoft.Authorization/roleAssignments/write i Microsoft.Authorization/roleAssignments/delete, takie jak Administrator dostępu do danych Key Vault, Administrator dostępu użytkowników lub Właściciel.

    • Aby obsługiwać klucze chronione przez moduł HSM, należy użyć jednostki SKU Premium usługi Key Vault.

    Uruchom następujące polecenie, aby ustawić zakres:

    AKV_SCOPE=$(az keyvault show --name <AZURE_AKV_RESOURCE_NAME> --query id --output tsv)
    

    Uruchom następujące polecenie, aby przypisać rolę administratora kryptograficznego usługi Key Vault.

    az role assignment create --role "Key Vault Crypto Officer" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    

    Uruchom następujące polecenie, aby przypisać rolę użytkownika kryptograficznego usługi Key Vault.

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Zainstaluj klaster Kafka w przestrzeni nazw platformy Kafka, uruchamiając następujące polecenie:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Uruchom następujące polecenie, aby zastosować plik CR klastra kafka .

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Przygotuj klucz szyfrowania/odszyfrowywania RSA przy użyciu skryptu powłoki Bash dla obciążenia zadań z GitHub. Zapisz plik jako setup-key.sh.

  5. Ustaw zmienną MAA_ENDPOINT środowiskową przy użyciu nazwy FQDN identyfikatora URI zaświadczenia, uruchamiając następujące polecenie.

    export MAA_ENDPOINT="$(az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-)"
    

    Sprawdź, czy pełna nazwa domeny (FQDN) dla URI zaświadczenia ma poprawny format (MAA_ENDPOINT nie powinien zawierać prefiksu "https://"):

    echo $MAA_ENDPOINT
    

    Uwaga

    Aby skonfigurować zaświadczanie Microsoft Azure, zobacz Szybki przewodnik: konfigurowanie zaświadczania Microsoft Azure za pomocą Azure CLI.

  6. Skopiuj następujący manifest YAML i zapisz go jako 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
    

    Uwaga

    Zaktualizuj wartość zmiennej środowiskowej SkrClientAKVEndpoint dla pod, aby odpowiadała adresowi URL usługi Azure Key Vault, pomijając wartość https:// protokołu. Bieżąca wartość symbolu zastępczego to myKeyVault.vault.azure.net. Zaktualizuj wartość zmiennej środowiskowej zasobnika SkrClientMAAEndpoint na wartość MAA_ENDPOINT. Wartość można znaleźć MAA_ENDPOINT , uruchamiając polecenie echo $MAA_ENDPOINT lub polecenie az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-.

  7. Wygeneruj zasady zabezpieczeń dla manifestu YAML odbiorcy platformy Kafka i uzyskaj skrót zasad zabezpieczeń przechowywanych w zmiennej WORKLOAD_MEASUREMENT , uruchamiając następujące polecenie:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Aby wygenerować parę kluczy asymetrycznych RSA (kluczy publicznych i prywatnych), uruchom setup-key.sh skrypt przy użyciu następującego polecenia. Wartość powinna być następująca <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>
    

    Uwaga

    • Skrypt powłoki bash setup-key.sh wymaga zmiennej środowiskowej MANAGED_IDENTITY.

    • Klucz publiczny zostanie zapisany jako kafka-encryption-demo-pub.pem po wykonaniu skryptu powłoki bash.

    Ważne

    Jeśli wystąpi błąd ForbiddenByRbac, poczekaj do 24 godzin. Usługi zaplecza buforują dane dla tożsamości zarządzanych osobno dla każdego identyfikatora URI zasobu przez okres do 24 godzin. Aby uzyskać więcej informacji, zobacz sekcję Rozwiązywanie problemów z Azure RBAC.

  9. Aby sprawdzić, czy klucze zostały pomyślnie przekazane do magazynu kluczy, uruchom następujące polecenia:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Skopiuj następujący manifest YAML i zapisz go jako 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
    

    Uwaga

    Zaktualizuj wartość, która rozpoczyna się od ciągu -----BEGIN PUBLIC KEY----- i kończy ciągiem -----END PUBLIC KEY-----, korzystając z zawartości z kafka-encryption-demo-pub.pem, która została utworzona w poprzednim kroku.

  11. consumer Wdróż manifesty YAML i producer przy użyciu zapisanych wcześniej plików.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Pobierz adres IP usługi internetowej przy użyciu następującego polecenia:

    kubectl get svc consumer -n kafka
    
  13. Skopiuj i wklej zewnętrzny adres IP usługi konsumenta w przeglądarce i obserwuj odszyfrowany komunikat.

    Poniższy przykład przypomina dane wyjściowe polecenia:

    Welcome to Confidential containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Należy również podjąć próbę uruchomienia konsumenta jako zwykłego zasobnika Kubernetes, usuwając specyfikację skr container i kata-cc runtime class . Ponieważ nie uruchamiasz konsumenta z klasą środowiska uruchomieniowego kata-cc, nie potrzebujesz już zasad.

  15. Usuń wszystkie zasady i ponownie obserwuj komunikaty w przeglądarce po ponownym uruchomieniu obciążenia. Komunikaty są wyświetlane jako szyfrogramy zakodowane w base64, ponieważ nie można pobrać prywatnego klucza szyfrowania. Nie można pobrać klucza, ponieważ konsument nie działa już w środowisku poufnym, a skr container jest brakującym elementem, co uniemożliwia odszyfrowywanie komunikatów.

Uprzątnij zasoby

Po zakończeniu oceny tej funkcji wyczyść niepotrzebne zasoby, aby uniknąć Azure opłat. Jeśli nowy klaster został wdrożony w ramach oceny lub testowania, możesz usunąć klaster przy użyciu az aks delete polecenia .

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

Jeśli w istniejącym klastrze włączono kontenery poufne (wersja zapoznawcza), możesz usunąć zasobniki za pomocą polecenia kubectl delete pod.

kubectl delete pod <pod-name>

Następne kroki

Dowiedz się więcej o Azure Dedicated hosts dla węzłów z klastrem AKS, aby korzystać z izolacji sprzętowej i kontroli nad zdarzeniami konserwacyjnymi platformy Azure.