Gunakan kontrol akses berbasis peran Kubernetes dengan Azure Active Directory di Azure Kubernetes Service

Azure Kubernetes Service (AKS) dapat dikonfigurasi untuk menggunakan Azure Active Directory (Azure AD) untuk autentikasi pengguna. Dalam konfigurasi ini, Anda dapat masuk ke kluster AKS menggunakan token autentikasi Microsoft Azure Active Directory. Setelah diautentikasi, Anda dapat menggunakan kontrol akses berbasis peran Kubernetes (Kubernetes RBAC) bawaan untuk mengelola akses ke namespace layanan dan sumber daya kluster berdasarkan identitas pengguna atau keanggotaan grup.

Artikel ini menunjukkan cara:

  • Mengontrol akses menggunakan RBAC Kubernetes dalam kluster AKS berdasarkan keanggotaan grup Azure AD.
  • Buat grup contoh dan pengguna di Azure AD.
  • Buat Peran dan RoleBindings di kluster AKS untuk memberikan izin yang sesuai untuk membuat dan melihat sumber daya.

Sebelum Anda mulai

  • Anda memiliki kluster AKS yang sudah ada dengan integrasi Azure AD diaktifkan. Jika Anda memerlukan kluster AKS dengan konfigurasi ini, lihat Mengintegrasikan Azure AD dengan AKS.
  • RBAC Kube diaktifkan secara default selama pembuatan kluster AKS. Untuk meningkatkan kluster dengan integrasi Azure AD dan RBAC Kubernetes, Aktifkan integrasi Azure AD pada kluster AKS yang ada.
  • Pastikan Azure CLI versi 2.0.61 atau yang lebih baru diinstal dan dikonfigurasi. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Pasang CLI Azure.
  • Jika menggunakan Terraform, instal Terraform versi 2.99.0 atau yang lebih baru.

Gunakan portal Azure atau Azure CLI untuk memverifikasi integrasi Azure AD dengan RBAC Kubernetes diaktifkan.

Untuk memverifikasi menggunakan portal Azure:

  • Dari browser Anda, masuk ke portal Azure.
  • Navigasi ke layanan Kubernetes, dan dari panel sebelah kiri pilih Konfigurasi kluster.
  • Di bawah bagian Autentikasi dan Otorisasi, verifikasi autentikasi Azure AD dengan opsi RBAC Kubernetes dipilih.

Contoh halaman Autentikasi dan Otorisasi AKS di portal Azure.

Membuat grup demo di Azure Active Directory

Dalam artikel ini, kita akan membuat dua peran pengguna untuk menunjukkan bagaimana RBAC Kubernetes dan Azure AD mengontrol akses ke sumber daya kluster. Dua peran contoh berikut digunakan:

  • Pengembang aplikasi
    • Pengguna bernama aksdev yang merupakan bagian dari grup appdev .
  • Teknisi keandalan situs
    • Pengguna bernama akssre yang merupakan bagian dari grup opssre .

Di lingkungan produksi, Anda dapat menggunakan pengguna dan grup yang sudah ada dalam penyewa Azure Active Directory.

  1. Pertama, dapatkan ID sumber daya kluster AKS Anda menggunakan az aks show perintah . Kemudian, tetapkan ID sumber daya ke variabel bernama AKS_ID sehingga dapat dirujuk dalam perintah lain.

    AKS_ID=$(az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query id -o tsv)
    
  2. Buat grup contoh pertama di Azure AD untuk pengembang aplikasi menggunakan az ad group create perintah . Contoh berikut membuat grup sumber daya bernama appdev:

    APPDEV_ID=$(az ad group create --display-name appdev --mail-nickname appdev --query Id -o tsv)
    
  3. Buat penetapan peran Azure untuk grup appdev menggunakan az role assignment create perintah . Penugasan ini memungkinkan setiap anggota grup menggunakan kubectl untuk berinteraksi dengan kluster AKS dengan memberi mereka Peran Pengguna Kluster Azure Kubernetes Service.

    az role assignment create \
      --assignee $APPDEV_ID \
      --role "Azure Kubernetes Service Cluster User Role" \
      --scope $AKS_ID
    

Tip

