Bagikan melalui


Menyebarkan kluster AKS dengan Kontainer Rahasia dan kebijakan yang dihasilkan secara otomatis

Dalam artikel ini, Anda menggunakan Azure CLI untuk menyebarkan kluster Azure Kubernetes Service (AKS) dan mengonfigurasi Kontainer Rahasia (pratinjau) dengan kebijakan keamanan yang dihasilkan secara otomatis. Anda kemudian menyebarkan aplikasi sebagai kontainer Rahasia. Untuk mempelajari lebih lanjut , baca gambaran umum Kontainer Rahasia AKS.

Secara umum, memulai AKS Confidential Containers melibatkan langkah-langkah berikut.

  • Menyebarkan atau meningkatkan kluster AKS menggunakan Azure CLI
  • Tambahkan anotasi ke manifes YAML pod Anda untuk menandai pod sebagai menggunakan kontainer rahasia
  • Menambahkan kebijakan keamanan ke manifes YAML pod Anda
  • Menyebarkan aplikasi Anda dalam komputasi rahasia

Prasyarat

  • Azure CLI versi 2.44.1 atau yang lebih baru. Jalankan az --version untuk menemukan versi, dan jalankan az upgrade untuk meningkatkan versi. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

  • aks-preview Ekstensi Azure CLI versi 0.5.169 atau yang lebih baru.

  • confcom Ekstensi Azure CLI Kontainer Rahasia 0.3.3 atau yang lebih baru. confcom diperlukan untuk menghasilkan kebijakan keamanan.

  • Daftarkan Preview fitur di langganan Azure Anda.

  • AKS mendukung Kontainer Rahasia (pratinjau) pada versi 1.25.0 dan yang lebih tinggi.

  • Identitas beban kerja dan kredensial identitas federasi. Kredensial identitas beban kerja memungkinkan akses aplikasi Kubernetes ke sumber daya Azure dengan aman dengan ID Microsoft Entra berdasarkan akun layanan yang diannotasi. Jika Anda tidak terbiasa dengan ID Beban Kerja Microsoft Entra, lihat gambaran umum ID Beban Kerja Microsoft Entra dan tinjau cara kerja Identitas Beban Kerja dengan AKS.

  • Identitas yang Anda gunakan untuk membuat kluster memiliki izin minimum yang sesuai. Untuk informasi selengkapnya tentang akses dan identitas untuk AKS, lihat Opsi akses dan identitas untuk Azure Kubernetes Service (AKS).

  • Untuk mengelola kluster Kubernetes, gunakan kubectl klien baris perintah Kube. Azure Cloud Shell dilengkapi dengan kubectl. Anda dapat menginstal kubectl secara lokal menggunakan perintah az aks install-cli .

  • Kontainer rahasia pada AKS menyediakan kontainer sumber terbuka sidecar untuk pengesahan dan rilis kunci yang aman. Sidecar terintegrasi dengan Key Management Service (KMS), seperti Azure Key Vault, untuk merilis kunci ke grup kontainer setelah validasi selesai. Menyebarkan Azure Key Vault Managed HSM (Modul Keamanan Perangkat Keras) bersifat opsional tetapi disarankan untuk mendukung integritas dan pengesahan tingkat kontainer. Lihat Memprovisikan dan mengaktifkan HSM Terkelola untuk menyebarkan HSM Terkelola.

Menginstal ekstensi Azure CLI pratinjau aks

Penting

Fitur pratinjau AKS tersedia berdasarkan layanan mandiri. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan mereka dikecualikan dari perjanjian tingkat layanan dan garansi terbatas. Pratinjau AKS sebagian dicakup oleh dukungan pelanggan berdasarkan upaya terbaik. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Untuk menginstal ekstensi aks-preview, jalankan perintah berikut:

az extension add --name aks-preview

Jalankan perintah berikut untuk memperbarui ke versi terbaru ekstensi:

az extension update --name aks-preview

Menginstal ekstensi Confcom Azure CLI

Untuk menginstal ekstensi confcom, jalankan perintah berikut:

az extension add --name confcom

