Gizli Kapsayıcılar ve varsayılan ilke ile AKS kümesi dağıtma

Bu makalede, Azure CLI kullanarak bir Azure Kubernetes Service (AKS) kümesi dağıtacak ve Gizli Kapsayıcılar'ı (önizleme) varsayılan bir güvenlik ilkesiyle yapılandıracaksınız. Ardından bir uygulamayı Gizli kapsayıcı olarak dağıtırsınız. Daha fazla bilgi edinmek için AKS Gizli Kapsayıcılarına genel bakış konusunu okuyun.

Genel olarak, AKS Gizli Kapsayıcıları'nı kullanmaya başlamak için aşağıdaki adımlar yer alır.

  • Azure CLI kullanarak AKS kümesini dağıtma veya yükseltme
  • Podu gizli kapsayıcı olarak çalıştırılıyor olarak işaretlemek için pod YAML bildiriminize ek açıklama ekleme
  • Pod YAML bildiriminize güvenlik ilkesi ekleme
  • Güvenlik ilkesini zorlamayı etkinleştirme
  • Uygulamanızı gizli bilgi işlemde dağıtma

Önkoşullar

  • Azure CLI sürüm 2.44.1 veya üzeri. Sürümü bulmak için komutunu az --version çalıştırın ve sürümü yükseltmek için komutunu çalıştırın az upgrade . Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

  • aks-preview Azure CLI uzantısı sürüm 0.5.169 veya üzeri.

  • confcom Gizli Kapsayıcı Azure CLI uzantısı 0.3.3 veya üzeri. confcom bir güvenlik ilkesi oluşturmak için gereklidir.

  • Preview Özelliği Azure aboneliğinize kaydedin.

  • AKS, 1.25.0 ve üzeri sürümlerde Gizli Kapsayıcılar'ı (önizleme) destekler.

  • İş yükü kimliği ve federasyon kimliği kimlik bilgileri. İş yükü kimliği kimlik bilgileri, Kubernetes uygulamalarının ek açıklamalı hizmet hesaplarını temel alan bir Microsoft Entra Kimliği ile Azure kaynaklarına güvenli bir şekilde erişmesini sağlar. Microsoft Entra İş Yükü Kimliği hakkında bilginiz yoksa Microsoft Entra İş Yükü Kimliği genel bakışa bakın ve İş Yükü Kimliği'nin AKS ile nasıl çalıştığını gözden geçirin.

  • Kümenizi oluşturmak için kullandığınız kimlik uygun en düşük izinlere sahiptir. AKS'ye erişim ve kimlik hakkında daha fazla bilgi için bkz . Azure Kubernetes Service (AKS) için erişim ve kimlik seçenekleri.

  • Kubernetes kümesini yönetmek için Kubernetes komut satırı istemcisi kubectl'yi kullanın. Azure Cloud Shell ile birlikte kubectlgelir. az aks install-cli komutunu kullanarak kubectl'yi yerel olarak yükleyebilirsiniz.

  • AKS'deki gizli kapsayıcılar, kanıtlama ve güvenli anahtar sürümü için sepet açık kaynak kapsayıcı sağlar. Sepet, doğrulama tamamlandıktan sonra kapsayıcı grubuna bir anahtar yayınlamak için Azure Key Vault gibi bir Anahtar Yönetim Merkezi (KMS) ile tümleşir. Azure Key Vault Yönetilen HSM'sini (Donanım Güvenlik Modülü) dağıtmak isteğe bağlıdır, ancak kapsayıcı düzeyinde bütünlüğü ve kanıtlamayı desteklemek için önerilir. Bkz . Yönetilen HSM'yi dağıtmak için Yönetilen HSM sağlama ve etkinleştirme.

aks-preview Azure CLI uzantısını yükleme

Önemli

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

aks-preview uzantısını yüklemek için aşağıdaki komutu çalıştırın:

az extension add --name aks-preview

Yayımlanan uzantının en son sürümüne güncelleştirmek için aşağıdaki komutu çalıştırın:

az extension update --name aks-preview

Confcom Azure CLI uzantısını yükleme

Confcom uzantısını yüklemek için aşağıdaki komutu çalıştırın:

az extension add --name confcom

Yayımlanan uzantının en son sürümüne güncelleştirmek için aşağıdaki komutu çalıştırın:

az extension update --name confcom

KataCcIsolationPreview özellik bayrağını kaydetme

KataCcIsolationPreview Aşağıdaki örnekte gösterildiği gibi az feature register komutunu kullanarak özellik bayrağını kaydedin:

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

Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer. az feature show komutunu kullanarak kayıt durumunu doğrulayın:

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

