Menggunakan Azure RBAC pada kluster Kubernetes dengan dukungan Azure Arc

Jenis objek Kube ClusterRoleBinding dan RoleBinding membantu menentukan otorisasi pada Kube secara asli. Dengan menggunakan fitur ini, Anda dapat menggunakan ID Microsoft Entra dan penetapan peran di Azure untuk mengontrol pemeriksaan otorisasi pada kluster. Penetapan peran Azure memungkinkan Anda mengontrol secara terperinci pengguna mana yang dapat membaca, menulis, dan menghapus objek Kubernetes seperti penyebaran, pod, dan layanan.

Untuk gambaran umum konseptual fitur ini, lihat Azure RBAC di Kubernetes dengan dukungan Azure Arc.

Prasyarat

  • Instal atau tingkatkan Azure CLI ke versi terbaru.

  • Instal versi connectedk8s terbaru ekstensi Azure CLI:

    az extension add --name connectedk8s
    

    Jika ekstensi connectedk8s sudah dipasang, Anda dapat memperbaruinya ke versi terbaru dengan menggunakan perintah berikut:

    az extension update --name connectedk8s
    
  • Menyambungkan kluster Kubernetes berbasis Azure Arc yang telah ada:

Catatan

Anda tidak dapat menyiapkan fitur ini untuk Red Hat OpenShift, atau untuk penawaran Kubernetes terkelola penyedia cloud seperti Elastic Kubernetes Service atau Google Kubernetes Engine di mana pengguna tidak memiliki akses ke server API kluster. Untuk kluster Azure Kubernetes Service (AKS), fitur ini tersedia secara asli dan tidak memerlukan kluster AKS untuk terhubung ke Azure Arc.

Mengaktifkan Azure RBAC pada kluster

  1. Dapatkan identitas MSI kluster dengan menjalankan perintah berikut:

    az connectedk8s show -g <resource-group> -n <connected-cluster-name>
    
  2. Dapatkan ED (identity.principalId) dari output dan jalankan perintah berikut untuk menetapkan peran Cluster Managed Identity CheckAccess Reader yang Koneksi ke kluster MSI:

    az role assignment create --role "Connected Cluster Managed Identity CheckAccess Reader" --assignee "<Cluster MSI ID>" --scope <cluster ARM ID>
    
  3. Aktifkan kontrol akses berbasis peran Azure (RBAC) pada kluster Kubernetes dengan dukungan Azure Arc dengan menjalankan perintah berikut:

    az connectedk8s enable-features -n <clusterName> -g <resourceGroupName> --features azure-rbac --app-id "${SERVER_APP_ID}" --app-secret "${SERVER_APP_SECRET}"
    

    Catatan

    Sebelum Menjalankan perintah sebelumnya, pastikan bahwa file kubeconfig pada mesin menunjuk ke kluster tempat Anda mengaktifkan fitur Azure RBAC.

    Gunakan --skip-azure-rbac-list dengan perintah sebelumnya untuk daftar nama pengguna, email, dan koneksi OpenID yang dipisahkan koma yang menjalani pemeriksaan otorisasi dengan menggunakan Kube ClusterRoleBinding asli dan objek RoleBinding, bukan Azure RBAC.

