Mengaktifkan enkripsi data KMS di kluster Azure Kubernetes Service (AKS) (Pratinjau)

Artikel ini menunjukkan cara mengaktifkan enkripsi data Key Management Service (KMS) untuk rahasia Kubernetes di Azure Kubernetes Service (AKS). Enkripsi KMS mengenkripsi rahasia Kubernetes yang disimpan di etcd menggunakan kunci Azure Key Vault.

AKS mendukung dua opsi manajemen kunci:

  • Kunci yang dikelola platform (PMK): AKS secara otomatis membuat dan mengelola kunci enkripsi. Opsi ini menyediakan pengaturan paling sederhana dengan rotasi kunci otomatis.
  • Kunci yang dikelola pelanggan (CMK): Anda membuat dan mengelola Azure Key Vault dan kunci enkripsi Anda sendiri. Opsi ini memberikan kontrol penuh atas siklus hidup utama dan memenuhi persyaratan kepatuhan yang mengamanatkan kunci yang dikelola pelanggan.

Untuk informasi selengkapnya tentang konsep enkripsi dan opsi utama, lihat Konsep enkripsi data saat tidak aktif untuk AKS.

Penting

Fitur pratinjau AKS tersedia atas dasar layanan mandiri dan pendaftaran sukarela. Pratinjau disediakan "apa adanya" dan "sebagaimana tersedia," dan pratinjau tersebut dikecualikan dari perjanjian tingkat layanan (SLA) serta garansi terbatas. Pratinjau AKS sebagian didukung oleh dukungan pelanggan berdasarkan upaya terbaik yang dapat dilakukan. Dengan demikian, fitur-fitur ini tidak dimaksudkan untuk penggunaan produksi. Untuk informasi lebih lanjut, lihat artikel dukungan berikut ini:

Prasyarat

  • Artikel ini memerlukan Azure CLI versi 2.73.0 atau yang lebih baru. Jika Anda menggunakan Azure Cloud Shell, versi terbaru sudah diinstal di sana.
  • Anda memerlukan aks-preview ekstensi Azure CLI versi 19.0.0b13 atau yang lebih baru.
    • Jika Anda belum memiliki aks-preview ekstensi, instal menggunakan az extension add perintah .
      az extension add --name aks-preview
      
    • Jika Anda sudah memiliki aks-preview ekstensi, perbarui untuk memastikan Anda memiliki versi terbaru menggunakan az extension update perintah .
      az extension update --name aks-preview
      
  • kubectl Alat CLI terinstal.

Daftarkan bendera fitur

Untuk menggunakan enkripsi data KMS dengan kunci yang dikelola platform, daftarkan KMSPMKPreview bendera fitur di langganan Anda.

  1. Daftarkan bendera fitur menggunakan az feature register perintah .

    az feature register --namespace Microsoft.ContainerService --name KMSPMKPreview
    
  2. Verifikasi status pendaftaran menggunakan az feature show perintah . Dibutuhkan beberapa menit agar status menampilkan Terdaftar.

    az feature show --namespace Microsoft.ContainerService --name KMSPMKPreview
    
  3. Saat status menunjukkan Terdaftar, segar ulang pendaftaran penyedia sumber daya Microsoft.ContainerService dengan perintah az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Menyiapkan variabel lingkungan

Setel variabel lingkungan untuk deployment Anda. Ganti nilai placeholder dengan nilai Anda sendiri.

# Set environment variables
export SUBSCRIPTION_ID="<your-subscription-id>"
export RESOURCE_GROUP="<your-resource-group>"
export LOCATION="<your-location>"
export CLUSTER_NAME="<your-cluster-name>"

# Set subscription
az account set --subscription $SUBSCRIPTION_ID

# Create resource group if it doesn't exist
az group create --name $RESOURCE_GROUP --location $LOCATION

Mengaktifkan enkripsi kunci yang dikelola platform

Dengan kunci yang dikelola platform, AKS secara otomatis membuat dan mengelola Azure Key Vault dan kunci enkripsi. Rotasi kunci ditangani secara otomatis oleh platform.

Membuat kluster AKS baru dengan kunci yang dikelola platform

Buat kluster AKS baru dengan enkripsi KMS menggunakan kunci yang dikelola platform.

az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kubernetes-version 1.33.0 \
    --kms-infrastructure-encryption Enabled \
    --generate-ssh-keys