Durum Kayıtlı olarak gösterildiğinde az provider register komutunu kullanarak Microsoft.ContainerService kaynak sağlayıcısının kaydını yenileyin:

az provider register --namespace "Microsoft.ContainerService"

Yeni küme dağıtma

  1. az aks create komutunu kullanarak ve aşağıdaki parametreleri belirterek bir AKS kümesi oluşturun:

    • --os-sku: AzureLinux. Bu önizleme sürümünde bu özelliği yalnızca Azure Linux os-sku destekler.
    • --node-vm-size: 2. nesil vm olan ve iç içe sanallaştırmayı destekleyen tüm Azure VM boyutları çalışır. Örneğin, VM'leri Standard_DC8as_cc_v5 .
    • --enable-workload-identity: Podların Kubernetes kimliği kullanmasını sağlayan bir Microsoft Entra İş Yükü Kimliği oluşturulmasını etkinleştirir.
    • --enable-oidc-issuer: OpenID Connect (OIDC) Vereni etkinleştirir. Microsoft Entra Id veya diğer bulut sağlayıcısı kimliğine ve erişim yönetimi platformuna API sunucusunun genel imzalama anahtarlarını bulma olanağı sağlar.

    Aşağıdaki örnek myAKSCluster adlı kümeyi güncelleştirir ve myResourceGroup içinde tek bir sistem düğümü havuzu oluşturur:

    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
    

    Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür. Önceki adımda oluşturulan kümenin tek düğüm havuzu vardır. Sonraki adımda kümeye ikinci bir düğüm havuzu ekleyeceğiz.

  2. Küme hazır olduğunda az aks get-credentials komutunu kullanarak küme kimlik bilgilerini alın.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. az aks nodepool add komutunu kullanarak myResourceGroup'ta nodepool2 içinde iki düğüm içeren myAKSCluster'a bir kullanıcı düğümü havuzu ekleyin. Aşağıdaki parametreleri belirtin:

    • --workload-runtime: Düğüm havuzunda Gizli Kapsayıcılar özelliğini etkinleştirmek için KataCcIsolation belirtin. Bu parametre ile, bu diğer parametreler aşağıdaki gereksinimleri karşılamalıdır. Aksi takdirde, komut başarısız olur ve ilgili parametrelerle ilgili bir sorun bildirir.
    • --os-sku: AzureLinux. Bu önizleme sürümünde bu özelliği yalnızca Azure Linux os-sku destekler.
    • --node-vm-size: 2. nesil vm olan ve iç içe sanallaştırmayı destekleyen tüm Azure VM boyutları çalışır. Örneğin, VM'leri 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
    

Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür.

Mevcut kümeye dağıtma

Bu özelliği mevcut bir AKS kümesiyle kullanmak için aşağıdaki gereksinimlerin karşılanması gerekir:

Barındırmak için bir düğüm havuzu oluşturarak Gizli Kapsayıcılar'ı (önizleme) etkinleştirmek için aşağıdaki komutu kullanın.

  1. az aks nodepool add komutunu kullanarak AKS kümenize düğüm havuzu ekleyin . Aşağıdaki parametreleri belirtin:

    • --resource-group: AKS kümesinin oluşturulacağı mevcut kaynak grubunun adını girin.
    • --cluster-name: AKS kümesi için myAKSCluster gibi benzersiz bir ad girin.
    • --name: Küme düğüm havuzunuz için nodepool2 gibi benzersiz bir ad girin.
    • --workload-runtime: Özelliği düğüm havuzunda etkinleştirmek için KataCcIsolation belirtin. Parametresiyle --workload-runtime birlikte, bu diğer parametreler aşağıdaki gereksinimleri karşılamalıdır. Aksi takdirde, komut başarısız olur ve ilgili parametrelerle ilgili bir sorun bildirir.
    • --os-sku: AzureLinux. Bu önizleme sürümünde bu özelliği yalnızca Azure Linux os-sku destekler.
    • --node-vm-size: 2. nesil vm olan ve iç içe sanallaştırmayı destekleyen tüm Azure VM boyutları çalışır. Örneğin, VM'leri Standard_DC8as_cc_v5 .

    Aşağıdaki örnek, myResourceGroup'ta nodepool2'de iki düğüm içeren myAKSCluster'a bir kullanıcı düğümü havuzu ekler:

    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
    

    Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür.

  2. Kümede Gizli Kapsayıcılar'ı (önizleme) etkinleştirmek için az aks update komutunu çalıştırın.

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

    Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür.

  3. Küme hazır olduğunda az aks get-credentials komutunu kullanarak küme kimlik bilgilerini alın.

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

Kapsayıcıyı yapılandırma

