Dela via


Distribuera ett AKS-kluster med konfidentiella containrar och en standardprincip

I den här artikeln använder du Azure CLI för att distribuera ett AKS-kluster (Azure Kubernetes Service) och konfigurera konfidentiella containrar (förhandsversion) med en standardsäkerhetsprincip. Sedan distribuerar du ett program som en konfidentiell container. Mer information finns i översikten över KONFIDENTIELLA AKS-containrar.

I allmänhet innebär det följande steg att komma igång med KONFIDENTIELLA AKS-containrar.

  • Distribuera eller uppgradera ett AKS-kluster med hjälp av Azure CLI
  • Lägg till en anteckning i yaml-poddmanifestet för att markera podden som en konfidentiell container
  • Lägga till en säkerhetsprincip i yaml-poddmanifestet
  • Aktivera tillämpning av säkerhetsprincipen
  • Distribuera ditt program i konfidentiell databehandling

Förutsättningar

  • Azure CLI version 2.44.1 eller senare. Kör az --version för att hitta versionen och kör az upgrade för att uppgradera versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.

  • Azure CLI-tillägget aks-preview version 0.5.169 eller senare.

  • Azure confcom CLI-tillägget för konfidentiell container 0.3.3 eller senare. confcom krävs för att generera en säkerhetsprincip.

  • Registrera funktionen Preview i din Azure-prenumeration.

  • AKS stöder konfidentiella containrar (förhandsversion) på version 1.25.0 och senare.

  • En arbetsbelastningsidentitet och en federerad identitetsautentiseringsuppgift. Autentiseringsuppgifterna för arbetsbelastningsidentitet ger Kubernetes-program åtkomst till Azure-resurser på ett säkert sätt med ett Microsoft Entra-ID baserat på kommenterade tjänstkonton. Om du inte är bekant med Microsoft Entra-arbetsbelastnings-ID kan du läsa översikten över Microsoft Entra-arbetsbelastnings-ID och granska hur arbetsbelastningsidentitet fungerar med AKS.

  • Den identitet som du använder för att skapa klustret har lämpliga minimibehörigheter. Mer information om åtkomst och identitet för AKS finns i Åtkomst- och identitetsalternativ för Azure Kubernetes Service (AKS).

  • Om du vill hantera ett Kubernetes-kluster använder du Kubernetes-kommandoradsklienten kubectl. Azure Cloud Shell levereras med kubectl. Du kan installera kubectl lokalt med kommandot az aks install-cli .

  • Konfidentiella containrar på AKS tillhandahåller en öppen källkod container för attestering och säker nyckelutgivning. Sidovagnen integreras med en nyckelhanteringstjänst (KMS) (KMS), till exempel Azure Key Vault, för att frigöra en nyckel till containergruppen när valideringen har slutförts. Det är valfritt att distribuera en Hanterad HSM för Azure Key Vault (maskinvarusäkerhetsmodul) men rekommenderas för att stödja integritet och attestering på containernivå. Se Etablera och aktivera en hanterad HSM för att distribuera Managed HSM.

Installera Azure CLI-tillägget aks-preview

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och anmäl dig. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. AKS-förhandsversioner omfattas delvis av kundsupport på bästa sätt. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Kör följande kommando för att installera aks-preview-tillägget:

az extension add --name aks-preview

Kör följande kommando för att uppdatera till den senaste versionen av tillägget som släpptes:

az extension update --name aks-preview

Installera Azure CLI-tillägget för confcom

Kör följande kommando för att installera confcom-tillägget:

az extension add --name confcom

Kör följande kommando för att uppdatera till den senaste versionen av tillägget som släpptes:

az extension update --name confcom

Registrera funktionsflaggan KataCcIsolationPreview

Registrera funktionsflaggan KataCcIsolationPreview med kommandot az feature register , som du ser i följande exempel:

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

Det tar några minuter för statusen att visa Registrerad. Kontrollera registreringsstatusen med kommandot az feature show :

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

