Menyiapkan pengikatan identitas pada Azure Kubernetes Service (AKS)

Siapkan pengikatan identitas pada kluster Azure Kubernetes Service (AKS) Anda untuk memetakan identitas terkelola yang ditetapkan pengguna (UAMI) di beberapa kluster saat menggunakan satu kredensial identitas federasi (FIC). Penyiapan ini membantu Anda menskalakan autentikasi Microsoft Entra untuk beban kerja tanpa mencapai batas FIC.

Prasyarat

  • Tinjau Konsep pengikatan identitas untuk memahami cara kerja pengikatan identitas.
  • Azure CLI versi 2.73.0 atau yang lebih baru. Untuk memeriksa versi Anda, gunakan az version perintah . Untuk menginstal atau memperbarui Azure CLI, lihat Menginstal Azure CLI.
  • Anda memerlukan izin Azure berikut pada lingkup identitas dan kluster: Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write dan Microsoft.ContainerService/managedClusters/write.
  • Anda memerlukan izin admin kluster Kubernetes (atau setara) untuk membuat ClusterRole dan ClusterRoleBinding sumber daya.

Keterbatasan

Membuat sumber daya pengujian

  1. Buat grup sumber daya Azure menggunakan az group create perintah .

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Buat kluster AKS dengan identitas beban kerja dan penerbit OIDC yang diaktifkan menggunakan perintah az aks create dengan bendera --enable-workload-identity dan --enable-oidc-issuer.

    export CLUSTER_NAME="ib-test-cluster"
    
    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --location $LOCATION --no-ssh-key --enable-workload-identity --enable-oidc-issuer
    
  3. Buat identitas terkelola yang ditetapkan pengguna (UAMI) menggunakan az identity create perintah .

    export MI_NAME="ib-test-mi"
    az identity create --resource-group $RESOURCE_GROUP --name $MI_NAME
    

Dapatkan ID UAMI

  • Dapatkan ID sumber daya, utama, klien, dan penyewa UAMI dan tetapkan sebagai variabel lingkungan menggunakan perintah berikut az identity show :

    export MI_RESOURCE_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query id --output tsv)
    export MI_PRINCIPAL_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query principalId --output tsv)
    export MI_CLIENT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query clientId --output tsv)
    export MI_TENANT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query tenantId --output tsv)
    

Membuat pengikatan identitas

  • Petakan UAMI ke kluster AKS dengan pengikatan identitas menggunakan perintah az aks identity-binding create.

    az aks identity-binding create --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib" --managed-identity-resource-id $MI_RESOURCE_ID
    

    Nota

    Saat Anda membuat pengikatan identitas, AKS secara otomatis membuat kredensial identitas federasi (FIC) bernama aks-identity-binding di bawah UAMI. Kredensial ini dikelola oleh AKS. Jangan ubah atau hapus saat pengikatan identitas sedang digunakan. FIC yang dibuat untuk pengikatan identitas dibagikan di semua pengikatan identitas yang merujuk pada UAMI yang sama.

Dapatkan URL penerbit OIDC untuk UAMI

  • Peroleh URL penerbit OIDC yang terkait dengan UAMI dengan memeriksa pengikatan identitas menggunakan perintah az aks identity-binding show.

    az aks identity-binding show --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib"
    

    Contoh output ringkas:

    {
      "oidcIssuer": {
        "oidcIssuerUrl": "https://ib.oic.prod-aks.azure.com/<MI-tenant-id>/<MI-client-id>"
      }
    }
    

Menyambungkan ke kluster AKS

  1. Dapatkan kredensial kluster AKS menggunakan az aks get-credentials perintah dan simpan ke file kubeconfig terpisah:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. Atur KUBECONFIG variabel lingkungan untuk menunjuk ke file kubeconfig baru:

    export KUBECONFIG="$(pwd)/${CLUSTER_NAME}.kubeconfig"
    