Kluster generik di mana tidak ada reconciler yang berjalan pada apiserver spesifikasi

  1. SSH ke dalam setiap simpul master kluster dan ambil langkah-langkah berikut:

    Jika Anda kube-apiserver adalah pod statis:

    1. Rahasia azure-arc-guard-manifests di kube-system namespace berisi dua file: guard-authn-webhook.yaml dan guard-authz-webhook.yaml. Salin file-file ini ke /etc/guard direktori simpul.

      sudo mkdir -p /etc/guard
      kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authn-webhook.yaml"' | base64 -d > /etc/guard/guard-authn-webhook.yaml
      kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authz-webhook.yaml"' | base64 -d > /etc/guard/guard-authz-webhook.yaml
      
    2. Buka manifes apiserver di mode edit:

      sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
      
    3. Tambahkan spesifikasi berikut di bawah volumes:

      - name: azure-rbac
          hostPath:
          path: /etc/guard
          type: Directory
      
    4. Tambahkan spesifikasi berikut di bawah volumeMounts:

      - mountPath: /etc/guard
          name: azure-rbac
          readOnly: true
      

    Jika Anda kube-apiserver bukan pod statis:

    1. Buka manifes apiserver di mode edit:

      sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
      
    2. Tambahkan spesifikasi berikut di bawah volumes:

      - name: azure-rbac
          secret:
          secretName: azure-arc-guard-manifests
      
    3. Tambahkan spesifikasi berikut di bawah volumeMounts:

      - mountPath: /etc/guard
          name: azure-rbac
          readOnly: true
      
  2. Tambahkan argumen apiserver berikut:

    - --authentication-token-webhook-config-file=/etc/guard/guard-authn-webhook.yaml
    - --authentication-token-webhook-cache-ttl=5m0s
    - --authorization-webhook-cache-authorized-ttl=5m0s
    - --authorization-webhook-config-file=/etc/guard/guard-authz-webhook.yaml
    - --authorization-webhook-version=v1
    - --authorization-mode=Node,RBAC,Webhook
    

    Jika kluster Kube adalah versi 1.19.0 atau yang lebih baru, kamu juga harus mengatur argumen apiserver berikut:

    - --authentication-token-webhook-version=v1
    
  3. Simpan dan tutup editor untuk memperbarui pod apiserver.

Kluster yang dibuat dengan menggunakan Kluster API

  1. Salin rahasia penjaga yang berisi autentikasi dan otorisasi file konfigurasi webhook dari kluster beban kerja ke mesin Anda:

    kubectl get secret azure-arc-guard-manifests -n kube-system -o yaml > azure-arc-guard-manifests.yaml
    
  2. Ubah bidang namespace dalam file azure-arc-guard-manifests.yaml ke namespace layanan dalam kluster manajemen tempat Anda menerapkan sumber daya kustom untuk pembuatan kluster beban kerja.

  3. Terapkan manifes ini:

    kubectl apply -f azure-arc-guard-manifests.yaml
    
  4. Edit objek KubeadmControlPlane dengan menjalankan kubectl edit kcp <clustername>-control-plane:

    1. Tambahkan cuplikan berikut di bawah files:

      - contentFrom:
          secret:
            key: guard-authn-webhook.yaml
            name: azure-arc-guard-manifests
        owner: root:root
        path: /etc/kubernetes/guard-authn-webhook.yaml
        permissions: "0644"
      - contentFrom:
          secret:
            key: guard-authz-webhook.yaml
            name: azure-arc-guard-manifests
        owner: root:root
        path: /etc/kubernetes/guard-authz-webhook.yaml
        permissions: "0644"
      
    2. Tambahkan cuplikan berikut di bawah apiServer>extraVolumes:

      - hostPath: /etc/kubernetes/guard-authn-webhook.yaml
          mountPath: /etc/guard/guard-authn-webhook.yaml
          name: guard-authn
          readOnly: true
      - hostPath: /etc/kubernetes/guard-authz-webhook.yaml
          mountPath: /etc/guard/guard-authz-webhook.yaml
          name: guard-authz
          readOnly: true
      
    3. Tambahkan cuplikan berikut di bawah apiServer>extraArgs:

      authentication-token-webhook-cache-ttl: 5m0s
      authentication-token-webhook-config-file: /etc/guard/guard-authn-webhook.yaml
      authentication-token-webhook-version: v1
      authorization-mode: Node,RBAC,Webhook
      authorization-webhook-cache-authorized-ttl: 5m0s
      authorization-webhook-config-file: /etc/guard/guard-authz-webhook.yaml
      authorization-webhook-version: v1
      
    4. Simpan dan tutup untuk memperbarui objek KubeadmControlPlane. Tunggu hingga perubahan ini muncul pada kluster beban kerja.

Membuat penetapan peran bagi pengguna untuk mengakses kluster

Pemilik sumber daya Kubernetes dengan dukungan Azure Arc dapat menggunakan peran bawaan atau peran kustom untuk memberi pengguna lain akses ke kluster Kubernetes.