Azure Key Vault'a ve gizli diziye erişimi yapılandırmadan ve bir uygulamayı Gizli kapsayıcı olarak dağıtmadan önce iş yükü kimliğinin yapılandırmasını tamamlamanız gerekir.

İş yükü kimliğini yapılandırmak için, İş yükü kimliğini dağıtma ve yapılandırma makalesinde açıklanan aşağıdaki adımları uygulayın:

  • OIDC Veren URL'sini alma
  • Yönetilen kimlik oluşturma
  • Kubernetes hizmet hesabı oluşturma
  • Federasyon kimliği kimlik bilgilerini oluşturma

Önemli

Bu öğreticiyi tamamlamaya devam etmek için iş yükü kimliğini dağıtma ve yapılandırma makalesindeki Ortam değişkenlerini dışarı aktarma bölümünden ortam değişkenlerini ayarlamanız gerekir. değişkeni SERVICE_ACCOUNT_NAMESPACE kafkaolarak ayarlamayı ve iş yükü kimliğini yapılandırmadan önce komutunu kubectl create namespace kafka yürütmeyi unutmayın.

Kata-cc ve kanıtlama kapsayıcısı ile güvenilir uygulama dağıtma

Aşağıdaki adımlar, Azure Yönetilen Donanım Güvenlik Modülleri (mHSM) tarafından yönetilen şifreleme anahtarlarını kullanarak Kafka iletileri için uçtan uca şifrelemeyi yapılandıracaktır . Anahtar yalnızca Kafka tüketicisi pod'a eklenmiş bir Azure kanıtlama gizli dizisi sağlama kapsayıcısı ile Gizli Kapsayıcı içinde çalıştığında serbest bırakılır.

Bu yapılandırma aşağıdaki dört bileşeni temel alır:

  • Kafka Kümesi: Kümedeki Kafka ad alanında dağıtılan basit bir Kafka kümesi.
  • Kafka Üreticisi: Bir Kafka konusuna ortak anahtar kullanarak şifrelenmiş kullanıcı tarafından yapılandırılmış iletiler gönderen, vanilya Kubernetes podu olarak çalışan bir Kafka üreticisi.
  • Kafka Tüketicisi: Kafka iletilerinin şifresini çözmek ve iletileri web kullanıcı arabirimine işlemek için özel anahtarı almak için güvenli bir anahtar yayın kapsayıcısıyla donatılmış, kata-cc çalışma zamanıyla çalışan bir Kafka tüketici podu.

