Delen via


Een AKS-cluster implementeren met vertrouwelijke containers en een standaardbeleid

In dit artikel gebruikt u de Azure CLI om een AKS-cluster (Azure Kubernetes Service) te implementeren en vertrouwelijke containers (preview) te configureren met een standaardbeveiligingsbeleid. Vervolgens implementeert u een toepassing als een vertrouwelijke container. Lees het overzicht van vertrouwelijke AKS-containers voor meer informatie.

Over het algemeen zijn de volgende stappen nodig om aan de slag te gaan met vertrouwelijke AKS-containers.

  • Een AKS-cluster implementeren of upgraden met behulp van de Azure CLI
  • Een aantekening toevoegen aan uw YAML-manifest voor pods om de pod te markeren als een vertrouwelijke container
  • Een beveiligingsbeleid toevoegen aan uw YAML-manifest voor pods
  • Afdwingen van het beveiligingsbeleid inschakelen
  • Uw toepassing implementeren in Confidential Computing

Vereisten

  • Azure CLI versie 2.44.1 of hoger. Voer az --version deze uit om de versie te vinden en voer deze uit az upgrade om de versie te upgraden. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.

  • De aks-preview Azure CLI-extensie versie 0.5.169 of hoger.

  • De confcom Azure CLI-extensie Confidential Container 0.3.3 of hoger. confcom is vereist om een beveiligingsbeleid te genereren.

  • Registreer de Preview functie in uw Azure-abonnement.

  • AKS ondersteunt Vertrouwelijke containers (preview) op versie 1.25.0 en hoger.

  • Een workloadidentiteit en een federatieve identiteitsreferentie. Met de identiteitsreferenties van de workload kunnen Kubernetes-toepassingen veilig toegang krijgen tot Azure-resources met een Microsoft Entra-id op basis van geannoteerde serviceaccounts. Als u niet bekend bent met Microsoft Entra Workload-ID, raadpleegt u het Microsoft Entra Workload-ID overzicht en bekijkt u hoe workloadidentiteit werkt met AKS.

  • De identiteit die u gebruikt om uw cluster te maken, heeft de juiste minimale machtigingen. Zie Toegangs- en identiteitsopties voor Azure Kubernetes Service (AKS) voor meer informatie over toegang en identiteit voor AKS.

  • Gebruik de Kubernetes-opdrachtregelclient kubectl om een Kubernetes-cluster te beheren. Azure Cloud Shell wordt geleverd met kubectl. U kunt kubectl lokaal installeren met behulp van de opdracht az aks install-cli .

  • Vertrouwelijke containers op AKS bieden een open source sidecar-container voor attestation en beveiligde sleutelrelease. De sidecar kan worden geïntegreerd met een KMS (Key Management Service), zoals Azure Key Vault, voor het vrijgeven van een sleutel aan de containergroep nadat de validatie is voltooid. Het implementeren van een door Azure Key Vault beheerde HSM (Hardware Security Module) is optioneel, maar wordt aanbevolen om integriteit en attestation op containerniveau te ondersteunen. Zie Een beheerde HSM inrichten en activeren om beheerde HSM te implementeren.

De Azure CLI-extensie aks-preview installeren

Belangrijk

AKS preview-functies zijn beschikbaar op selfservice, opt-in basis. Previews worden geleverd 'zoals is' en 'als beschikbaar' en ze worden uitgesloten van de serviceovereenkomsten en beperkte garantie. AKS-previews worden gedeeltelijk gedekt door klantondersteuning op basis van best effort. Daarom zijn deze functies niet bedoeld voor productiegebruik. Zie de volgende ondersteuningsartikelen voor meer informatie:

Voer de volgende opdracht uit om de aks-preview-extensie te installeren:

az extension add --name aks-preview

Voer de volgende opdracht uit om bij te werken naar de nieuwste versie van de extensie die is uitgebracht:

az extension update --name aks-preview

De Confcom Azure CLI-extensie installeren

Voer de volgende opdracht uit om de confcom-extensie te installeren:

az extension add --name confcom

Voer de volgende opdracht uit om bij te werken naar de nieuwste versie van de extensie die is uitgebracht:

az extension update --name confcom

De kataCcIsolationPreview-functievlag registreren

Registreer de KataCcIsolationPreview functievlag met behulp van de opdracht az feature register , zoals wordt weergegeven in het volgende voorbeeld:

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

Het duurt enkele minuten voordat de status Geregistreerd wordt weergegeven. Controleer de registratiestatus met behulp van de opdracht az feature show :

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