Jika Anda menerima kesalahan seperti Principal 35bfec9328bd4d8d9b54dea6dac57b82 doesn't exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5., tunggu beberapa detik hingga ID objek grup Azure Active Directory merambat melalui direktori, lalu coba perintah az role assignment create lagi.

  1. Buat grup contoh kedua untuk SRE bernama opssre.

    OPSSRE_ID=$(az ad group create --display-name opssre --mail-nickname opssre --query objectId -o tsv)
    
  2. Buat penetapan peran Azure untuk memberi anggota grup Peran Pengguna Kluster Azure Kubernetes Service.

    az role assignment create \
      --assignee $OPSSRE_ID \
      --role "Azure Kubernetes Service Cluster User Role" \
      --scope $AKS_ID
    

Membuat pengguna demo di Azure Active Directory

Sekarang setelah kita memiliki dua contoh grup yang dibuat di Azure AD untuk pengembang aplikasi dan SRE, kita akan membuat dua contoh pengguna. Untuk menguji integrasi RBAC Kubernetes di akhir artikel, Anda akan masuk ke kluster AKS dengan akun-akun ini.

Mengatur nama prinsipal pengguna dan kata sandi untuk pengembang aplikasi

Set nama prinsipal pengguna (UPN) dan kata sandi untuk pengembang aplikasi. Nama prinsipal pengguna harus menyertakan nama domain terverifikasi penyewa Anda, misalnya aksdev@contoso.com.

Perintah berikut meminta UPN dan mengaturnya ke AAD_DEV_UPN sehingga dapat digunakan dalam perintah selanjutnya:

echo "Please enter the UPN for application developers: " && read AAD_DEV_UPN

Perintah berikut meminta kata sandi dan mengaturnya ke AAD_DEV_PW untuk digunakan dalam perintah selanjutnya:

echo "Please enter the secure password for application developers: " && read AAD_DEV_PW

Membuat akun pengguna

  1. Buat akun pengguna pertama di Azure AD menggunakan az ad user create perintah . Contoh berikut membuat pengguna dengan nama tampilan AKS Dev dan UPN serta kata sandi aman menggunakan nilai dalam AAD_DEV_UPN dan AAD_DEV_PW:
AKSDEV_ID=$(az ad user create \
  --display-name "AKS Dev" \
  --user-principal-name $AAD_DEV_UPN \
  --password $AAD_DEV_PW \
  --query objectId -o tsv)
  1. Tambahkan pengguna ke grup appdev yang dibuat di bagian sebelumnya menggunakan az ad group member add perintah .
az ad group member add --group appdev --member-id $AKSDEV_ID
  1. Atur nama prinsipal pengguna dan kata sandi untuk SREs. Nama prinsipal pengguna harus menyertakan nama domain terverifikasi penyewa Anda, misalnya akssre@contoso.com. Perintah berikut meminta UPN dan mengaturnya ke AAD_SRE_UPN untuk digunakan dalam perintah selanjutnya:
echo "Please enter the UPN for SREs: " && read AAD_SRE_UPN
  1. Perintah berikut meminta kata sandi dan mengaturnya ke AAD_SRE_PW untuk digunakan dalam perintah selanjutnya:
echo "Please enter the secure password for SREs: " && read AAD_SRE_PW
  1. Membuat akun pengguna kedua. Contoh berikut membuat pengguna dengan nama tampilan AKS SRE dan nama prinsipal pengguna serta kata sandi aman menggunakan nilai dalam AAD_SRE_UPN dan AAD_SRE_PW:
# Create a user for the SRE role
AKSSRE_ID=$(az ad user create \
  --display-name "AKS SRE" \
  --user-principal-name $AAD_SRE_UPN \
  --password $AAD_SRE_PW \
  --query objectId -o tsv)

# Add the user to the opssre Azure AD group
az ad group member add --group opssre --member-id $AKSSRE_ID

Membuat sumber daya kluster AKS untuk dev aplikasi

Kami telah membuat grup, pengguna, dan penetapan peran Azure yang Azure AD. Sekarang, kita akan mengonfigurasi kluster AKS untuk memungkinkan grup yang berbeda ini mengakses sumber daya tertentu.

  1. Dapatkan kredensial admin kluster menggunakan az aks get-credentials perintah . Dalam salah satu langkah berikut, Anda mendapatkan info masuk kluster pengguna reguler untuk melihat alur autentikasi Microsoft Azure Active Directory dalam tindakan.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin
  1. Buat namespace layanan di kluster AKS menggunakan kubectl create namespace perintah . Contoh berikut membuat nama namespace dev:
