Udostępnij przez


Wdrożenie klastra AKS przy użyciu kontenerów poufnych i automatycznie generowanej zasady

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

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

  • Wdrażanie lub uaktualnianie klastra usługi AKS przy użyciu interfejsu wiersza polecenia platformy Azure
  • Dodaj adnotację do manifestu YAML zasobnika, aby go oznaczyć jako korzystający z poufnych kontenerów.
  • Dodaj zasadę zabezpieczeń do manifestu YAML podu
  • Wdrażaj aplikację w przetwarzaniu poufnym

Ważne

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 Linux 2.0 platformy Azure został zamrożony w wersji 202512.06.0. Od 31 marca 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, zobacz [Wycofywanie] pul węzłów Azure Linux 2.0 w usłudze AKS.

Wymagania wstępne

  • Interfejs wiersza polecenia platformy Azure w wersji 2.44.1 lub nowszej. 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.

  • Rozszerzenie CLI platformy aks-preview Azure w wersji 0.5.169 lub nowszej.

  • Rozszerzenie Kontenera Poufnego interfejsu wiersza polecenia Azure w wersji 0.3.3 lub nowszej. confcom jest wymagane do wygenerowania zasad zabezpieczeń.

  • Zarejestruj funkcję w subskrypcji platformy Preview Azure.

  • Usługa AKS obsługuje poufne kontenery (wersja zapoznawcza) w wersji 1.25.0 lub nowszej.

  • 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 Microsoft Entra Workload ID, zapoznaj się z omówieniem Microsoft Entra Workload ID 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. Narzędzie kubectl można zainstalować lokalnie przy użyciu 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 aks-preview dla Azure CLI

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:

Aby zainstalować rozszerzenie aks-preview, uruchom następujące polecenie:

az extension add --name aks-preview

Uruchom następujące polecenie, aby zaktualizować rozszerzenie do najnowszej wersji:

az extension update --name aks-preview

Zainstaluj rozszerzenie Confcom dla interfejsu wiersza polecenia Azure

Aby zainstalować rozszerzenie confcom, uruchom następujące polecenie:

az extension add --name confcom

Uruchom następujące polecenie, aby zaktualizować rozszerzenie do najnowszej wersji:

az extension update --name confcom

Zarejestruj flagę funkcji KataCcIsolationPreview

Zarejestruj flagę funkcji KataCcIsolationPreview przy użyciu polecenia az feature register, jak pokazano w poniższym przykładzie.

az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

Wyświetlenie stanu Zarejestrowane trwa kilka minut. Sprawdź stan rejestracji przy użyciu polecenia az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

Gdy stan będzie odzwierciedlał wartość Zarejestrowano, odśwież rejestrację dostawcy zasobów Microsoft.ContainerService , używając polecenia az provider register :

az provider register --namespace "Microsoft.ContainerService"

Wdrażanie nowego klastra

  1. Przy użyciu polecenia az aks create utwórz klaster AKS i 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: dowolny rozmiar maszyny wirtualnej platformy Azure, obsługujący podrzędne maszyny wirtualne chronione przez protokół AMD SEV-SNP. Na przykład Standard_DC8as_cc_v5 maszyny wirtualne.
    • --enable-workload-identity: umożliwia utworzenie Identyfikatora obciążenia Microsoft Entra, co pozwala zasobnikom na korzystanie z tożsamości Kubernetes.
    • --enable-oidc-issuer: włącza wystawcę OpenID Connect (OIDC). Umożliwia to firmie Microsoft Entra ID lub innej platformie zarządzania tożsamościami i dostępem dostawcy usług w chmurze możliwość odnajdywania publicznych kluczy podpisywania serwera interfejsu API.
    • --workload-runtime: określ KataCcIsolation, aby włączyć funkcję Poufne Kontenery w puli węzłów.
    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
    

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

  2. Gdy klaster jest gotowy, użyj polecenia az aks get-credentials do pobrania poświadczeń klastra.

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

Wdrażanie w istniejącym klastrze

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

Aby włączyć poufne kontenery (wersja zapoznawcza), utwórz pulę węzłów do ich hostowania, używając następującego polecenia.

  1. Dodaj pulę węzłów do klastra usługi AKS, używając komendy 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 klastrów, 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: dowolny rozmiar maszyny wirtualnej platformy Azure, który obsługuje maszyny wirtualne podrzędne chronione przez protokół AMD SEV-SNP, działa. 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 włączyć poufne kontenery (wersja próbna) w klastrze.

    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 jest gotowy, użyj polecenia az aks get-credentials do pobrania poświadczeń klastra.

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

Konfigurowanie kontenera

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ć pracę z tym samouczkiem, musisz ustawić zmienne środowiskowe w sekcji Eksportowanie zmiennych środowiskowych w artykule Wdrażanie i konfigurowanie tożsamości obciążenia. Pamiętaj, aby ustawić zmienną SERVICE_ACCOUNT_NAMESPACE na kafka, i wykonać 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 kompleksowego szyfrowania komunikatów platformy Kafka przy użyciu kluczy szyfrowania zarządzanych przez moduły zabezpieczeń sprzętowych platformy Azure (mHSM). Klucz jest zwalniany tylko wtedy, gdy użytkownik platformy Kafka działa w kontenerze poufnym za pomocą kontenera aprowizacji wpisu tajnego zaświadczania platformy Azure wprowadzonego do zasobnika.

Ta konfiguracja jest oparta na następujących czterech 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 uruchomiony ze środowiskiem uruchomieniowym kata-cc wyposażony w kontener bezpiecznego wydania klucza w celu pobrania klucza prywatnego na potrzeby odszyfrowywania komunikatów platformy Kafka i renderowania komunikatów 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

    • Zmienna środowiska MANAGED_IDENTITY jest wymagana przez skrypt bash setup-key.sh.

    • 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, może być konieczne odczekanie do 24 godzin, ponieważ usługi zaplecza utrzymują pamięć podręczną dla każdej tożsamości zarządzanej na podstawie URI zasobu przez maksymalnie 24 godziny. Zobacz też: Rozwiązywanie problemów z kontrolą dostępu opartą na rolach platformy Azure.

  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.

Czyszczenie

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

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

Jeśli włączono Confidential Containers (wersja zapoznawcza) w istniejącym klastrze, możesz usunąć pody przy użyciu 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.