Bu önizleme sürümünde, anahtarların bir donanım güvenlik modülünde (HSM) depolanmasını desteklemek üzere mevcut bir Azure Key Vault Premium katmanı kaynağı oluşturmanızı veya kullanmanızı test ve değerlendirme amacıyla öneririz. Üretim anahtarı kasanızı kullanmanızı önermiyoruz. Azure Key Vault'nuz yoksa bkz . Azure CLI kullanarak anahtar kasası oluşturma.

  1. Daha önce oluşturduğunuz yönetilen kimliğe ve hesabınıza anahtar kasasına erişim verin. Hem Key Vault Şifreleme Yetkilisi hem de Key Vault Şifreleme Kullanıcısı Azure RBAC rollerini atayın.

    Not

    • Yönetilen kimlik, değişkene USER_ASSIGNED_IDENTITY_NAME atadığınız değerdir.

    • Rol atamaları eklemek için Key Vault Veri Erişim Yöneticisi, Kullanıcı Erişim Yöneticisi veya Sahip gibi ve Microsoft.Authorization/roleAssignments/delete izinleriniz olmalıdır.Microsoft.Authorization/roleAssignments/write

    • HSM korumalı anahtarları desteklemek için Key Vault Premium SKU'yu kullanmanız gerekir.

    Kapsamı ayarlamak için aşağıdaki komutu çalıştırın:

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

    Key Vault Şifreleme Yetkilisi rolünü atamak için aşağıdaki komutu çalıştırın.

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

    Key Vault Şifreleme Kullanıcısı rolünü atamak için aşağıdaki komutu çalıştırın.

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Aşağıdaki komutu çalıştırarak Kafka kümesini kafka ad alanına yükleyin:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Küme CR dosyasını uygulamak kafka için aşağıdaki komutu çalıştırın.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. GitHub'dan iş yükü için bash betiğini kullanarak RSA Şifreleme/Şifre Çözme anahtarını hazırlayın. Dosyayı setup-key.sh olarak kaydedin.

  5. MAA_ENDPOINT Aşağıdaki komutu çalıştırarak Ortam değişkenini Test URI'sinin FQDN'siyle ayarlayın.

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

    Test URI'sinin FQDN'sinin doğru biçimde olup olmadığını denetleyin (MAA_ENDPOINT "https://" ön ekini içermemelidir):

    echo $MAA_ENDPOINT
    

    Not

    Microsoft Azure Doğrulama ayarlamak için bkz. Hızlı Başlangıç: Azure CLI ile Azure Doğrulama ayarlama.

  6. Aşağıdaki YAML bildirimini kopyalayın ve olarak consumer.yamlkaydedin.

    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
    

    Not

    Pod ortam değişkeninin SkrClientAKVEndpoint değerini, protokol değeri https://hariç olmak üzere Azure Key Vault'unuzun URL'si ile eşleşecek şekilde güncelleştirin. Geçerli değer yer tutucusu değeridir myKeyVault.vault.azure.net. Pod ortam değişkeninin SkrClientMAAEndpoint değerini değeriyle güncelleştirin MAA_ENDPOINT. komutunu veya az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-komutunu echo $MAA_ENDPOINT çalıştırarak değerini MAA_ENDPOINT bulabilirsiniz.

  7. Kafka tüketici YAML bildirimi için güvenlik ilkesini oluşturun ve aşağıdaki komutu çalıştırarak değişkende WORKLOAD_MEASUREMENT depolanan güvenlik ilkesinin karması alın:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. RSA asimetrik anahtar çifti (ortak ve özel anahtarlar) oluşturmak için aşağıdaki komutu kullanarak betiği çalıştırın setup-key.sh . Değer <Azure Key Vault URL> şu şekilde olmalıdır: <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>
    

    Not

    • envionment değişkeni MANAGED_IDENTITY bash betiği setup-key.shtarafından gereklidir.

    • Bash betiği yürütülürken ortak anahtar olarak kafka-encryption-demo-pub.pem kaydedilir.

    Önemli

    hatasını ForbiddenByRbacalırsanız, yönetilen kimlikler için arka uç hizmetleri 24 saate kadar kaynak URI'sine göre önbellek bulundururken 24 saate kadar beklemeniz gerekebilir. Ayrıca bkz. Azure RBAC sorunlarını giderme.

  9. Anahtarların anahtar kasasına başarıyla yüklendiğini doğrulamak için aşağıdaki komutları çalıştırın:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Aşağıdaki YAML bildirimini kopyalayın ve olarak producer.yamlkaydedin.

    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
    

    Not

    ile başlayan -----BEGIN PUBLIC KEY----- ve dizelerle -----END PUBLIC KEY----- biten değeri, önceki adımda oluşturulan içerikle kafka-encryption-demo-pub.pem güncelleştirin.

  11. consumer ve producer YAML bildirimlerini daha önce kaydettiğiniz dosyaları kullanarak dağıtın.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Aşağıdaki komutu kullanarak web hizmetinin IP adresini alın:

    kubectl get svc consumer -n kafka
    
  13. Tüketici hizmetinin dış IP adresini kopyalayıp tarayıcınıza yapıştırın ve şifresi çözülen iletiyi gözlemleyin.

    Aşağıdaki örnek komutun çıkışına benzer:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Ayrıca ve kata-cc runtime class belirtimini kaldırarak tüketiciyi normal bir Kubernetes podu olarak çalıştırmayı skr container denemeniz gerekir. Tüketiciyi kata-cc çalışma zamanı sınıfıyla çalıştırmadığınız için artık ilkeye ihtiyacınız yoktur.

  15. İlkenin tamamını kaldırın ve iş yükünü yeniden dağıtdıktan sonra iletileri tarayıcıda yeniden gözlemleyin. özel şifreleme anahtarı alınamadığından iletiler base64 ile kodlanmış şifreleme metni olarak görünür. Tüketici artık gizli bir ortamda çalışmadığından ve eksik olduğundan anahtar alınamıyor ve skr container iletilerin şifresinin çözülmesini engelliyor.

Temizleme

Bu özelliği değerlendirmeyi bitirdiğinizde Azure ücretlerinden kaçınmak için gereksiz kaynaklarınızı temizleyin. Değerlendirme veya test kapsamında yeni bir küme dağıttıysanız az aks delete komutunu kullanarak kümeyi silebilirsiniz .

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

Mevcut bir kümede Gizli Kapsayıcılar'ı (önizleme) etkinleştirdiyseniz kubectl delete pod komutunu kullanarak podları kaldırabilirsiniz.

kubectl delete pod pod-name

Sonraki adımlar

  • Donanım yalıtımını kullanmak ve Azure platformu bakım olayları üzerinde denetim sağlamak üzere AKS kümenize sahip düğümler için Azure Ayrılmış konakları hakkında daha fazla bilgi edinin.