När statusen visar Registrerad uppdaterar du registreringen av Resursprovidern Microsoft.ContainerService med hjälp av kommandot az provider register :

az provider register --namespace "Microsoft.ContainerService"

Distribuera ett nytt kluster

  1. Skapa ett AKS-kluster med kommandot az aks create och ange följande parametrar:

    • --os-sku: AzureLinux. Endast Azure Linux os-sku stöder den här funktionen i den här förhandsversionen.
    • --node-vm-size: Alla Virtuella Azure-datorer som är en virtuell dator i generation 2 och som har stöd för kapslad virtualisering fungerar. Till exempel Standard_DC8as_cc_v5 virtuella datorer.
    • --enable-workload-identity: Gör det möjligt att skapa ett Microsoft Entra-arbetsbelastnings-ID som gör att poddar kan använda en Kubernetes-identitet.
    • --enable-oidc-issuer: Aktiverar OpenID Connect-utfärdare (OIDC). Det gör att ett Microsoft Entra-ID eller annan plattform för identitets- och åtkomsthantering för molnleverantörer kan identifiera API-serverns offentliga signeringsnycklar.

    I följande exempel uppdateras klustret med namnet myAKSCluster och en enda systemnodpool skapas i 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
    

    Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret. Klustret som skapades i föregående steg har en enda nodpool. I nästa steg lägger vi till en andra nodpool i klustret.

  2. När klustret är klart hämtar du autentiseringsuppgifterna för klustret med kommandot az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Lägg till en användarnodpool i myAKSCluster med två noder i nodepool2 i myResourceGroup med kommandot az aks nodepool add. Ange följande parametrar:

    • --workload-runtime: Ange KataCcIsolation för att aktivera funktionen Konfidentiella containrar i nodpoolen. Med den här parametern ska dessa andra parametrar uppfylla följande krav. Annars misslyckas kommandot och rapporterar ett problem med motsvarande parametrar.
    • --os-sku: AzureLinux. Endast Azure Linux os-sku stöder den här funktionen i den här förhandsversionen.
    • --node-vm-size: Alla Virtuella Azure-datorer som är en virtuell dator i generation 2 och som har stöd för kapslad virtualisering fungerar. Till exempel Standard_DC8as_cc_v5 virtuella datorer.
    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
    

Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

Distribuera till ett befintligt kluster

Om du vill använda den här funktionen med ett befintligt AKS-kluster måste följande krav uppfyllas:

Använd följande kommando för att aktivera konfidentiella containrar (förhandsversion) genom att skapa en nodpool som värd för den.

  1. Lägg till en nodpool i AKS-klustret med kommandot az aks nodepool add . Ange följande parametrar:

    • --resource-group: Ange namnet på en befintlig resursgrupp för att skapa AKS-klustret i.
    • --cluster-name: Ange ett unikt namn för AKS-klustret, till exempel myAKSCluster.
    • --name: Ange ett unikt namn för klusternodpoolen, till exempel nodepool2.
    • --workload-runtime: Ange KataCcIsolation för att aktivera funktionen i nodpoolen. Tillsammans med parametern --workload-runtime ska dessa andra parametrar uppfylla följande krav. Annars misslyckas kommandot och rapporterar ett problem med motsvarande parametrar.
    • --os-sku: AzureLinux. Endast Azure Linux os-sku stöder den här funktionen i den här förhandsversionen.
    • --node-vm-size: Alla Virtuella Azure-datorer som är en virtuell dator i generation 2 och som har stöd för kapslad virtualisering fungerar. Till exempel Standard_DC8as_cc_v5 virtuella datorer.

    I följande exempel läggs en användarnodpool till i myAKSCluster med två noder i nodepool2 i 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
    

    Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

  2. Kör kommandot az aks update för att aktivera konfidentiella containrar (förhandsversion) i klustret.

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

    Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

  3. När klustret är klart hämtar du autentiseringsuppgifterna för klustret med kommandot az aks get-credentials .

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

Konfigurera container