Mengaktifkan kunci yang dikelola platform pada kluster yang ada

Aktifkan enkripsi KMS dengan kunci yang dikelola platform pada kluster AKS yang ada.

Nota

Kluster harus menjalankan Kubernetes versi 1.33 atau yang lebih baru.

Jika perintah az aks update mengembalikan error ReconcileAzureKeyVaultKmsError, jalankan perintah berikut untuk memeriksa apakah Anda dapat membaca dan menulis rahasia yang ada:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Jika perintah ini gagal (misalnya, penolakan webhook atau sumber daya tidak ditemukan), perbaiki masalah dan jalankan kembali perintah pembaruan. Pesan "Objek telah dimodifikasi" tidak memerlukan tindakan — anggap itu sebagai berhasil.

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kms-infrastructure-encryption Enabled

Memverifikasi konfigurasi KMS

Setelah mengaktifkan enkripsi KMS, verifikasi konfigurasi.

az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'

Output mencakup konfigurasi KMS:

{
    "kubernetesResourceObjectEncryptionProfile": {
        "infrastructureEncryption": "Enabled"
    }
}

Mengaktifkan enkripsi kunci yang dikelola pelanggan dengan brankas kunci privat

Untuk keamanan yang ditingkatkan, Anda dapat menggunakan brankas kunci privat yang menonaktifkan akses jaringan publik. AKS mengakses brankas kunci pribadi melalui pengecualian firewall layanan tepercaya. Bagian ini menunjukkan cara mengonfigurasi kunci yang dikelola pelanggan dengan brankas kunci privat.

Buat penyimpanan kunci dan kunci dengan akses layanan tepercaya

Nota

Bagian ini menggambarkan pembuatan Key Vault dengan mulanya akses jaringan publik, lalu mengaktifkan firewall dengan melewati layanan yang dipercaya. Pendekatan ini hanya untuk tujuan ilustrasi. Di lingkungan produksi, Anda harus membuat dan mengelola brankas kunci secara privat sejak awal. Untuk panduan tentang mengelola brankas kunci privat, lihat Keamanan jaringan Azure Key Vault.

  1. Buat brankas kunci dengan Azure RBAC diaktifkan.

    export KEY_VAULT_NAME="<your-key-vault-name>"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --enable-rbac-authorization true \
        --public-network-access Enabled
    
    # Get the key vault resource ID
    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id -o tsv)
    
  2. Tetapkan diri Anda peran Petugas Kripto Key Vault untuk membuat kunci.

    az role assignment create \
        --role "Key Vault Crypto Officer" \
        --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
        --assignee-principal-type "User" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Buat kunci di brankas kunci. Pastikan encrypt dan decrypt operasi utama diaktifkan.

    export KEY_NAME="<your-key-name>"
    
    az keyvault key create --name $KEY_NAME --vault-name $KEY_VAULT_NAME
    
    # Get the key ID (without version for automatic rotation)
    export KEY_ID=$(az keyvault key show --name $KEY_NAME --vault-name $KEY_VAULT_NAME --query 'key.kid' -o tsv)
    export KEY_ID_NO_VERSION=$(echo $KEY_ID | sed 's|/[^/]*$||')
    
  4. Aktifkan firewall key vault dengan melewati layanan tepercaya.

    az keyvault update \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --default-action Deny \
        --bypass AzureServices
    

    Parameter --default-action Deny memblokir akses jaringan publik, dan --bypass AzureServices parameter memungkinkan layanan Azure tepercaya (termasuk AKS) untuk mengakses brankas kunci.

Buat identitas terkelola yang ditetapkan pengguna

  1. Buat identitas terkelola yang ditetapkan pengguna untuk kluster.

    export IDENTITY_NAME="<your-identity-name>"
    
    az identity create --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP
    
    # Get the identity details
    export IDENTITY_OBJECT_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'principalId' -o tsv)
    export IDENTITY_RESOURCE_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'id' -o tsv)
    
  2. Tetapkan peran yang diperlukan ke identitas terkelola.

    # Assign Key Vault Crypto User role for encrypt/decrypt operations
    az role assignment create \
        --role "Key Vault Crypto User" \
        --assignee-object-id $IDENTITY_OBJECT_ID \
        --assignee-principal-type "ServicePrincipal" \
        --scope $KEY_VAULT_RESOURCE_ID
    
    # Assign Key Vault Contributor role for key management
    az role assignment create \
        --role "Key Vault Contributor" \
        --assignee-object-id $IDENTITY_OBJECT_ID \
        --assignee-principal-type "ServicePrincipal" \
        --scope $KEY_VAULT_RESOURCE_ID
    

