Jika ClusterRole bawaan di Container Service for Kubernetes (ACK) tidak memenuhi kebutuhan izin Anda, buat Role atau ClusterRole kustom untuk menerapkan kontrol akses berbasis peran (RBAC) dengan detail halus terhadap resource kluster.
Sebelum membuat role kustom, periksa apakah ClusterRole bawaan (cluster-admin, admin, edit, view) telah memenuhi kebutuhan Anda. Role kustom hanya diperlukan jika role bawaan terlalu luas atau terlalu ketat.
| Built-in ClusterRole | Tingkat akses |
|---|---|
cluster-admin |
Akses penuh ke semua resource di seluruh kluster |
admin |
Akses baca/tulis ke sebagian besar resource dalam sebuah namespace |
edit |
Akses baca/tulis ke sebagian besar objek dalam sebuah namespace, tidak termasuk resource RBAC |
view |
Akses read-only ke sebagian besar objek dalam sebuah namespace |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK
-
kubectl yang telah dikonfigurasi untuk terhubung ke kluster
-
Izin yang cukup untuk membuat resource RBAC di dalam kluster
Konsep utama
Kubernetes RBAC menggunakan dua jenis role dengan cakupan berbeda:
-
Role: memberikan izin dalam namespace tertentu.
-
ClusterRole: memberikan izin di tingkat kluster, mencakup semua namespace. Namespace tidak dapat ditentukan dalam manifes YAML ClusterRole.
Kedua jenis role menggunakan struktur aturan tiga bidang yang sama: apiGroups, resources, dan verbs.
Verba izin
| Kategori | Verba | Deskripsi |
|---|---|---|
| Baca | get |
Mengambil detail resource tertentu |
| Baca | list |
Menampilkan daftar kumpulan resource |
| Baca | watch |
Mengalirkan pembaruan real-time atas perubahan resource |
| Tulis | create |
Membuat instans resource baru |
| Tulis | update |
Mengganti resource yang sudah ada |
| Tulis | patch |
Memodifikasi sebagian resource yang sudah ada |
| Tulis | delete |
Menghapus resource |
Hindari penggunaan wildcard (["*"]) pada resources atau verbs. Wildcard memberikan akses ke semua resource atau verba saat ini dan di masa depan, termasuk yang ditambahkan nanti. Selalu cantumkan resource dan verba secara spesifik untuk mengikuti prinsip hak istimewa minimal.
Resource yang didukung
Gunakan tabel berikut untuk menyusun bidang rules Anda. Setiap baris memetakan jenis resource ke nilai resources-nya, nilai apiGroups-nya, dan verba yang didukung.
| Resource | resources |
apiGroups |
Verba yang didukung |
|---|---|---|---|
| Pod | ["pods"] |
[""] |
get, list, watch, update, create, patch, delete, exec, proxy |
| Service | ["services"] |
[""] |
get, list, watch, update, create, patch, delete |
| ConfigMap | ["configmaps"] |
[""] |
get, list, watch, update, create, patch, delete |
| Secret | ["secrets"] |
[""] |
get, list, watch, update, create, patch, delete |
| PersistentVolume | ["persistentvolumes"] |
[""] |
get, list, watch, update, create, patch, delete |
| PersistentVolumeClaim | ["persistentvolumeclaims"] |
[""] |
get, list, watch, update, create, patch, delete |
| Namespace | ["namespaces"] |
[""] |
get, list, watch, update, create, patch, delete |
| Deployment | ["deployments"] |
["apps"] |
get, list, watch, update, create, patch, delete |
| DaemonSet | ["daemonsets"] |
["apps"] |
get, list, watch, update, create, patch, delete |
| StatefulSet | ["statefulsets"] |
["apps"] |
get, list, watch, update, create, patch, delete |
| Ingress | ["ingresses"] |
["networking.k8s.io"] |
get, list, watch, update, create, patch, delete |
| NetworkPolicy | ["networkpolicies"] |
["networking.k8s.io"] |
get, list, watch, update, create, patch, delete |
| Job | ["jobs"] |
["batch"] |
get, list, watch, update, create, patch, delete |
| CronJob | ["cronjobs"] |
["batch"] |
get, list, watch, update, create, patch, delete |
| StorageClass | ["storageclasses"] |
["storage.k8s.io"] |
get, list, watch, update, create, patch, delete |
| HorizontalPodAutoscaler | ["horizontalpodautoscalers"] |
["autoscaling"] |
get, list, watch, update, create, patch, delete |
Subresources
Beberapa resource mengekspos subresource yang memerlukan izin terpisah. Gunakan garis miring (/) untuk menentukan subresource. Misalnya, untuk mengizinkan pembacaan log pod selain pod itu sendiri:
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
Subresource pod umum: pods/log, pods/exec, pods/portforward, pods/proxy.
Buat dan bind role RBAC kustom
Konsol ACK hanya mendukung binding ClusterRole kustom. Untuk melakukan binding Role kustom yang dibatasi pada namespace tertentu, gunakan kubectl.
-
Konsol ACK: buat ClusterRole dan bind ke Pengguna RAM atau Peran RAM
-
kubectl: buat ClusterRole atau Role, lalu buat binding yang sesuai
Konsol
Langkah 1: Buat ClusterRole
Langkah-langkah berikut membuat ClusterRole bernama my-clusterrole yang memberikan akses read-only ke pod dan Service di seluruh kluster.
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Pada halaman Clusters, klik nama kluster target. Di panel kiri, pilih Security > Role.
-
Pada halaman Role, pilih tab Cluster Role, lalu klik OK.
-
Di panel Create YAML, masukkan manifes ClusterRole dan klik OK. Manifes berikut memberikan akses read-only (
get,list,watch) ke pod dan Service:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"]Setelah dibuat,
my-clusterroleakan muncul di bawah tab ClusterRole.
Langkah 2: Bind ClusterRole ke Pengguna RAM atau Peran RAM
-
Di panel navigasi kiri, klik Authorizations.
-
Pada halaman Authorizations, pilih target otorisasi:
-
Pengguna RAM: klik tab RAM Users, temukan Pengguna RAM target, lalu klik Modify Permissions.
-
Peran RAM: klik tab RAM Roles, masukkan atau pilih nama Peran RAM di bidang RAM Role Name, lalu klik Modify Permissions.
-
-
Di panel Permission Management, klik Add Permissions. Di bagian Add Permissions:
-
Pilih Clusters yang terkait dengan
my-clusterrole. -
Pilih Namespace target.
-
Di bawah Permission Management, pilih Custom, lalu pilih my-clusterrole dari daftar drop-down.
-
Klik Submit.
-
kubectl
Langkah 1: Buat role kustom
ClusterRole — memberikan izin di seluruh kluster.
Manifes berikut membuat ClusterRole bernama my-clusterrole dengan akses read-only ke pod dan Service:
# my-clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "watch"]
Role — memberikan izin dalam namespace tertentu.
Manifes berikut membuat Role bernama my-role dengan akses baca ke pod di namespace default:
# my-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
Terapkan manifes:
kubectl apply -f my-clusterrole.yaml
Langkah 2: Dapatkan ID objek otorisasi
Untuk melakukan binding role ke Pengguna RAM atau Peran RAM, Anda memerlukan ID yang sesuai:
Langkah 3: Buat binding
Manifes berikut melakukan binding my-clusterrole ke Pengguna RAM atau Peran RAM. Ganti 20811XXXXXXXXX2288 dengan UserId atau RoleId dari langkah sebelumnya.
# my-clusterrole-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-clusterrole-binding
subjects:
- kind: User
name: "20811XXXXXXXXX2288" # UserId atau RoleId dari Langkah 2
roleRef:
kind: ClusterRole
name: my-clusterrole
apiGroup: rbac.authorization.k8s.io
Terapkan binding:
kubectl apply -f my-clusterrole-binding.yaml
Verifikasi izin
Setelah binding, verifikasi bahwa Pengguna RAM memiliki akses yang diharapkan. Ambil kubeconfig kluster dan sambungkan menggunakan kubectl, lalu jalankan perintah yang diizinkan oleh role tersebut:
kubectl get pods
Untuk memastikan bahwa akses di luar izin yang diberikan ditolak dengan benar, jalankan perintah yang tidak dicakup oleh role—misalnya, menampilkan daftar Deployment ketika hanya akses pod yang diberikan:
kubectl get deployments
Output yang diharapkan adalah:
Error from server (Forbidden): deployments.apps is forbidden: User "20811XXXXXXXXX2288" cannot list resource "deployments" in API group "apps" at the cluster scope
Error ini mengonfirmasi bahwa batasan izin berfungsi dengan benar.