Peran bawaan

Peran Deskripsi
Penampil Kubernetes Azure Arc Mengizinkan akses baca-saja untuk melihat sebagian besar objek di namespace layanan. Peran ini tidak mengizinkan melihat rahasia, karena read izin pada rahasia akan memungkinkan akses ke ServiceAccount kredensial di namespace. Info masuk ini pada gilirannya akan memungkinkan akses API melalui nilai ServiceAccount tersebut (bentuk eskalasi hak istimewa).
Penulis Azure Arc Kubernetes Mengizinkan akses read/write ke sebagian besar objek dalam sebuah namespace layanan. Peran ini tidak memungkinkan melihat atau memodifikasi peran atau pengikatan peran. Namun, peran ini memungkinkan mengakses rahasia dan menjalankan pod sebagai nilai apa pun ServiceAccount di namespace layanan, sehingga dapat digunakan untuk mendapatkan tingkat akses API dari nilai apa pun ServiceAccount di namespace layanan.
Azure Arc Kubernetes Admin Mengizinkan akses admin. Ini dimaksudkan untuk diberikan dalam namespace layanan melalui RoleBinding. Jika Anda menggunakannya di RoleBinding, ini memungkinkan akses baca/tulis ke sebagian besar sumber daya di namespace layanan, termasuk kemampuan untuk membuat peran dan pengikatan peran dalam namespace layanan. Peran ini tidak mengizinkan akses write ke kuota sumber daya atau ke namespace itu sendiri.
Admin Klaster Azure Arc Kubernetes Mengizinkan akses bagi superuser untuk melakukan tindakan apa pun pada sumber daya apa pun. Ketika Anda menggunakannya di ClusterRoleBinding, itu memberikan kontrol penuh atas setiap sumber daya di kluster dan di semua namespace layanan. Ketika Anda menggunakannya di RoleBinding, itu memberikan kontrol penuh atas setiap sumber daya di pengikatan peran namespace layanan, termasuk namespace layanan itu sendiri.

Anda dapat membuat penetapan peran yang tercakup ke kluster Kubernetes dengan dukungan Azure Arc di portal Azure pada panel Access Control (IAM) sumber daya kluster. Anda juga bisa menggunakan perintah Azure CLI berikut:

az role assignment create --role "Azure Arc Kubernetes Cluster Admin" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID

Dalam perintah tersebut, AZURE-AD-ENTITY-ID dapat berupa nama pengguna (misalnya,testuser@mytenant.onmicrosoft.com) atau bahkan nilai appId perwakilan layanan.

Berikut adalah contoh lain dalam membuat penetapan peran yang tercakup ke namespace layanan tertentu dalam kluster:

az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>

Catatan

Anda dapat membuat penetapan peran yang dilingkup ke kluster dengan menggunakan portal Azure atau Azure CLI. Namun, hanya Azure CLI yang dapat digunakan untuk membuat penetapan peran yang dilingkup ke namespace.

Peran kustom

Anda dapat memilih untuk membuat definisi peran Anda sendiri untuk digunakan dalam penetapan peran.

Di bawah ini adalah contoh definisi peran yang memungkinkan pengguna untuk hanya membaca penyebaran. Untuk informasi selengkapnya, lihat daftar lengkap tindakan data yang dapat Anda gunakan untuk membuat definisi peran.

Salin objek JSON berikut ke dalam file yang disebut custom-role.json. Ganti tempat penampung <subscription-id> dengan ID langganan aktual. Peran kustom menggunakan salah satu tindakan data dan memungkinkan Anda melihat semua penyebaran dalam cakupan (kluster atau namespace layanan) tempat penetapan peran dibuat.

{
    "Name": "Arc Deployment Viewer",
    "Description": "Lets you view all deployments in cluster/namespace.",
    "Actions": [],
    "NotActions": [],
    "DataActions": [
        "Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
    ],
    "NotDataActions": [],
    "assignableScopes": [
        "/subscriptions/<subscription-id>"
    ]
}
  1. Membuat definisi peran dengan menjalankan perintah berikut ini dari folder tempat Anda menyimpan custom-role.json:

    az role definition create --role-definition @custom-role.json
    
  2. Membuat penetapan peran dengan menggunakan definisi peran kustom ini:

    az role assignment create --role "Arc Deployment Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
    