Jalankan perintah berikut untuk memperbarui ke versi terbaru ekstensi:

az extension update --name confcom

Daftarkan bendera fitur KataCcIsolationPreview

Daftarkan KataCcIsolationPreview bendera fitur dengan menggunakan perintah daftar fitur az, seperti yang ditunjukkan dalam contoh berikut:

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

Dibutuhkan beberapa menit agar status menampilkan Terdaftar. Verifikasi status pendaftaran dengan menggunakan perintah az feature show :

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

Saat status mencerminkan Terdaftar, refresh pendaftaran penyedia sumber daya Microsoft.ContainerService dengan menggunakan perintah az provider register :

az provider register --namespace "Microsoft.ContainerService"

Menyebarkan kluster baru

  1. Buat kluster AKS menggunakan perintah az aks create dan tentukan parameter berikut:

    • --os-sku: AzureLinux. Hanya os-sku Linux Azure yang mendukung fitur ini dalam rilis pratinjau ini.
    • --node-vm-size: Ukuran Azure VM apa pun yang mendukung VM anak yang dilindungi AMD SEV-SNP berfungsi. Misalnya, Standard_DC8as_cc_v5 VM.
    • --enable-workload-identity: Memungkinkan pembuatan ID Beban Kerja Microsoft Entra yang memungkinkan pod menggunakan identitas Kubernetes.
    • --enable-oidc-issuer: Mengaktifkan Penerbit OpenID Connect (OIDC). Ini memungkinkan ID Microsoft Entra atau identitas penyedia cloud lainnya dan platform manajemen akses kemampuan untuk menemukan kunci penandatanganan publik server API.
    • --workload-runtime: Tentukan KataCcIsolation untuk mengaktifkan fitur Kontainer Rahasia pada kumpulan simpul.
    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
    

    Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

  2. Ketika kluster siap, dapatkan kredensial kluster menggunakan perintah az aks get-credentials .

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

Menyebarkan ke kluster yang ada

Untuk menggunakan fitur ini dengan kluster AKS yang ada, persyaratan berikut harus dipenuhi:

Gunakan perintah berikut untuk mengaktifkan Kontainer Rahasia (pratinjau) dengan membuat kumpulan simpul untuk menghostingnya.

  1. Tambahkan kumpulan simpul ke kluster AKS Anda menggunakan perintah az aks nodepool add . Tentukan parameter berikut:

    • --resource-group: Masukkan nama grup sumber daya yang ada untuk membuat kluster AKS.
    • --cluster-name: Masukkan nama unik untuk kluster AKS, seperti myAKSCluster.
    • --name: Masukkan nama unik untuk kumpulan simpul kluster Anda, seperti nodepool2.
    • --workload-runtime: Tentukan KataCcIsolation untuk mengaktifkan fitur pada kumpulan simpul. Seiring dengan --workload-runtime parameter , parameter lain ini harus memenuhi persyaratan berikut. Jika tidak, perintah gagal dan melaporkan masalah dengan parameter yang sesuai.
    • --os-sku: AzureLinux. Hanya os-sku Linux Azure yang mendukung fitur ini dalam rilis pratinjau ini.
    • --node-vm-size: Ukuran Azure VM apa pun yang mendukung virtualisasi berlapis VM anak yang dilindungi AMD SEV-SNP berfungsi. Misalnya, Standard_DC8as_cc_v5 VM.

    Contoh berikut menambahkan kumpulan simpul pengguna ke myAKSCluster dengan dua node di nodepool2 di 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
    

    Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

  2. Jalankan perintah az aks update untuk mengaktifkan Kontainer Rahasia (pratinjau) pada kluster.

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

    Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

  3. Ketika kluster siap, dapatkan kredensial kluster menggunakan perintah az aks get-credentials .

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

Mengonfigurasi kontainer

Sebelum mengonfigurasi akses ke Azure Key Vault dan rahasia, dan menyebarkan aplikasi sebagai kontainer Rahasia, Anda perlu menyelesaikan konfigurasi identitas beban kerja.