Membuat kluster AKS baru dengan kunci yang dikelola pelanggan (privat)

Buat kluster AKS baru dengan enkripsi KMS menggunakan kunci yang dikelola pelanggan dengan brankas kunci privat.

az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kubernetes-version 1.33.0 \
    --kms-infrastructure-encryption Enabled \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
    --azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
    --azure-keyvault-kms-key-vault-network-access Private \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --generate-ssh-keys

Mengaktifkan kunci yang dikelola pelanggan pada kluster yang ada (privat)

Aktifkan enkripsi KMS dengan kunci yang dikelola pelanggan menggunakan brankas kunci privat pada kluster AKS yang ada.

Nota

Kluster harus menjalankan Kubernetes versi 1.33 atau yang lebih baru.

Jika perintah az aks update mengembalikan error ReconcileAzureKeyVaultKmsError, jalankan perintah berikut untuk memeriksa apakah Anda dapat membaca dan menulis rahasia yang ada:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Jika perintah ini gagal (misalnya, penolakan webhook atau sumber daya tidak ditemukan), perbaiki masalah dan jalankan kembali perintah pembaruan. Pesan "Objek telah dimodifikasi" tidak memerlukan tindakan — anggap itu sebagai berhasil.

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kms-infrastructure-encryption Enabled \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
    --azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
    --azure-keyvault-kms-key-vault-network-access Private \
    --assign-identity $IDENTITY_RESOURCE_ID

Memverifikasi konfigurasi KMS

Setelah mengaktifkan enkripsi KMS, verifikasi konfigurasi.

az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'

Output mencakup konfigurasi KMS:

{
    "azureKeyVaultKms": {
        "enabled": true,
        "keyId": "https://<key-vault-name>.vault.azure.net/keys/<key-name>",
        "keyVaultNetworkAccess": "Private",
        "keyVaultResourceId": "<key-vault-resource-id>"
    },
    "kubernetesResourceObjectEncryptionProfile": {
        "infrastructureEncryption": "Enabled"
    }
}

Mengaktifkan enkripsi kunci yang dikelola pelanggan dengan brankas kunci publik

Dengan kunci yang dikelola pelanggan, Anda membuat dan mengelola Azure Key Vault dan kunci enkripsi Anda sendiri. Bagian ini menunjukkan cara mengonfigurasi kunci yang dikelola pelanggan dengan brankas kunci publik.

Buat brankas kunci dan kunci

  1. Buat brankas kunci dengan Azure RBAC diaktifkan.

    export KEY_VAULT_NAME="<your-key-vault-name>"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --enable-rbac-authorization true \
        --public-network-access Enabled
    
    # Get the key vault resource ID
    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id -o tsv)
    
  2. Tetapkan diri Anda peran Petugas Kripto Key Vault untuk membuat kunci.

    az role assignment create \
        --role "Key Vault Crypto Officer" \
        --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
        --assignee-principal-type "User" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Buat kunci di brankas kunci. Pastikan encrypt dan decrypt operasi utama diaktifkan.

    export KEY_NAME="<your-key-name>"
    
    az keyvault key create --name $KEY_NAME --vault-name $KEY_VAULT_NAME
    
    # Get the key ID (without version for automatic rotation)
    export KEY_ID=$(az keyvault key show --name $KEY_NAME --vault-name $KEY_VAULT_NAME --query 'key.kid' -o tsv)
    export KEY_ID_NO_VERSION=$(echo $KEY_ID | sed 's|/[^/]*$||')
    

Buat identitas terkelola yang ditetapkan pengguna

  1. Buat identitas terkelola yang ditetapkan pengguna untuk kluster.

    export IDENTITY_NAME="<your-identity-name>"
    
    az identity create --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP
    
    # Get the identity details
    export IDENTITY_OBJECT_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'principalId' -o tsv)
    export IDENTITY_RESOURCE_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RESOURCE_GROUP --query 'id' -o tsv)
    
  2. Tetapkan peran yang diperlukan ke identitas terkelola.

    # Assign Key Vault Crypto User role for encrypt/decrypt operations
    az role assignment create \
        --role "Key Vault Crypto User" \
        --assignee-object-id $IDENTITY_OBJECT_ID \
        --assignee-principal-type "ServicePrincipal" \
        --scope $KEY_VAULT_RESOURCE_ID
    
    # Assign Key Vault Contributor role for key management
    az role assignment create \
        --role "Key Vault Contributor" \
        --assignee-object-id $IDENTITY_OBJECT_ID \
        --assignee-principal-type "ServicePrincipal" \
        --scope $KEY_VAULT_RESOURCE_ID
    