Mengonfigurasi kubectl dengan info masuk pengguna

Ada dua cara untuk mendapatkan file kubeconfig yang kamu butuhkan untuk mengakses kluster:

  • Anda menggunakan fitur Koneksi kluster (az connectedk8s proxy) dari kluster Kubernetes dengan dukungan Azure Arc.
  • Admin kluster berbagi file kubeconfig dengan setiap pengguna lainnya.

Menggunakan koneksi kluster

Jalankan perintah berikut untuk memulai proses proksi:

az connectedk8s proxy -n <clusterName> -g <resourceGroupName>

Setelah proses proksi berjalan, Anda dapat membuka tab lain di konsol untuk mulai mengirim permintaan Anda ke kluster.

Menggunakan file kubeconfig bersama

Menggunakan kubeconfig bersama memerlukan langkah-langkah yang sedikit berbeda tergantung pada versi Kubernetes Anda.

  1. Jalankan perintah berikut untuk mengatur kredensial untuk pengguna. Tentukan serverApplicationId sebagai 6256c85f-0aad-4d50-b960-e6e9b21efe35 dan clientApplicationId sebagai 3f4439ff-e698-4d6d-84fe-09c9d574f06b:

    kubectl config set-credentials <testuser>@<mytenant.onmicrosoft.com> \
    --auth-provider=azure \
    --auth-provider-arg=environment=AzurePublicCloud \
    --auth-provider-arg=client-id=<clientApplicationId> \
    --auth-provider-arg=tenant-id=<tenantId> \
    --auth-provider-arg=apiserver-id=<serverApplicationId>
    
  2. Buka file kubeconfig yang kamu buat sebelumnya. Di bawah contexts, verifikasi bahwa konteks yang terkait dengan titik kluster ke info masuk pengguna yang Anda buat di langkah sebelumnya. Untuk mengatur konteks saat ini ke kredensial pengguna ini, jalankan perintah berikut:

    kubectl config set-context --current=true --user=<testuser>@<mytenant.onmicrosoft.com>
    
  3. Tambahkan pengaturan mode konfigurasi di bawah user>config:

    name: testuser@mytenant.onmicrosoft.com
    user:
        auth-provider:
        config:
            apiserver-id: $SERVER_APP_ID
            client-id: $CLIENT_APP_ID
            environment: AzurePublicCloud
            tenant-id: $TENANT_ID
            config-mode: "1"
        name: azure
    

    Catatan

    Plugin Exec adalah strategi autentikasi Kubernetes yang memungkinkan kubectl untuk menjalankan perintah eksternal untuk menerima kredensial pengguna untuk dikirim ke apiserver. Dimulai dengan Kubernetes versi 1.26, plugin otorisasi Azure default tidak lagi disertakan dalam client-go dan kubectl. Dengan versi yang lebih baru, untuk menggunakan plugin exec untuk menerima kredensial pengguna, Anda harus menggunakan Azure Kubelogin, client-go plugin kredensial (exec) yang mengimplementasikan autentikasi Azure.

  4. Instal Azure Kubelogin:

    • Untuk Windows atau Mac, ikuti instruksi penginstalan Azure Kubelogin.

    • Untuk Linux atau Ubuntu, unduh versi terbaru kubelogin, lalu jalankan perintah berikut:

      curl -LO https://github.com/Azure/kubelogin/releases/download/"$KUBELOGIN_VERSION"/kubelogin-linux-amd64.zip 
      
      unzip kubelogin-linux-amd64.zip 
      
      sudo mv bin/linux_amd64/kubelogin /usr/local/bin/ 
      
      sudo chmod +x /usr/local/bin/kubelogin 
      
  5. Konversikan kubelogin untuk menggunakan mode masuk yang sesuai. Misalnya, untuk login kode perangkat dengan pengguna Microsoft Entra, perintahnya adalah sebagai berikut:

    export KUBECONFIG=/path/to/kubeconfig
    
    kubelogin convert-kubeconfig
    