Untuk mengonfigurasi identitas beban kerja, lakukan langkah-langkah berikut yang dijelaskan dalam artikel Menyebarkan dan mengonfigurasi identitas beban kerja:

  • Mengambil URL Pengeluar Sertifikat OIDC
  • Buat identitas terkelola
  • Membuat akun layanan Kubernetes
  • Menetapkan kredensial identitas federasi

Penting

Anda perlu mengatur variabel lingkungan dari bagian Ekspor variabel lingkungan di artikel Menyebarkan dan mengonfigurasi identitas beban kerja untuk terus menyelesaikan tutorial ini. Ingatlah untuk mengatur variabel SERVICE_ACCOUNT_NAMESPACE ke kafka, dan jalankan perintah kubectl create namespace kafka sebelum mengonfigurasi identitas beban kerja.

Menyebarkan aplikasi tepercaya dengan kata-cc dan kontainer pengesahan

Langkah-langkah berikut mengonfigurasi enkripsi end-to-end untuk pesan Kafka menggunakan kunci enkripsi yang dikelola oleh Modul Keamanan Perangkat Keras Terkelola Azure (mHSM). Kunci hanya dirilis ketika konsumen Kafka berjalan dalam Kontainer Rahasia dengan kontainer provisi rahasia pengesahan Azure yang disuntikkan ke pod.

Konfigurasi ini didasarkan pada empat komponen berikut:

  • Kluster Kafka: Kluster Kafka sederhana yang disebarkan di namespace Kafka pada kluster.
  • Produsen Kafka: Produser Kafka yang berjalan sebagai pod Vanilla Kubernetes yang mengirim pesan terenkripsi yang dikonfigurasi pengguna menggunakan kunci publik ke topik Kafka.
  • Konsumen Kafka: Pod konsumen Kafka yang berjalan dengan runtime kata-cc, dilengkapi dengan kontainer rilis kunci yang aman untuk mengambil kunci privat untuk mendekripsi pesan Kafka dan merender pesan ke UI web.