Wanneer de status Geregistreerd is, vernieuwt u de registratie van de Resourceprovider Microsoft.ContainerService met behulp van de opdracht az provider register:

az provider register --namespace "Microsoft.ContainerService"

Een nieuw cluster implementeren

  1. Maak een AKS-cluster met behulp van de opdracht az aks create en geef de volgende parameters op:

    • --os-sku: AzureLinux. Alleen de Besturingssysteem-sku van Azure Linux ondersteunt deze functie in deze preview-versie.
    • --node-vm-size: elke Azure-VM-grootte die een vm van de tweede generatie is en ondersteuning biedt voor geneste virtualisatie werkt. Bijvoorbeeld Standard_DC8as_cc_v5 VM's.
    • --enable-workload-identity: maakt het mogelijk om een Microsoft Entra Workload-ID pods in staat te stellen een Kubernetes-identiteit te gebruiken.
    • --enable-oidc-issuer: hiermee schakelt u OIDC-verlener (OpenID Connect) in. Hiermee kan een Microsoft Entra-id of een ander identiteits- en toegangsbeheerplatform van de cloudprovider de mogelijkheid krijgen om de openbare ondertekeningssleutels van de API-server te detecteren.

    In het volgende voorbeeld wordt het cluster met de naam myAKSCluster bijgewerkt en wordt één systeemknooppuntgroep gemaakt in 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
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling. Het cluster dat in de vorige stap is gemaakt, heeft één knooppuntgroep. In de volgende stap voegen we een tweede knooppuntgroep toe aan het cluster.

  2. Wanneer het cluster klaar is, haalt u de clusterreferenties op met behulp van de opdracht az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Voeg een gebruikersknooppuntgroep toe aan myAKSCluster met twee knooppunten in nodepool2 in myResourceGroup met behulp van de opdracht az aks nodepool add. Geef de volgende parameters op:

    • --workload-runtime: Geef KataCcIsolation op om de functie Vertrouwelijke containers in te schakelen in de knooppuntgroep. Met deze parameter voldoen deze andere parameters aan de volgende vereisten. Anders mislukt de opdracht en rapporteert deze een probleem met de bijbehorende parameters.
    • --os-sku: AzureLinux. Alleen de Besturingssysteem-sku van Azure Linux ondersteunt deze functie in deze preview-versie.
    • --node-vm-size: elke Azure-VM-grootte die een vm van de tweede generatie is en ondersteuning biedt voor geneste virtualisatie werkt. Bijvoorbeeld Standard_DC8as_cc_v5 VM's.
    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
    

Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

Implementeren in een bestaand cluster

Als u deze functie wilt gebruiken met een bestaand AKS-cluster, moet aan de volgende vereisten worden voldaan:

  • Volg de stappen om de kataCcIsolationPreview-functievlag te registreren.
  • Controleer of op het cluster Kubernetes versie 1.25.0 en hoger wordt uitgevoerd.
  • Schakel de workloadidentiteit in het cluster in als dit nog niet is gebeurd.

Gebruik de volgende opdracht om Vertrouwelijke containers (preview) in te schakelen door een knooppuntgroep te maken om deze te hosten.

  1. Voeg een knooppuntgroep toe aan uw AKS-cluster met behulp van de opdracht az aks nodepool add . Geef de volgende parameters op:

    • --resource-group: Voer de naam in van een bestaande resourcegroep waarin u het AKS-cluster wilt maken.
    • --clusternaam: Voer een unieke naam in voor het AKS-cluster, zoals myAKSCluster.
    • --name: Voer een unieke naam in voor uw clusterknooppuntgroep, zoals nodepool2.
    • --workload-runtime: Geef KataCcIsolation op om de functie in te schakelen in de knooppuntgroep. Naast de --workload-runtime parameter voldoen deze andere parameters aan de volgende vereisten. Anders mislukt de opdracht en rapporteert deze een probleem met de bijbehorende parameters.
    • --os-sku: AzureLinux. Alleen de Besturingssysteem-sku van Azure Linux ondersteunt deze functie in deze preview-versie.
    • --node-vm-size: elke Azure-VM-grootte die een vm van de tweede generatie is en ondersteuning biedt voor geneste virtualisatie werkt. Bijvoorbeeld Standard_DC8as_cc_v5 VM's.

    In het volgende voorbeeld wordt een gebruikersknooppuntgroep toegevoegd aan myAKSCluster met twee knooppunten in nodepool2 in de 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
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  2. Voer de opdracht az aks update uit om Confidential Containers (preview) in te schakelen op het cluster.

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

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  3. Wanneer het cluster klaar is, haalt u de clusterreferenties op met behulp van de opdracht az aks get-credentials .

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

