Belajar RBAC Kubernetes Part 1
Hari ini saya nulis tentang rangkuman belajar selama beberapa hari tentang RBAC kubernetes. Jadi ceritanya beberapa hari yang lalu saya coba iseng ngulik lagi tentang kubernetes yang beberapa bulan yang ditinggalkan. Jadi disini saya menggunakan k3s sebagai bahan percobaan (maaf kube versi hemat), jadi bisa install di laptop atau di vm cloud kesayangan.
Untuk memahami rbac ini sendiri diawal memang tidak mudah bagi saya, jadi butuh beberapa referensi lainnya di luar dokumentasi kubernetes itu sendiri, dan berikut rangkuman saya.
Service Account
Pada bagiain ini tentu harus paham tentang service account dan bedanya dengan user account. Dari dokumentasi kubernetes sendiri sudah di jelaskan sangan rinci pada bagian User accounts versus service accounts. Sepemahaman saya ialah user account itu adalah representasi orang (dev atau engineer, dan lainnya), dan service account lebih ke wilayah kekuasaan(klo salah koreksi ya hehe).
Nah saya akan fokus ke service account dulu, jadi saya ada usecase berikut:
- Buat satu service account dengan nama backend.
- Service account backend tersebut hanya memiliki akses untuk melihat pod saja di namespace tertentu, disini sebagai contoh ialah namespacenya staging.
Buat file service-account.yml yang sebagai berikut:
# service-account.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: backend
namespace: staging
dan eksekusi perintah berikut
kubectl apply -f service-account.yml
# output: serviceaccount/backend created
lalu cek apakah service account benar sudah dibuat dengan command kubectl get serviceaccount, kurang lebih outputnya seperti ini:
kubectl get serviceaccount
NAME SECRETS AGE
backend 1 27s
default 1 99d
Role
Setelah membuat service-account, selanjutnya ialah mempersiapkan role. Nah disini mulai konfigurasi rolenya bisa melakukan apa saja. Seperti usecase diatas service account backend hanya bisa melakukan read saja terhadap semua pod yang ada di staging. Untuk setiap detail rulesnya bisa dilihat di Kubernetes API Groups.
Lalu kita buat file role.yml, dan berikut isinya:
# role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: backend-role
namespace: staging
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
setelah itu jalankan command kubectl apply -f role.yml, kurang lebih outputnya seperti berikut:
❯ kubectl apply -f role.yml
role.rbac.authorization.k8s.io/backend-role created
RoleBinding
Pada tahap ini kita akan menghubungkan role dengan service account dengan menggunakan RoleBinding. Jadi ada beberapa yang perlu diperhatikan yaitu:
- Subjects ialah siapa akan menggunakan role.
- roleRef: Role yang akan diberikan ke Subject.
selain yang point diats jangan lupa juga untuk memperhatikan namespace yang digunakan. Lanjutkan dengan membuat file role-binding.yml, dan isi
konfigurasinya seperti dibawah ini:
# role-binding.yml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: backend-rolebinding
namespace: staging
subjects:
- kind: ServiceAccount
name: backend
namespace: staging
roleRef:
kind: Role
name: backend-role
apiGroup: rbac.authorization.k8s.io
Ekseukusi perintah kubectl apply -f role-binding.yml, dan kurang lebih output seperti berikut:
❯ kubectl apply -f role-binding.yml
rolebinding.rbac.authorization.k8s.io/backend-rolebinding created
Uji Coba
Sebelum melakukan uji coba, pastikan konfigurasi sudah dibuat, anda bisa pastikan dengan perintah berikut: kubectl get sa,roles,rolebindings -n staging | grep backend, dan outputnya seperti ini:
serviceaccount/backend 1 6m1s
role.rbac.authorization.k8s.io/backend-role 2021-07-20T10:49:27Z
rolebinding.rbac.authorization.k8s.io/backend-rolebinding Role/backend-role 4m31s
Untuk melakukan uji coba cara cepat yaitu dengan menggunakan perintah berikut:
kubectl auth can-i [verb] [resource] --as=system:serviceaccount:[namespace]:[service-account]
jika output yes berarti dapat akses, jika no maka sebaliknya. Sebagai contoh saya ingin coba beberapa case berikut:
- Cek apakah bisa melakukan Get Pod di namespace staging
❯ kubectl auth can-i get pod --as=system:serviceaccount:staging:backend
yes
- Cek apakah bisa melakukan List Pod di namespace staging
❯ kubectl auth can-i list pod --as=system:serviceaccount:staging:backend
yes
- Cek apakah bisa melakukan Create Pod di namespace staging
❯ kubectl auth can-i create pod --as=system:serviceaccount:staging:backend
no
- Cek apakah bisa melakukan Delete Pod di namespace staging
❯ kubectl auth can-i delete pod --as=system:serviceaccount:staging:backend
no
Nah dari uji coba diatas kita sudah tau jika service account backend hanya bisa melakukan operasi read pada resource pod.
Update Role
Kali ini kita akan coba perbaharui rolenya, agar backend bisa update dan delete, langsung saja edit file role.yml menjadi seperti berikut:
# role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: backend-role
namespace: staging
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch", "create", "delete"]
dan jangan lupa untuk apply perubahannya:
❯ kubectl apply -f role.yml
role.rbac.authorization.k8s.io/backend-role configured
Dan sekarang kita akan coba apakah sudah bisa create dan delete:
# test create
kubectl auth can-i create pod --as=system:serviceaccount:staging:backend
yes
# test delete
kubectl auth can-i delete pod --as=system:serviceaccount:staging:backend
yes
Dan sesuai yang diharapkan sudah bisa create dan delete pod. Dan dengan begitu rangkuman belajar kubernetes part 1 sudah selesai, dan jika ingin menghapus konfigurasi yang barusan dibuat bisa menggunakan perintah berikut:
kubectl delete -f role-binding.yml
kubectl delete -f role.yml
kubectl delete -f service-account.yml
Terimakasih, Yaahowu