Untuk rilis pratinjau ini, kami sarankan untuk tujuan pengujian dan evaluasi untuk membuat atau menggunakan sumber daya tingkat Azure Key Vault Premium yang ada untuk mendukung penyimpanan kunci dalam modul keamanan perangkat keras (HSM). Kami tidak menyarankan penggunaan brankas kunci produksi Anda. Jika Anda tidak memiliki Azure Key Vault, lihat Membuat brankas kunci menggunakan Azure CLI.

  1. Berikan identitas terkelola yang Anda buat sebelumnya, dan akun Anda, akses ke brankas kunci. Tetapkan kedua identitas peran Key Vault Crypto Officer dan Key Vault Crypto User Azure RBAC.

    Catatan

    • Identitas terkelola adalah nilai yang Anda tetapkan ke USER_ASSIGNED_IDENTITY_NAME variabel .

    • Untuk menambahkan penetapan peran, Anda harus memiliki Microsoft.Authorization/roleAssignments/write izin dan Microsoft.Authorization/roleAssignments/delete , seperti Administrator Akses Data Key Vault, Administrator Akses Pengguna, atau Pemilik.

    • Anda harus menggunakan Key Vault Premium SKU untuk mendukung kunci yang dilindungi HSM.

    Jalankan perintah berikut untuk mengatur cakupan:

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

    Jalankan perintah berikut untuk menetapkan peran Petugas Kripto Key Vault.

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

    Jalankan perintah berikut untuk menetapkan peran Pengguna Kripto Key Vault.

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Instal kluster Kafka di namespace kafka dengan menjalankan perintah berikut:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Jalankan perintah berikut untuk menerapkan kafka file CR kluster.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Siapkan kunci Enkripsi/Dekripsi RSA menggunakan skrip bash untuk beban kerja dari GitHub. Simpan file sebagai setup-key.sh.

  5. Atur MAA_ENDPOINT variabel lingkungan dengan FQDN URI Attest dengan menjalankan perintah berikut.

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

    Periksa apakah FQDN URI Attest dalam format yang benar (MAA_ENDPOINT tidak boleh menyertakan awalan "https://"):

    echo $MAA_ENDPOINT
    

    Catatan

    Untuk menyiapkan Microsoft Azure Attestation, lihat Mulai Cepat: Menyiapkan Azure Attestation dengan Azure CLI.

  6. Salin manifes YAML berikut dan simpan sebagai 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
    

    Catatan

    Perbarui nilai untuk variabel SkrClientAKVEndpoint lingkungan pod agar sesuai dengan URL Azure Key Vault Anda, tidak termasuk nilai https://protokol . Nilai tempat penampung nilai saat ini adalah myKeyVault.vault.azure.net. Perbarui nilai untuk variabel SkrClientMAAEndpoint lingkungan pod dengan nilai MAA_ENDPOINT. Anda dapat menemukan nilai MAA_ENDPOINT dengan menjalankan perintah echo $MAA_ENDPOINT atau perintah az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-.

  7. Hasilkan kebijakan keamanan untuk manifes YAML konsumen Kafka dan dapatkan hash kebijakan keamanan yang disimpan dalam WORKLOAD_MEASUREMENT variabel dengan menjalankan perintah berikut:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Untuk menghasilkan pasangan kunci asimetris RSA (kunci publik dan privat), jalankan setup-key.sh skrip menggunakan perintah berikut. Nilainya <Azure Key Vault URL> harus <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>
    

    Catatan

    • Variabel MANAGED_IDENTITY iritasi diperlukan oleh skrip setup-key.shbash .

    • Kunci publik akan disimpan seperti kafka-encryption-demo-pub.pem setelah menjalankan skrip bash.

    Penting

    Jika Anda menerima kesalahan ForbiddenByRbac, Anda mungkin perlu menunggu hingga 24 jam karena layanan backend untuk identitas terkelola mempertahankan cache per URI sumber daya hingga 24 jam. Lihat juga: Memecahkan masalah Azure RBAC.

  9. Untuk memverifikasi bahwa kunci telah berhasil diunggah ke brankas kunci, jalankan perintah berikut:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Salin manifes YAML berikut dan simpan sebagai 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
    

    Catatan

    Perbarui nilai yang dimulai dengan -----BEGIN PUBLIC KEY----- dan diakhiri dengan -----END PUBLIC KEY----- string dengan konten kafka-encryption-demo-pub.pem yang dibuat di langkah sebelumnya.

  11. Sebarkan consumer manifes YAML dan producer menggunakan file yang Anda simpan sebelumnya.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Dapatkan alamat IP layanan web menggunakan perintah berikut:

    kubectl get svc consumer -n kafka
    
  13. Salin dan tempel alamat IP eksternal layanan konsumen ke browser Anda dan amati pesan yang didekripsi.

    Contoh berikut menyerupai output perintah:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Anda juga harus mencoba menjalankan konsumen sebagai pod Kubernetes biasa dengan menghapus skr container spesifikasi dan kata-cc runtime class . Karena Anda tidak menjalankan konsumen dengan kelas runtime kata-cc, Anda tidak lagi memerlukan kebijakan.

  15. Hapus seluruh kebijakan dan amati pesan lagi di browser setelah menyebarkan ulang beban kerja. Pesan muncul sebagai ciphertext yang dikodekan base64 karena kunci enkripsi privat tidak dapat diambil. Kunci tidak dapat diambil karena konsumen tidak lagi berjalan di lingkungan rahasia, dan skr container hilang, mencegah dekripsi pesan.

Pembersihan

Setelah selesai mengevaluasi fitur ini, untuk menghindari biaya Azure, bersihkan sumber daya yang tidak perlu. Jika Anda menyebarkan kluster baru sebagai bagian dari evaluasi atau pengujian, Anda dapat menghapus kluster menggunakan perintah az aks delete .

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

Jika Anda mengaktifkan Kontainer Rahasia (pratinjau) pada kluster yang ada, Anda dapat menghapus pod menggunakan perintah kubectl delete pod .

kubectl delete pod pod-name

Langkah berikutnya

  • Pelajari selengkapnya tentang host Azure Dedicated untuk simpul dengan kluster AKS Anda untuk menggunakan isolasi dan kontrol perangkat keras atas peristiwa pemeliharaan platform Azure.