Mengotorisasi namespace dan akun layanan

  • Konfigurasikan kontrol akses berbasis peran (RBAC) untuk memberikan subjek tertentu izin untuk menggunakan identitas terkelola melalui pengikatan identitas dengan menerapkan manifes berikut menggunakan dengan perintah berikut kubectl apply .

    Nota

    Contoh berikut secara eksplisit mengacu pada akun layanan demo di namespace demo. Meskipun secara eksplisit mengacu pada akun layanan tertentu adalah salah satu opsi, dimungkinkan juga untuk merujuk ke kumpulan akun layanan di bawah subjects. Untuk informasi selengkapnya, lihat Mengacu pada subjek dalam dokumentasi Kubernetes.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: demo
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: demo
      namespace: demo
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    rules:
      - verbs: ["use-managed-identity"]
        apiGroups: ["cid.wi.aks.azure.com"]
        resources: ["${MI_CLIENT_ID}"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-mi-${MI_CLIENT_ID}
    subjects:
      - kind: ServiceAccount
        name: demo
        namespace: demo
    EOF
    

Membuat brankas kunci dengan perlindungan penghapusan menyeluruh dan otorisasi Azure RBAC

  • Buat vault kunci dengan perlindungan penghapusan dan otorisasi Azure RBAC diaktifkan menggunakan perintah az keyvault create dengan bendera --enable-purge-protection dan --enable-rbac-authorization. Anda juga dapat menggunakan brankas kunci yang ada jika dikonfigurasi untuk perlindungan penghapusan menyeluruh dan otorisasi Azure RBAC.

    export KEY_VAULT_NAME="ib-test"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --enable-purge-protection \
        --enable-rbac-authorization
    

Dapatkan ID dan URL sumber daya brankas kunci

  1. Dapatkan ID sumber daya key vault menggunakan perintah az keyvault show dan atur sebagai variabel lingkungan.

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. Dapatkan URL brankas kunci dengan menggunakan perintah az keyvault show dan atur sebagai variabel lingkungan.

    export KEYVAULT_URL="$(az keyvault show \
        --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query properties.vaultUri \
        --output tsv)"
    

Mengonfigurasi akses Key Vault dan membuat secret

Langkah-langkah berikut menunjukkan cara mengakses rahasia, kunci, atau sertifikat di Azure Key Vault dari pod. Contoh di bagian ini mengonfigurasi akses ke rahasia di brankas kunci untuk identitas beban kerja, tetapi Anda dapat melakukan langkah serupa untuk mengonfigurasi akses ke kunci atau sertifikat.

Contoh berikut menunjukkan cara menggunakan model izin Azure RBAC untuk memberikan akses pod ke brankas kunci. Untuk informasi selengkapnya tentang model izin Azure RBAC untuk Azure Key Vault, lihat Memberikan izin ke aplikasi untuk mengakses Azure Key Vault menggunakan Azure RBAC.

  1. Dapatkan ID objek pengguna yang masuk menggunakan az ad signed-in-user show perintah dan atur sebagai variabel lingkungan:

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. Tetapkan diri Anda peran Azure RBAC Key Vault Secrets Officer pada brankas kunci menggunakan perintah .

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. Buat rahasia di brankas kunci menggunakan az keyvault secret set perintah .

    export KEY_VAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name $KEY_VAULT_NAME \
        --name $KEY_VAULT_SECRET_NAME \
        --value "Hello\!"
    
  4. Tetapkan peran Pengguna Rahasia Key Vault ke UAMI, menggunakan perintah az role assignment create.

    az role assignment create \
        --assignee-object-id $MI_PRINCIPAL_ID \
        --role "Key Vault Secrets User" \
        --scope $KEY_VAULT_RESOURCE_ID \
        --assignee-principal-type ServicePrincipal
    

Menganotasi akun layanan

  1. Tandai akun layanan dengan ID penyewa identitas terkelola menggunakan perintah kubectl annotate.

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. Buat anotasi akun layanan dengan ID klien identitas terkelola kubectl annotate menggunakan perintah .

    kubectl annotate sa demo -n demo azure.workload.identity/client-id=$MI_CLIENT_ID
    

Sebarkan aplikasi sampel

  • Sebarkan pod sampel yang menggunakan pengikatan identitas untuk mendapatkan token akses bagi identitas terkelola untuk mengakses Azure Key Vault menggunakan perintah berikut kubectl apply :

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: demo
      labels:
        azure.workload.identity/use: "true"
      annotations:
        azure.workload.identity/use-identity-binding: "true"
    spec:
      serviceAccount: demo
      containers:
        - name: azure-sdk
          # source code: https://github.com/Azure/azure-workload-identity/blob/feature/custom-token-endpoint/examples/identitybinding-msal-go/main.go
          image: ghcr.io/bahe-msft/azure-workload-identity/identitybinding-msal-go:latest-linux-amd64
          env:
            - name: KEYVAULT_URL
              value: ${KEYVAULT_URL}
            - name: SECRET_NAME
              value: ${KEY_VAULT_SECRET_NAME}
      restartPolicy: Never
    EOF
    

Verifikasi akses ke Key Vault dari aplikasi sampel

  1. Gambarkan pod dan konfirmasi variabel lingkungan serta pemasangan volume token yang diproyeksikan ada menggunakan perintah kubectl describe pod.

    kubectl describe pod demo -n demo
    

    Output yang diharapkan harus berisi nilai untuk AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_FEDERATED_TOKEN_FILE, AZURE_AUTHORITY_HOST, AZURE_KUBERNETES_TOKEN_PROXY. AZURE_KUBERNETES_SNI_NAME, dan AZURE_KUBERNETES_CA_FILE.

  2. Verifikasi pod bisa mendapatkan token dan mengakses sumber daya menggunakan perintah kubectl logs.

    kubectl logs demo -n demo
    

    Jika berhasil, output harus mirip dengan contoh berikut:

    I1107 20:03:42.865180       1 main.go:77] "successfully got secret" secret="Hello!"
    

Menskalakan pengikatan identitas di beberapa kluster

Pengikatan identitas memungkinkan pemetaan beberapa kluster AKS ke UAMI yang sama saat masih menggunakan satu FIC. Untuk menskalakan pengikatan identitas di beberapa kluster, Anda dapat mengulangi langkah-langkah dari Membuat pengikatan identitas melalui memverifikasi akses ke brankas kunci dari aplikasi sampel untuk setiap kluster tambahan yang ingin Anda petakan ke UAMI yang sama (membuat pengikatan identitas baru per kluster).

Membersihkan sumber daya

Jika Anda tidak lagi memerlukan sumber daya yang Anda buat dalam artikel ini, Anda dapat membersihkannya untuk menghindari timbulnya biaya di masa mendatang.

  1. Hapus pod dengan menggunakan perintah kubectl delete pod.

    kubectl delete pod demo -n demo
    
  2. Hapus namespace dengan perintah kubectl delete ns.

    kubectl delete ns demo
    
  3. Hapus grup sumber daya dan semua sumber daya terkait menggunakan az group delete perintah .

    az group delete --name $RESOURCE_GROUP --yes --no-wait