Container configureren

Voordat u de toegang tot De Azure Key Vault en het geheim configureert en een toepassing implementeert als een vertrouwelijke container, moet u de configuratie van de workloadidentiteit voltooien.

Als u de workloadidentiteit wilt configureren, moet u de volgende stappen uitvoeren die worden beschreven in het artikel Workloadidentiteit implementeren en configureren :

  • De URL van de OIDC-verlener ophalen
  • Een beheerde identiteit maken
  • Kubernetes-serviceaccount maken
  • Federatieve identiteitsreferenties instellen

Belangrijk

U moet de omgevingsvariabelen instellen in de sectie Omgevingsvariabelen exporteren in het artikel Workloadidentiteit implementeren en configureren om door te gaan met het voltooien van deze zelfstudie. Vergeet niet om de variabele SERVICE_ACCOUNT_NAMESPACE in te kafkastellen op en voer de opdracht kubectl create namespace kafka uit voordat u de workloadidentiteit configureert.

Een vertrouwde toepassing implementeren met kata-cc en attestation-container

Met de volgende stappen configureert u end-to-end-versleuteling voor Kafka-berichten met behulp van versleutelingssleutels die worden beheerd door Azure Managed Hardware Security Modules (mHSM). De sleutel wordt alleen vrijgegeven wanneer de Kafka-consument wordt uitgevoerd in een vertrouwelijke container met een Azure Attestation-geheime inrichtingscontainer die is geïnjecteerd in de pod.

Deze configuratie is gebaseerd op de volgende vier onderdelen:

  • Kafka-cluster: een eenvoudig Kafka-cluster dat is geïmplementeerd in de Kafka-naamruimte op het cluster.
  • Kafka Producer: een Kafka-producent die wordt uitgevoerd als een vanille Kubernetes-pod waarmee versleutelde door de gebruiker geconfigureerde berichten worden verzonden met behulp van een openbare sleutel naar een Kafka-onderwerp.
  • Kafka Consumer: een Kafka-consumentenpod die wordt uitgevoerd met de kata-cc-runtime, uitgerust met een beveiligde sleutelreleasecontainer om de persoonlijke sleutel op te halen voor het ontsleutelen van Kafka-berichten en de berichten weer te geven aan de webgebruikersinterface.