Membuat kluster AKS baru dengan kunci yang dikelola pelanggan

Buat kluster AKS baru dengan enkripsi KMS menggunakan kunci yang dikelola pelanggan.

az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kubernetes-version 1.33.0 \
    --kms-infrastructure-encryption Enabled \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
    --azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
    --azure-keyvault-kms-key-vault-network-access Public \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --generate-ssh-keys

Mengaktifkan kunci yang dikelola pelanggan pada kluster yang ada

Aktifkan enkripsi KMS dengan kunci yang dikelola pelanggan pada kluster AKS yang ada.

Nota

Kluster harus menjalankan Kubernetes versi 1.33 atau yang lebih baru.

az aks update Jika perintah mengembalikan ReconcileAzureKeyVaultKmsError kesalahan, jalankan perintah berikut untuk memeriksa apakah rahasia yang ada dapat dibaca dan ditulis:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Jika perintah ini gagal (misalnya, penolakan webhook atau sumber daya tidak ditemukan), perbaiki masalah dan jalankan kembali perintah pembaruan. Pesan "Objek telah dimodifikasi" tidak memerlukan tindakan — anggap itu sebagai berhasil.

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kms-infrastructure-encryption Enabled \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
    --azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
    --azure-keyvault-kms-key-vault-network-access Public \
    --assign-identity $IDENTITY_RESOURCE_ID

Memverifikasi konfigurasi KMS

Setelah mengaktifkan enkripsi KMS, verifikasi konfigurasi.

az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query 'securityProfile'

Output mencakup konfigurasi KMS:

{
    "azureKeyVaultKms": {
        "enabled": true,
        "keyId": "https://<key-vault-name>.vault.azure.net/keys/<key-name>",
        "keyVaultNetworkAccess": "Public",
        "keyVaultResourceId": "<key-vault-resource-id>"
    },
    "kubernetesResourceObjectEncryptionProfile": {
        "infrastructureEncryption": "Enabled"
    }
}

Migrasi antara opsi manajemen kunci

Anda dapat bermigrasi antara kunci yang dikelola platform dan kunci yang dikelola pelanggan.

Bermigrasi dari kunci yang dikelola platform ke kunci yang dikelola pelanggan

Untuk bermigrasi dari kunci yang dikelola platform ke kunci yang dikelola pelanggan, pertama-tama siapkan brankas kunci, kunci, dan identitas terkelola seperti yang dijelaskan di bagian kunci yang dikelola pelanggan, lalu jalankan perintah pembaruan:

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kms-infrastructure-encryption Enabled \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID_NO_VERSION \
    --azure-keyvault-kms-key-vault-resource-id $KEY_VAULT_RESOURCE_ID \
    --azure-keyvault-kms-key-vault-network-access Public \
    --assign-identity $IDENTITY_RESOURCE_ID

Bermigrasi dari kunci yang dikelola pelanggan ke kunci yang dikelola platform

Untuk bermigrasi dari kunci yang dikelola pelanggan ke kunci yang dikelola platform:

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --kms-infrastructure-encryption Enabled \
    --disable-azure-keyvault-kms

Rotasi kunci

Dengan enkripsi data KMS, rotasi kunci ditangani secara berbeda tergantung pada opsi manajemen kunci Anda:

  • Kunci yang dikelola platform: Rotasi kunci bersifat otomatis. Tidak diperlukan tindakan.
  • Kunci yang dikelola pelanggan: Setelah Anda merotasi kunci di Azure Key Vault, KMS secara berkala mendeteksi versi kunci baru. Tunggu setidaknya tujuh hari setelah membuat versi kunci baru sebelum menghapus yang lama.

Nota

Tidak seperti pengalaman KMS warisan, dengan implementasi baru ini Anda tidak perlu mengenkripsi ulang rahasia secara manual setelah rotasi kunci. Platform menangani ini secara otomatis.

Jangan hapus atau biarkan versi kunci lama kedaluwarsa tepat setelah Anda membuat yang baru.