kubectl create namespace dev

Catatan

Dalam Kube, Peran mendefinisikan izin yang akan diberikan, dan RoleBindings menerapkannya ke pengguna atau grup yang diinginkan. Tugas ini dapat diterapkan ke namespace tertentu, atau di seluruh kluster. Untuk informasi lebih lanjut, lihat Menggunakan otorisasi RBAC Kube.

Jika pengguna yang Anda berikan pengikatan RBAC Kubernetes berada di penyewa Azure AD yang sama, tetapkan izin berdasarkan userPrincipalName (UPN). Jika pengguna berada di penyewa Azure Active Directory yang berbeda, buat kueri dan gunakan properti objectId sebagai gantinya.

  1. Buat Peran untuk namespace dev , yang memberikan izin penuh ke namespace layanan. Di lingkungan produksi, Anda dapat menentukan lebih banyak izin terperinci untuk pengguna atau grup yang berbeda. Buat file bernama role-dev-namespace.yaml dan tempelkan manifes YAML berikut:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-user-full-access
  namespace: dev
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]
  1. Buat Peran menggunakan kubectl apply perintah dan tentukan nama file manifes YAML Anda.
kubectl apply -f role-dev-namespace.yaml
  1. Dapatkan ID sumber daya untuk grup appdev menggunakan az ad group show perintah . Grup ini ditetapkan sebagai subjek RoleBinding di langkah berikutnya.
az ad group show --group appdev --query id -o tsv
  1. Buat RoleBinding untuk grup appdev untuk menggunakan Peran yang dibuat sebelumnya untuk akses namespace. Buat file bernama rolebinding-dev-namespace.yaml, dan tempelkan manifes YAML berikut. Pada baris terakhir, ganti groupObjectId dengan output ID objek grup dari perintah sebelumnya.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-user-access
  namespace: dev
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: dev-user-full-access
subjects:
- kind: Group
  namespace: dev
  name: groupObjectId

Tip

Jika Anda ingin membuat RoleBinding untuk satu pengguna, tentukan jenis: Pengguna serta ganti groupObjectId dengan nama prinsipal pengguna (UPN) dalam sampel di atas.

  1. Buat RoleBinding menggunakan kubectl apply perintah dan tentukan nama file manifes YAML Anda:
kubectl apply -f rolebinding-dev-namespace.yaml

Membuat sumber daya kluster AKS untuk SREs

Sekarang, kita akan mengulangi langkah-langkah sebelumnya untuk membuat namespace, Peran, dan RoleBinding untuk SREs.

  1. Buat namespace layanan untuk sre menggunakan kubectl create namespace perintah .
kubectl create namespace sre
  1. Buat file bernama role-sre-namespace.yaml, dan tempelkan manifes YAML berikut:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-user-full-access
  namespace: sre
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]
  1. Buat Peran menggunakan kubectl apply perintah dan tentukan nama file manifes YAML Anda.
kubectl apply -f role-sre-namespace.yaml
  1. Dapatkan ID sumber daya untuk grup opssre menggunakan perintah az ad group show .
az ad group show --group opssre --query id -o tsv
  1. Buat RoleBinding untuk grup opssre untuk menggunakan Peran yang dibuat sebelumnya untuk akses namespace. Buat file bernama rolebinding-sre-namespace.yaml, dan tempelkan manifes YAML berikut. Pada baris terakhir, ganti groupObjectId dengan output ID objek grup dari perintah sebelumnya.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-user-access
  namespace: sre
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: sre-user-full-access
subjects:
- kind: Group
  namespace: sre
  name: groupObjectId
  1. Buat RoleBinding menggunakan kubectl apply perintah dan tentukan nama file manifes YAML Anda.
kubectl apply -f rolebinding-sre-namespace.yaml

Berinteraksi dengan sumber daya kluster menggunakan identitas Azure Active Directory

Sekarang, kami akan menguji bahwa izin yang diharapkan berfungsi saat Anda membuat dan mengelola sumber daya dalam kluster AKS. Dalam contoh ini, kita akan menjadwalkan dan melihat pod di namespace yang ditetapkan pengguna, dan mencoba menjadwalkan dan melihat pod di luar namespace yang ditetapkan.

  1. Reset konteks kubeconfig menggunakan az aks get-credentials perintah . Di bagian sebelumnya, Anda set konteks menggunakan info masuk admin kluster. Pengguna admin melewati perintah masuk Azure AD. Tanpa parameter --admin, konteks pengguna diterapkan yang mengharuskan semua permintaan diautentikasi menggunakan Azure Active Directory.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
  1. Jadwalkan pod NGINX dasar menggunakan kubectl run perintah di namespace dev .
kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
  1. Masukkan kredensial untuk akun Anda sendiri appdev@contoso.com yang dibuat di awal artikel sebagai perintah masuk. Setelah Anda berhasil masuk, token akun di-cache untuk perintah mendatang kubectl . NGINX berhasil dijadwalkan, seperti yang ditunjukkan dalam contoh output berikut:
$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

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

pod/nginx-dev created
  1. kubectl get pods Gunakan perintah untuk melihat pod di namespace dev.
kubectl get pods --namespace dev
  1. Pastikan status pod NGINX Berjalan. Output akan terlihat mirip dengan output berikut:
$ kubectl get pods --namespace dev

NAME        READY   STATUS    RESTARTS   AGE
nginx-dev   1/1     Running   0          4m

Membuat dan melihat sumber daya kluster di luar namespace yang ditetapkan

Cobalah untuk melihat pod di luar namespace dev . kubectl get pods Gunakan perintah lagi, kali ini untuk melihat --all-namespaces.

kubectl get pods --all-namespaces

Keanggotaan grup pengguna tidak memiliki Peran Kubernetes yang memungkinkan tindakan ini, seperti yang ditunjukkan pada contoh output berikut:

Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot list resource "pods" in API group "" at the cluster scope

Dengan cara yang sama, coba jadwalkan pod di namespace layanan yang berbeda, seperti namespace layanan sre . Keanggotaan grup pengguna tidak selaras dengan Peran Kube dan RoleBinding untuk memberikan izin ini, seperti yang ditunjukkan pada contoh output berikut:

$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre

Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot create resource "pods" in API group "" in the namespace "sre"

Menguji akses SRE ke sumber daya kluster AKS

Untuk mengonfirmasi bahwa keanggotaan grup Azure Active Directory kami dan RBAC Kube berfungsi dengan benar antara pengguna dan grup yang berbeda, coba perintah sebelumnya saat masuk sebagai pengguna opssre.

  1. Atur ulang konteks kubeconfig menggunakan az aks get-credentials perintah yang menghapus token autentikasi yang di-cache sebelumnya untuk pengguna aksdev .
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
  1. Cobalah untuk menjadwalkan dan melihat od di namespace sre yang ditetapkan. Saat diminta, masuk dengan kredensial Anda sendiri opssre@contoso.com yang dibuat di awal artikel.
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
kubectl get pods --namespace sre

Seperti yang ditunjukkan pada contoh output berikut, Anda dapat berhasil membuat dan melihat pod:

$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre

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

pod/nginx-sre created

$ kubectl get pods --namespace sre

NAME        READY   STATUS    RESTARTS   AGE
nginx-sre   1/1     Running   0
  1. Cobalah untuk melihat atau menjadwalkan pod di luar namespace layanan SRE yang ditetapkan.
kubectl get pods --all-namespaces
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

Perintah kubectl ini gagal, seperti yang ditunjukkan dalam contoh output berikut. Keanggotaan grup pengguna dan Peran Kubernetes dan RoleBindings tidak memberikan izin untuk membuat atau mengelola sumber daya di namespace layanan lain.

$ kubectl get pods --all-namespaces
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot list pods at the cluster scope

$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot create pods in the namespace "dev"

Menghapus sumber daya

Dalam artikel ini, Anda membuat sumber daya di kluster AKS dan pengguna serta grup di Azure Active Directory. Untuk membersihkan semua sumber daya, jalankan perintah berikut:

# Get the admin kubeconfig context to delete the necessary cluster resources.

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

# Delete the dev and sre namespaces. This also deletes the pods, Roles, and RoleBindings.

kubectl delete namespace dev
kubectl delete namespace sre

# Delete the Azure AD user accounts for aksdev and akssre.

az ad user delete --upn-or-object-id $AKSDEV_ID
az ad user delete --upn-or-object-id $AKSSRE_ID

# Delete the Azure AD groups for appdev and opssre. This also deletes the Azure role assignments.

az ad group delete --group appdev
az ad group delete --group opssre

Langkah berikutnya