Innan du konfigurerar åtkomst till Azure Key Vault och hemligheten och distribuerar ett program som en konfidentiell container måste du slutföra konfigurationen av arbetsbelastningsidentiteten.

Utför följande steg som beskrivs i artikeln Distribuera och konfigurera arbetsbelastningsidentitet för att konfigurera arbetsbelastningsidentiteten:

  • Hämta url:en för OIDC-utfärdaren
  • Skapa en hanterad identitet
  • Skapa Kubernetes-tjänstkonto
  • Upprätta federerade identitetsautentiseringsuppgifter

Viktigt!

Du måste ange miljövariablerna från avsnittet Exportera miljövariabler i artikeln Distribuera och konfigurera arbetsbelastningsidentitet för att fortsätta slutföra den här självstudien. Kom ihåg att ange variabeln SERVICE_ACCOUNT_NAMESPACE till kafkaoch köra kommandot kubectl create namespace kafka innan du konfigurerar arbetsbelastningsidentiteten.

Distribuera ett betrott program med kata-cc och attesteringscontainer

Följande steg konfigurerar kryptering från slutpunkt till slutpunkt för Kafka-meddelanden med hjälp av krypteringsnycklar som hanteras av Azure Managed Hardware Security Modules (mHSM). Nyckeln släpps bara när Kafka-konsumenten körs i en konfidentiell container med en Azure-attesteringscontainer för hemlig etablering som matas in i podden.

Den här konfigurationen baseras på följande fyra komponenter:

  • Kafka-kluster: Ett enkelt Kafka-kluster som distribueras i Kafka-namnområdet i klustret.
  • Kafka-producent: En Kafka-producent som körs som en vanilj-Kubernetes-podd som skickar krypterade användarkonfigurerade meddelanden med hjälp av en offentlig nyckel till ett Kafka-ämne.
  • Kafka Consumer: En Kafka-konsumentpodd som körs med kata-cc-körningen, utrustad med en container för säker nyckelfrisättning för att hämta den privata nyckeln för dekryptering av Kafka-meddelanden och återge meddelandena till webbgränssnittet.

