Gunakan otorisasi Microsoft Entra ID untuk API Kubernetes di Azure Kubernetes Service (AKS)

Berlaku untuk: ✔️ AKS Automatic ✔️ AKS Standard

Artikel ini menunjukkan cara mengotorisasi panggilan ke API Kubernetes di Azure Kubernetes Service (AKS) dengan menggunakan identitas Microsoft Entra ID. Otorisasi Microsoft Entra ID untuk API Kubernetes menggunakan penetapan peran Azure RBAC untuk memberikan akses ke sumber daya Kubernetes. Untuk sumber daya Kubernetes bawaan, tetapkan salah satu peran bawaan AKS (seperti Azure Kubernetes Service RBAC Reader) pada cakupan kluster atau namespace. Untuk sumber daya kustom (CRD), tetapkan peran kustom dengan kondisi Azure ABAC yang menentukan grup CRD atau jenis yang dapat diakses penerima tugas. Dua penetapan peran terdiri dari: satu memberikan akses ke sumber daya Kubernetes standar, dan yang lain memberikan akses bersyarat ke sumber daya kustom tertentu.

Untuk sebagian besar beban kerja produksi, AKS Automatic adalah opsi default yang direkomendasikan dan siap untuk produksi bagi AKS. Kluster Otomatis AKS telah dikonfigurasi sebelumnya dengan Azure RBAC untuk otorisasi Kubernetes, sehingga Anda dapat fokus pada penetapan peran Microsoft Entra yang tepat kepada pengguna, grup, dan perwakilan layanan.

Untuk gambaran umum konseptual opsi otorisasi API Kubernetes yang tersedia di AKS, lihat Konsep otorisasi kluster.

Note

Saat menggunakan autentikasi terintegrasi antara MICROSOFT Entra ID dan AKS, Anda dapat menggunakan pengguna, grup, atau perwakilan layanan Microsoft Entra sebagai subjek dalam kontrol akses berbasis peran Kubernetes (Kubernetes RBAC). Dengan menggunakan otorisasi Microsoft Entra ID, Anda tidak perlu mengelola identitas dan kredensial pengguna secara terpisah untuk Kubernetes. Namun, Anda masih perlu menyiapkan dan mengelola penetapan peran Microsoft Entra ID dan pengikatan RBAC Kubernetes secara terpisah.

Note

Kluster Otomatis AKS telah dikonfigurasi sebelumnya untuk menggunakan Azure RBAC untuk otorisasi Kubernetes. Anda tidak perlu mengaktifkan --enable-azure-rbac pada kluster Otomatis AKS. Di AKS Standard, Anda dapat mengaktifkan atau menonaktifkan Azure RBAC berdasarkan konfigurasi kluster Anda.

Prerequisites

  • Anda memerlukan Azure CLI versi 2.24.0 atau yang lebih baru yang diinstal dan dikonfigurasi. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.
  • Anda memerlukan kubectl, dengan versi minimum 1.18.3.
  • Anda memerlukan integrasi Microsoft Entra terkelola yang diaktifkan pada kluster sebelum dapat menambahkan otorisasi Microsoft Entra ID untuk API Kubernetes. Jika Anda perlu mengaktifkan integrasi Microsoft Entra terkelola, lihat Menggunakan ID Microsoft Entra di AKS.
  • Penetapan peran baru dapat memakan waktu hingga lima menit untuk disebarluaskan dan diperbarui oleh server otorisasi.
  • Otorisasi Microsoft Entra ID untuk API Kubernetes mengharuskan tenant Microsoft Entra yang dikonfigurasi untuk autentikasi sama dengan tenant untuk langganan yang menaungi klaster AKS Anda.

Perilaku mode kluster AKS

Mode kluster Azure RBAC untuk otorisasi Kubernetes
AKS Otomatis Telah dikonfigurasi sebelumnya (diaktifkan secara default)
Standar AKS Opsional (aktifkan dengan --enable-azure-rbac)