Mengirim permintaan ke kluster

  1. Jalankan perintah kubectl apa pun. Contohnya:

    • kubectl get nodes
    • kubectl get pods
  2. Setelah diminta untuk autentikasi berbasis browser, salin URL masuk perangkat (https://microsoft.com/devicelogin) dan buka di browser web Anda.

  3. Masukkan kode yang dicetak di konsol Anda. Salin dan tempel kode di terminal Anda ke dalam permintaan untuk input autentikasi perangkat.

  4. Masukkan nama pengguna (testuser@mytenant.onmicrosoft.com) dan kata sandi terkait.

  5. Jika Anda melihat pesan kesalahan seperti ini, artinya Anda tidak berwenang untuk mengakses sumber daya yang diminta:

    Error from server (Forbidden): nodes is forbidden: User "testuser@mytenant.onmicrosoft.com" cannot list resource "nodes" in API group "" at the cluster scope: User doesn't have access to the resource in Azure. Update role assignment to allow access.
    

    Admin perlu membuat penetapan peran baru yang memberi wewenang kepada pengguna ini untuk memiliki akses pada sumber daya.

Menggunakan Akses Bersyarah dengan ID Microsoft Entra

Saat mengintegrasikan MICROSOFT Entra ID dengan kluster Kubernetes dengan dukungan Azure Arc, Anda juga dapat menggunakan Akses Bersyarat untuk mengontrol akses ke kluster Anda.

Catatan

Microsoft Entra Conditional Access adalah kemampuan Microsoft Entra ID P2.

Untuk membuat contoh kebijakan Akses Bersyar untuk digunakan dengan kluster:

  1. Di bagian atas portal Azure, cari dan pilih ID Microsoft Entra.

  2. Pada menu untuk ID Microsoft Entra di sisi kiri, pilih Aplikasi perusahaan.

  3. Pada menu aplikasi perusahaan di sisi kiri, pilih Akses Bersyarat.

  4. Pada menu Akses Bersyarat di sisi kiri, pilih Kebijakan>Kebijakan baru.

    Cuplikan layar memperlihatkan cara menambahkan kebijakan akses bersyarkat di portal Azure.

  5. Masukkan nama untuk kebijakan, seperti arc-k8s-policy.

  6. Pilih Pengguna dan grup. Di bawah Sertakan, pilih Pilih pengguna dan grup. Pilih pengguna dan grup tempat Anda ingin menerapkan kebijakan. Untuk contoh ini, pilih grup Microsoft Entra yang sama yang memiliki akses administratif ke kluster Anda.

    Cuplikan layar yang memperlihatkan memilih pengguna atau grup untuk menerapkan kebijakan Akses Bersyar.

  7. Pilih Aplikasi atau tindakan cloud. Di bawah Sertakan, pilih Pilih aplikasi. Kemudian cari dan pilih aplikasi server yang Anda buat sebelumnya.

    Cuplikan layar memperlihatkan cara memilih aplikasi server di portal Azure.

  8. Di bawah Kontrol akses, pilih Beri. Pilih Berikan akses>Perangkat wajib ditandai sebagai sesuai.

    Cuplikan layar memperlihatkan cara mengizinkan hanya perangkat yang sesuai di portal Azure.

  9. Di bawah Aktifkan kebijakan, pilih Aktif>Buat.

    Cuplikan layar memperlihatkan cara mengaktifkan kebijakan akses bersyarkat di portal Azure.

Akses kluster lagi. Sebagai contoh, jalankan perintah kubectl get nodes untuk melihat simpul dalam kluster:

kubectl get nodes

Ikuti instruksi untuk sign-in lagi. Pesan kesalahan menyatakan bahwa Anda berhasil masuk, tetapi admin Anda memerlukan perangkat yang meminta akses untuk dikelola oleh ID Microsoft Entra untuk mengakses sumber daya. Ikuti langkah-langkah ini:

  1. Di portal Azure, buka ID Microsoft Entra.

  2. Pilih Aplikasi perusahaan. Lalu di bawah Aktivitas, pilih Masuk.

  3. Entri di bagian atas menunjukkan Gagal untuk Status dan Berhasil untuk Akses Bersyarat. Pilih entri, lalu pilih Akses Bersyarat di Detail. Perhatikan bahwa kebijakan Akses Bersyarat Anda terdaftar.

    Cuplikan layar memperlihatkan entri masuk yang gagal di portal Azure.

Mengonfigurasi akses kluster just-in-time dengan ID Microsoft Entra

Opsi lain untuk kontrol akses kluster adalah menggunakan Privileged Identity Management (PIM) untuk permintaan just-in-time.

Catatan

Microsoft Entra PIM adalah kemampuan Microsoft Entra ID P2. Untuk informasi selengkapnya tentang SKU MICROSOFT Entra ID, lihat panduan harga.

Untuk mengonfigurasi permintaan akses just-in-time untuk kluster Anda, selesaikan langkah-langkah berikut:

  1. Di bagian atas portal Azure, cari dan pilih ID Microsoft Entra.

  2. Catat ID penyewa. Untuk sisa instruksi ini, kami akan menunjukkan ID itu sebagai <tenant-id>.

    Cuplikan layar memperlihatkan detail ID Microsoft Entra di portal Azure.

  3. Pada menu untuk ID Microsoft Entra di sisi kiri, di bawah Kelola, pilih Grup>Grup Baru.

  4. Pastikan bahwa Keamanan dipilih untuk Tipe grup. Masukkan nama grup, seperti myJITGroup. Di bawah Peran Microsoft Entra dapat ditetapkan ke grup ini (Pratinjau), pilih Ya. Terakhir, pilih Buat.

    Cuplikan layar memperlihatkan detail untuk grup baru di portal Azure.

  5. Anda akan dikembalikan ke halaman Grup. Pilih grup yang baru Anda buat dan catat ID objeknya. Untuk sisa instruksi ini, kami akan menunjuk ID ini sebagai <object-id>.

    Cuplikan layar memperlihatkan ID objek untuk grup baru di portal Azure.

  6. Di portal Microsoft Azure, di menu untuk Aktivitas di sisi kiri, pilih Akses Istimewa (Pratinjau). Lalu pilih Aktifkan Akses Istimewa.

    Cuplikan layar memperlihatkan pilihan untuk mengaktifkan akses istimewa di portal Azure.

  7. Pilih Tambahkan Penugasan untuk mulai memberikan akses.

    Cuplikan layar memperlihatkan cara menambahkan tugas aktif di portal Azure.

  8. Pilih peran Anggota, dan pilih pengguna serta grup yang ingin Anda beri akses kluster. Admin grup dapat mengubah penugasan ini kapan saja. Saat Anda siap untuk melanjutkan, pilih Berikutnya.

    Cuplikan layar memperlihatkan cara menambahkan tugas di portal Azure.

  9. Pilih jenis penugasan Aktif, durasi yang diinginkan, dan menyediakan justifikasi. Saat Anda siap untuk melanjutkan, pilih Tetapkan. Untuk informasi selengkapnya tentang tipe tugas, lihat Menetapkan kelayakan untuk grup akses istimewa (pratinjau) dalam Privileged Identity Management.

    Cuplikan layar memperlihatkan properti penugasan di portal Azure.

Setelah Anda membuat penugasan, verifikasi bahwa akses just-in-time berfungsi dengan mengakses kluster. Sebagai contoh, Gunakan perintah kubectl get nodes untuk melihat simpul dalam kluster:

kubectl get nodes

Perhatikan persyaratan autentikasi dan ikuti langkah-langkah untuk mengautentikasi. Jika autentikasi berhasil, Anda akan melihat output yang mirip dengan ini:

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

NAME      STATUS   ROLES    AGE      VERSION
node-1    Ready    agent    6m36s    v1.18.14
node-2    Ready    agent    6m42s    v1.18.14
node-3    Ready    agent    6m33s    v1.18.14

Langkah berikutnya