För den här förhandsversionen rekommenderar vi att du i test- och utvärderingssyfte antingen skapar eller använder en befintlig Azure Key Vault Premium-nivåresurs för att lagra nycklar i en maskinvarusäkerhetsmodul (HSM). Vi rekommenderar inte att du använder ditt nyckelvalv för produktion. Om du inte har något Azure Key Vault läser du Skapa ett nyckelvalv med Azure CLI.

  1. Ge den hanterade identitet som du skapade tidigare och ditt konto åtkomst till nyckelvalvet. Tilldela båda identiteterna Key Vault Crypto Officer - och Key Vault Crypto User Azure RBAC-roller.

    Kommentar

    • Den hanterade identiteten är det värde som du tilldelar variabeln USER_ASSIGNED_IDENTITY_NAME .

    • Om du vill lägga till rolltilldelningar måste du ha Microsoft.Authorization/roleAssignments/write och Microsoft.Authorization/roleAssignments/delete behörigheter, till exempel Key Vault Data Access Administrator, User Access Administrator eller Owner.

    • Du måste använda Key Vault Premium SKU för att stödja HSM-skyddade nycklar.

    Kör följande kommando för att ange omfånget:

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

    Kör följande kommando för att tilldela rollen Key Vault Crypto Officer .

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

    Kör följande kommando för att tilldela key vault crypto-användarrollen.

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Installera Kafka-klustret i kafka-namnområdet genom att köra följande kommando:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Kör följande kommando för att tillämpa klustrets kafka CR-fil.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Förbered RSA-krypterings-/dekrypteringsnyckeln med bash-skriptet för arbetsbelastningen från GitHub. Spara filen som setup-key.sh.

  5. MAA_ENDPOINT Ange miljövariabeln med FQDN för attest-URI genom att köra följande kommando.

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

    Kontrollera om FQDN för attest-URI:n är i rätt format (MAA_ENDPOINT bör inte innehålla prefixet "https://"):

    echo $MAA_ENDPOINT
    

    Kommentar

    Information om hur du konfigurerar Microsoft Azure Attestation finns i Snabbstart: Konfigurera Azure Attestation med Azure CLI.

  6. Kopiera följande YAML-manifest och spara det som 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
    

    Kommentar

    Uppdatera värdet för poddmiljövariabeln SkrClientAKVEndpoint så att det matchar URL:en för ditt Azure Key Vault, exklusive protokollvärdet https://. Det aktuella värdets platshållarvärde är myKeyVault.vault.azure.net. Uppdatera värdet för poddmiljövariabeln SkrClientMAAEndpoint med värdet MAA_ENDPOINT. Du hittar värdet MAA_ENDPOINT för genom att köra kommandot echo $MAA_ENDPOINT eller kommandot az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-.

  7. Generera säkerhetsprincipen för Kafka-konsument-YAML-manifestet och hämta hashen för säkerhetsprincipen som lagras i variabeln WORKLOAD_MEASUREMENT genom att köra följande kommando:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Om du vill generera ett Asymmetriskt RSA-nyckelpar (offentliga och privata nycklar) kör du skriptet setup-key.sh med hjälp av följande kommando. Värdet <Azure Key Vault URL> ska vara <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>
    

    Kommentar

    • Envionment-variabeln MANAGED_IDENTITY krävs av bash-skriptet setup-key.sh.

    • Den offentliga nyckeln sparas som kafka-encryption-demo-pub.pem när bash-skriptet har körts.

    Viktigt!

    Om du får felet ForbiddenByRbackan du behöva vänta upp till 24 timmar eftersom serverdelstjänsterna för hanterade identiteter har en cache per resurs-URI i upp till 24 timmar. Se även: Felsöka Azure RBAC.

  9. Kontrollera att nycklarna har laddats upp till nyckelvalvet genom att köra följande kommandon:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Kopiera följande YAML-manifest och spara det som 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
    

    Kommentar

    Uppdatera värdet som börjar med -----BEGIN PUBLIC KEY----- och slutar med -----END PUBLIC KEY----- strängar med innehållet kafka-encryption-demo-pub.pem som skapades i föregående steg.

  11. Distribuera YAML-manifesten consumer och producer med de filer som du sparade tidigare.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Hämta IP-adressen för webbtjänsten med hjälp av följande kommando:

    kubectl get svc consumer -n kafka
    
  13. Kopiera och klistra in konsumenttjänstens externa IP-adress i webbläsaren och observera det dekrypterade meddelandet.

    Följande exempel liknar kommandots utdata:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Du bör också försöka köra konsumenten som en vanlig Kubernetes-podd genom att ta bort specifikationen skr container och kata-cc runtime class . Eftersom du inte kör konsumenten med kata-cc runtime-klassen behöver du inte längre principen.

  15. Ta bort hela principen och observera meddelandena igen i webbläsaren när du har distribuerat om arbetsbelastningen. Meddelanden visas som base64-kodad chiffertext eftersom den privata krypteringsnyckeln inte kan hämtas. Det går inte att hämta nyckeln eftersom konsumenten inte längre körs i en konfidentiell miljö och skr container saknas, vilket förhindrar dekryptering av meddelanden.

Rensa

När du är klar med utvärderingen av den här funktionen rensar du dina onödiga resurser för att undvika Azure-avgifter. Om du har distribuerat ett nytt kluster som en del av utvärderingen eller testningen kan du ta bort klustret med kommandot az aks delete .

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

Om du har aktiverat Konfidentiella containrar (förhandsversion) i ett befintligt kluster kan du ta bort poddarna med kommandot kubectl delete pod .

kubectl delete pod pod-name

Nästa steg

  • Läs mer om Azure Dedicated-värdar för noder med ditt AKS-kluster för att använda maskinvaruisolering och kontroll över azure-plattformsunderhållshändelser.