Membuat kluster AKS baru dengan integrasi Microsoft Entra terkelola dan otorisasi Microsoft Entra ID

Untuk beban kerja produksi baru, gunakan AKS Otomatis. Azure RBAC untuk otorisasi Kubernetes telah diprakonfigurasi pada kluster AKS Automatic.

  1. Buat kluster Otomatis AKS dengan mengikuti Buat kluster otomatis Azure Kubernetes Service (AKS).

  2. Opsional: verifikasi bahwa Azure RBAC untuk otorisasi Kubernetes diaktifkan pada kluster Anda menggunakan az aks show perintah .

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    az aks show \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --query "aadProfile.enableAzureRbac" \
      --output tsv
    

Standar AKS

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

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Buat kluster AKS Standard dengan integrasi Microsoft Entra terkelola dan otorisasi Microsoft Entra ID menggunakan perintah az aks create.

    export CLUSTER_NAME=<cluster-name>
    
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --enable-aad \
        --enable-azure-rbac \
        --generate-ssh-keys
    

    Output Anda akan terlihat mirip dengan contoh output berikut:

    "AADProfile": {
        "adminGroupObjectIds": null,
        "clientAppId": null,
        "enableAzureRbac": true,
        "managed": true,
        "serverAppId": null,
        "serverAppSecret": null,
        "tenantId": "****-****-****-****-****"
    }
    

Mengaktifkan otorisasi Microsoft Entra ID pada kluster AKS yang ada

Untuk kluster AKS Standar yang sudah ada, aktifkan otorisasi Microsoft Entra ID untuk API Kubernetes menggunakan perintah az aks update dengan flag --enable-azure-rbac.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Enable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac

Kluster Otomatis AKS sudah memiliki RBAC Azure untuk otorisasi Kubernetes yang telah dikonfigurasi sebelumnya. Anda tidak perlu menjalankan --enable-azure-rbac untuk AKS Automatic.

Peran bawaan AKS

AKS menyediakan peran bawaan berikut:

Peranan Description
Pembaca Azure Kubernetes Service RBAC Mengizinkan akses baca-saja untuk melihat sebagian besar objek di namespace. Ini tidak mengizinkan menampilkan peran atau penggabungan peran. Peran ini tidak mengizinkan melihat Secrets, karena membaca konten Rahasia memungkinkan akses ke kredensial ServiceAccount di namespace, yang akan memungkinkan akses API sebagai ServiceAccount apa pun di namespace (bentuk eskalasi hak istimewa).
Penulis RBAC Azure Kubernetes Service Mengizinkan akses baca/tulis ke sebagian besar objek dalam sebuah namespace. Peran ini tidak memungkinkan melihat atau memodifikasi peran atau pengikatan peran. Namun, peran ini memungkinkan mengakses Secrets dan menjalankan Pod sebagai ServiceAccount apa pun di namespace layanan, sehingga dapat digunakan untuk mendapatkan tingkat akses API dari ServiceAccount apa pun di namespace layanan.
Administrator RBAC Azure Kubernetes Service Mengizinkan akses admin, yang dimaksudkan untuk diberikan di dalam namespace. Mengizinkan akses read/write ke sebagian besar sumber daya di namespace (atau cakupan kluster), termasuk kemampuan untuk membuat peran dan pengikatan peran dalam namespace. Peran ini tidak mengizinkan akses tulis ke kuota sumber daya atau ke namespace itu sendiri.
Azure Kubernetes Service RBAC Admin Kluster Mengizinkan akses bagi pengguna superuser untuk melakukan tindakan apa pun pada sumber daya apa pun. Ini memberikan kontrol penuh atas setiap sumber daya dalam kluster dan semua namespace.