Voor deze preview-versie wordt u aangeraden voor test- en evaluatiedoeleinden om een bestaande Azure Key Vault Premium-laagresource te maken of te gebruiken ter ondersteuning van het opslaan van sleutels in een HSM (Hardware Security Module). Het wordt afgeraden om uw productiesleutelkluis te gebruiken. Als u geen Azure Key Vault hebt, raadpleegt u Een sleutelkluis maken met behulp van de Azure CLI.

  1. Verdeel de beheerde identiteit die u eerder hebt gemaakt en uw account toegang tot de sleutelkluis. Wijs beide identiteiten toe aan de Key Vault Crypto Officer en Key Vault Crypto User Azure RBAC-rollen.

    Notitie

    • De beheerde identiteit is de waarde die u aan de USER_ASSIGNED_IDENTITY_NAME variabele toewijst.

    • Als u roltoewijzingen wilt toevoegen, moet u beschikken Microsoft.Authorization/roleAssignments/write over en Microsoft.Authorization/roleAssignments/delete machtigingen, zoals Key Vault Data Access Administrator, Administrator voor gebruikerstoegang of Eigenaar.

    • U moet de Key Vault Premium-SKU gebruiken om met HSM beveiligde sleutels te ondersteunen.

    Voer de volgende opdracht uit om het bereik in te stellen:

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

    Voer de volgende opdracht uit om de rol Key Vault Crypto Officer toe te wijzen.

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

    Voer de volgende opdracht uit om de cryptogebruikersrol Key Vault toe te wijzen.

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Installeer het Kafka-cluster in de kafka-naamruimte door de volgende opdracht uit te voeren:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Voer de volgende opdracht uit om het kafka CR-clusterbestand toe te passen.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Bereid de RSA-versleutelings-/ontsleutelingssleutel voor met behulp van het bash-script voor de workload van GitHub. Sla het bestand op als setup-key.sh.

  5. Stel de MAA_ENDPOINT omgevingsvariabele in met de FQDN-naam van attest-URI door de volgende opdracht uit te voeren.

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

    Controleer of de FQDN van attest-URI de juiste indeling heeft (de MAA_ENDPOINT mag het voorvoegsel 'https://' niet bevatten):

    echo $MAA_ENDPOINT
    

    Notitie

    Als u Microsoft Azure Attestation wilt instellen, raadpleegt u de quickstart: Azure Attestation instellen met Azure CLI.

  6. Kopieer het volgende YAML-manifest en sla het op als 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
    

    Notitie

    Werk de waarde voor de omgevingsvariabele SkrClientAKVEndpoint van de pod bij zodat deze overeenkomt met de URL van uw Azure Key Vault, met uitzondering van de protocolwaarde https://. De tijdelijke aanduiding voor de huidige waarde is myKeyVault.vault.azure.net. Werk de waarde voor de omgevingsvariabele SkrClientMAAEndpoint van de pod bij met de waarde van MAA_ENDPOINT. U kunt de waarde vinden van MAA_ENDPOINT door de opdracht echo $MAA_ENDPOINT of de opdracht az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-uit te voeren.

  7. Genereer het beveiligingsbeleid voor het YAML-manifest van de Kafka-consument en haal de hash op van het beveiligingsbeleid dat is opgeslagen in de WORKLOAD_MEASUREMENT variabele door de volgende opdracht uit te voeren:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Als u een RSA asymmetrisch sleutelpaar (openbare en persoonlijke sleutels) wilt genereren, voert u het setup-key.sh script uit met behulp van de volgende opdracht. De <Azure Key Vault URL> waarde moet zijn <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>
    

    Notitie

    • De envionment-variabele MANAGED_IDENTITY is vereist door het bash-script setup-key.sh.

    • De openbare sleutel wordt opgeslagen als kafka-encryption-demo-pub.pem na het uitvoeren van het bash-script.

    Belangrijk

    Als u de fout ForbiddenByRbackrijgt, moet u mogelijk maximaal 24 uur wachten, omdat de back-endservices voor beheerde identiteiten gedurende maximaal 24 uur een cache per resource-URI onderhouden. Zie ook: Problemen met Azure RBAC oplossen.

  9. Voer de volgende opdrachten uit om te controleren of de sleutels zijn geüpload naar de sleutelkluis:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Kopieer het volgende YAML-manifest en sla het op als 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
    

    Notitie

    Werk de waarde bij die begint met en eindigt met -----BEGIN PUBLIC KEY----- -----END PUBLIC KEY----- tekenreeksen met de inhoud waaruit kafka-encryption-demo-pub.pem u in de vorige stap hebt gemaakt.

  11. Implementeer de consumer en producer YAML-manifesten met behulp van de bestanden die u eerder hebt opgeslagen.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Haal het IP-adres van de webservice op met behulp van de volgende opdracht:

    kubectl get svc consumer -n kafka
    
  13. Kopieer en plak het externe IP-adres van de consumentenservice in uw browser en bekijk het ontsleutelde bericht.

    Het volgende voorbeeld lijkt op de uitvoer van de opdracht:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. U moet ook proberen om de consument als een gewone Kubernetes-pod uit te voeren door de skr container en kata-cc runtime class specificatie te verwijderen. Omdat u de consument niet uitvoert met kata-cc-runtimeklasse, hebt u het beleid niet meer nodig.

  15. Verwijder het hele beleid en bekijk de berichten opnieuw in de browser nadat u de workload opnieuw hebt geïmplementeerd. Berichten worden weergegeven als met base64 gecodeerde coderingstekst omdat de persoonlijke versleutelingssleutel niet kan worden opgehaald. De sleutel kan niet worden opgehaald omdat de consument niet meer wordt uitgevoerd in een vertrouwelijke omgeving en de skr container sleutel ontbreekt, waardoor de ontsleuteling van berichten wordt voorkomen.

Opschonen

Wanneer u klaar bent met het evalueren van deze functie, moet u uw onnodige resources opschonen om Azure-kosten te voorkomen. Als u een nieuw cluster hebt geïmplementeerd als onderdeel van uw evaluatie of test, kunt u het cluster verwijderen met behulp van de opdracht az aks delete .

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

Als u Vertrouwelijke containers (preview) hebt ingeschakeld op een bestaand cluster, kunt u de pod(s) verwijderen met behulp van de opdracht kubectl delete pod .

kubectl delete pod pod-name

Volgende stappen

  • Meer informatie over Azure Dedicated-hosts voor knooppunten met uw AKS-cluster voor het gebruik van hardware-isolatie en controle over onderhoudsgebeurtenissen van het Azure-platform.