Membuat penetapan peran untuk akses kluster

  1. Dapatkan ID sumber daya AKS Anda dengan perintah az aks show.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
  2. Buat penetapan peran menggunakan az role assignment create perintah . <AAD-ENTITY-ID> dapat berupa nama pengguna atau ID klien dari perwakilan layanan. Contoh berikut membuat penugasan peran untuk peran Azure Kubernetes Service RBAC Admin.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the Azure Kubernetes Service RBAC Admin role
    az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

    Note

    Anda dapat membuat penetapan peran Azure Kubernetes Service RBAC Reader dan Azure Kubernetes Service RBAC Writer yang dicakup ke namespace tertentu dalam kluster menggunakan az role assignment create perintah dan mengatur cakupan ke namespace yang diinginkan.

    az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
    

Membuat definisi peran kustom

Untuk sumber daya Kubernetes bawaan, definisi peran kustom mereferensikan tindakan grup API yang sesuai di bawah Microsoft.ContainerService/managedClusters/. Contoh berikut memungkinkan pengguna untuk hanya membaca deployment dan tidak yang lainnya. Untuk daftar lengkap kemungkinan tindakan, lihat operasi Microsoft.ContainerService. Untuk memfilter akses ke grup atau jenis sumber daya kustom tertentu (CRD), lihat Membatasi akses sumber daya kustom menggunakan kondisi ABAC nanti di artikel ini.

  1. Untuk membuat definisi peran kustom Anda sendiri, salin file berikut, ganti <YOUR-SUBSCRIPTION-ID> dengan ID langganan Anda sendiri, lalu simpan sebagai deploy-view.json.

    {
        "Name": "AKS Deployment Reader",
        "Description": "Lets you view all deployments in cluster/namespace.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/apps/deployments/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. Buat definisi peran menggunakan perintah az role definition create, mengatur --role-definition ke file deploy-view.json yang Anda buat di langkah sebelumnya.

    az role definition create --role-definition @deploy-view.json 
    
  3. Tetapkan definisi peran ke pengguna atau identitas lain menggunakan az role assignment create perintah .

        # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS Deployment Reader role
    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

Membatasi akses sumber daya kustom menggunakan kondisi ABAC (pratinjau)

Important

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:

Kondisi ABAC memungkinkan Anda memfilter penetapan peran Microsoft Entra ID ke grup dan jenis sumber daya kustom (CRD) tertentu—secara terpusat, dari Microsoft Entra ID, tanpa menulis manifes Kubernetes RBAC Role dan RoleBinding untuk tiap kluster. Untuk latar belakang Azure ABAC, lihat Apa itu kondisi penetapan peran Azure?

Kapan menggunakan kondisi ABAC

Gunakan fitur ini saat Anda ingin:

  • Batasi grup CRD mana atau jenis yang dapat dicantumkan atau didapatkan oleh penerima tugas.
  • Terapkan batas akses sumber daya kustom secara terpusat dari ID Microsoft Entra tanpa mengelola RBAC Role Kubernetes dan RoleBinding objek pada setiap kluster.
  • Membedakan antara CRD yang diterbitkan oleh operator yang berbeda (misalnya, izinkan secrets-store.csi.x-k8s.io saat memblokir security.istio.io).

Atribut kondisi yang tersedia

Atribut permintaan berikut tersedia saat menulis kondisi untuk API Kubernetes pada kluster AKS:

Attribute Description
Microsoft.ContainerService/managedClusters/customResources:group Grup API dari sumber daya kustom yang diakses (misalnya, secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind Jenis sumber daya kustom yang diakses (misalnya, secretproviderclasses).

Menambahkan kondisi ABAC ke penetapan peran

Contoh berikut membuat peran kustom Pembaca CRD AKS yang memberikan akses baca ke sumber daya kustom. Kemudian, peran ditetapkan dengan kondisi yang hanya mengizinkan akses ke secretproviderclasses dalam grup secrets-store.csi.x-k8s.io (CRD yang digunakan oleh penyedia Azure Key Vault untuk Secrets Store CSI Driver).

  1. Simpan definisi peran berikut ke file bernama crd-reader.json, mengganti <YOUR-SUBSCRIPTION-ID> dengan ID langganan Anda sendiri.

    {
        "Name": "AKS CRD Reader",
        "Description": "Lets you read custom resources in the cluster.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/customresources/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. Buat definisi peran menggunakan az role definition create perintah .

    az role definition create --role-definition @crd-reader.json
    
  3. Simpan kondisi berikut ke file bernama abac-condition.txt. Kondisi ini memungkinkan pembacaan sumber daya non-kustom untuk melewati tanpa perubahan, dan membatasi pembacaan terhadap sumber daya kustom ke grup dan jenis tertentu.

    (
     (
      !(ActionMatches{'Microsoft.ContainerService/managedClusters/customresources/read'})
     )
     OR
     (
      @Request[Microsoft.ContainerService/managedClusters/customResources:group] StringEqualsIgnoreCase 'secrets-store.csi.x-k8s.io'
      AND
      @Request[Microsoft.ContainerService/managedClusters/customResources:kind] StringEqualsIgnoreCase 'secretproviderclasses'
     )
    )
    
  4. Buat penetapan peran dengan kondisi menggunakan perintah az role assignment create.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS CRD Reader role with an ABAC condition
    az role assignment create \
        --role "AKS CRD Reader" \
        --assignee <AAD-ENTITY-ID> \
        --scope $AKS_ID \
        --condition "$(cat abac-condition.txt)" \
        --condition-version "2.0" \
        --description "Allow reads on SecretProviderClass resources only"
    

Anda juga dapat menambahkan kondisi melalui portal Microsoft Azure. Pada halaman Tambahkan penetapan peran , pilih tab Kondisi , lalu pilih Tambahkan kondisi dan gunakan editor visual untuk menyusun ekspresi.

Memverifikasi kondisi

Setelah penetapan peran disebarluaskan (hingga lima menit), masuk sebagai penerima tugas dan konfirmasikan bahwa mereka dapat membaca CRD yang diizinkan tetapi bukan CRD lain.

  1. Dapatkan kredensial kluster menggunakan az aks get-credentials perintah .

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the cluster credentials
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Daftar secretproviderclasses dari grup secrets-store.csi.x-k8s.io, yang diizinkan oleh kondisi. Komando harus berhasil dan mengembalikan sumber daya yang ada atau daftar kosong (atau kesalahan "tidak ditemukan" jika CRD tidak diinstal pada kluster).

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. Daftar authorizationpolicies dari grup Istio security.istio.io, yang kondisinya memblokir. Perintah harus gagal dengan kesalahan Forbidden dari webhook otorisasi Microsoft Entra ID (dengan asumsi Istio CRD telah diinstal pada kluster; jika tidak, kubectl akan mengembalikan kesalahan not-found sebelum server API mencapai webhook otorisasi).

    kubectl get authorizationpolicies.security.istio.io --all-namespaces
    

Membersihkan sumber daya

Menonaktifkan otorisasi Microsoft Entra ID

Hapus otorisasi Microsoft Entra ID menggunakan perintah az aks update dengan flag --disable-azure-rbac.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Disable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac

Menghapus penetapan peran

  1. Gunakan perintah az role assignment list untuk mencantumkan penugasan peran.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # List role assignments for the AKS cluster
    az role assignment list --scope $AKS_ID --query [].id --output tsv
    
  2. Hapus penetapan peran menggunakan az role assignment delete perintah .

    az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
    

Menghapus definisi peran

Hapus definisi peran kustom menggunakan az role definition delete perintah .

az role definition delete --name "AKS Deployment Reader"

Menghapus grup sumber daya dan kluster AKS

Hapus grup sumber daya (dan kluster AKS yang dikandungnya) menggunakan az group delete perintah .

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>

# Delete the resource group and all resources in it
az group delete --name $RESOURCE_GROUP --yes --no-wait

Untuk mempelajari selengkapnya tentang AKS, lihat artikel berikut ini: