Kubernetes RBAC ve Role, ClusterRole, RoleBinding ve ClusterRoleBinding Nedir?

Kubernetes Role-Based Access Control (RBAC), Kubernetes nesnelerine erişimi kontrol etmek için kullanılan bir izin sistemidir. RBAC, kullanıcılara ve gruplara belirli Kubernetes nesnelerine erişme izni vermek için kullanılır.

RBAC, Kubernetes'te izinleri yönetmenin en güçlü yoludur. RBAC, kullanıcılara ve gruplara Kubernetes nesneleri üzerinde özel izinler vermek için kullanılabilir. RBAC, Kubernetes nesnelerinin yetkisiz kullanıcılar tarafından değiştirilmesini veya silinmesini önlemeye yardımcı olabilir.

RBAC'yi etkinleştirmek için, API Server'ı --authorization-mode parametresini RBAC içererek başlatmanız gerekmektedir. Örnek bir API Server pod manifestini aşağıda görebilirsiniz:

Name:                 kube-apiserver-minikube
Namespace:            kube-system
***
***
Containers:
  kube-apiserver:
    Image:         registry.k8s.io/kube-apiserver:v1.26.1
    Command:
      kube-apiserver
      --advertise-address=192.168.49.2
      --allow-privileged=true
      --authorization-mode=Node,RBAC
      ***
      ***

RBAC, Role, ClusterRole, RoleBinding ve ClusterRoleBinding olmak üzere dört adet Kubernetes nesnesine sahiptir. Tıpkı diğer Kubernetes nesneleri gibi, kubectl gibi aracını kullanarak RBAC nesnelerini tanımlayabilir veya değiştirebilirsiniz.

1. Role ve ClusterRole Nedir?

Kubernetes Role ve ClusterRole, Kubernetes nesneleri üzerinde izinler vermek için kullanılan Kubernetes izin sistemindeki iki temel bileşendir.

Role, bir namespace için izinler verir. ClusterRole, tüm namespace'ler genelinde geçerli izinler verir.

Bir Role veya ClusterRole tanımlamak için; rolün adı, rolün sahip olduğu izinler ve rolün hangi kullanıcılara veya gruplara atanacağı belirtilir.

Bir Role tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:

apiVersion: v1
kind: Role
metadata:
  name: my-role
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

veya imperative yöntem ile şu komut sayesinde oluşturabilirsiniz:

kubectl create role pod-reader --verb=get,list,watch --resource=pods

Bir ClusterRole tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:

apiVersion: v1
kind: ClusterRole
metadata:
  name: my-clusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["create", "update", "delete"]

veya imperative yöntem ile şu komut sayesinde oluşturabilirsiniz:

kubectl create clusterrole rs-reader --verb=get,list,watch --resource=rs.apps

ClusterRole kullanarak;

  • Node, PersistentVolume gibi cluster-scoped resource'lara
  • Pod, Service gibi namespaced resource'lara tüm namespace'ler genelinde (örneğin: kubectl get pods --all-namespaces)
  • /healthz gibi non-resource endpointlere,

izinler tanımlayabilirsiniz.

💡
Tek farkın namespace olduğunu farketmişsinizdir. Role tanımında eğer namespace belirtilmezse default namespace ayarlanır.

Role ve ClusterRole Arasındaki Fark

Role ve ClusterRole arasındaki temel fark, etki alanıdır. Role, bir namespace içinde izinler verir, ClusterRole ise tüm namespace'ler üzerinde izinler verir.

Role veya ClusterRole eklerken nesnenin apiGroups değerini nasıl öğrenebilirim?

Role ve ClusterRole eklerken apiGroups parametresinin alacağı değeri kubectl api-resources -o wide komutundaki APIVERSION sütununda yer alan değerlerden öğrenebilirsiniz. Bu sütundaki değerler apigroup/version formatına sahiptir.

kubectl api-resources -o wide
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND                             VERBS                                                        CATEGORIES
configmaps                        cm           v1                                     true         ConfigMap                        create,delete,deletecollection,get,list,patch,update,watch
pods                              po           v1                                     true         Pod                              create,delete,deletecollection,get,list,patch,update,watch   all
daemonsets                        ds           apps/v1                                true         DaemonSet                        create,delete,deletecollection,get,list,patch,update,watch   all
deployments                       deploy       apps/v1                                true         Deployment                       create,delete,deletecollection,get,list,patch,update,watch   all
replicasets                       rs           apps/v1                                true         ReplicaSet                       create,delete,deletecollection,get,list,patch,update,watch   all
statefulsets                      sts          apps/v1                                true         StatefulSet                      create,delete,deletecollection,get,list,patch,update,watch   all
***
***

Örneğin pods için apiGroups "" kullanılırken, deployments için "apps" kullanmalısınız.

Role veya ClusterRole eklerken nesnenin verbs değerini nasıl öğrenebilirim?

Role ve ClusterRole eklerken verbs parametresinin alacabileceği değerleri kubectl api-resources -o wide komutundaki VERBS sütununda yer alan değerlerden öğrenebilirsiniz.

2. RoleBinding ve ClusterRoleBinding Nedir?

Kubernetes RoleBinding ve ClusterRoleBinding, Role ve ClusterRole nesnelerini kullanıcılara ve gruplara atamak için kullanılan iki kavramdır.

RoleBinding, bir Role'u veya ClusterRole'u (evet, ClusterRole'u namespaced bir halde kullanmış olursunuz) bir kullanıcıya, gruba veya service account'a bağlar. Rolebinding nesnesinde, role'un adı, bağlanacağı kullanıcı veya grup veya service account ve role'un hangi namespace'de kullanılacağı belirtilir.

ClusterRoleBinding, bir ClusterRole'u bir kullanıcıya, gruba veya service account'a bağlar. ClusterRoleBinding nesnesinde, ClusterRole'ın adı, rolün bağlanacağı kullanıcı veya grup veya service account ve rolün tüm namespace'ler üzerinde kullanılacağı belirtilir.

RoleBinding ve ClusterRoleBinding arasındaki temel fark, etki alanıdır. RoleBinding, bir namespace içinde izinler verir, ClusterRoleBinding ise tüm namespace'ler üzerinde izinler verir.

Bir RoleBinding tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-role-binding
  namespace: default
subjects:
- kind: User
  name: johndoe
  apiGroup: rbac.authorization.k8s.io
- kind: Group
  name: developer
  apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
  name: default
  namespace: kube-system # sadece belirli bir namespace'deki sa için
- kind: ServiceAccount
  name: sa-viewer
  apiGroup: rbac.authorization.k8s.io # herhangi bir clusterdaki tüm sa lar için
roleRef:
  kind: Role
  name: my-role
  apiGroup: rbac.authorization.k8s.io

Bir ClusterRoleBinding tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-clusterrole-binding
subjects:
- kind: Group
  name: developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: my-clusterrole
  apiGroup: rbac.authorization.k8s.io
💡
Binding nesneleri oluşturduktan sonra, artık Rol veya ClusterRole'u değiştiremezsiniz. Eğer değiştirmek istiyorsanız önce binding nesnesini kaldırmanız ve yeniden oluşturmanız gerekir.

3. RBAC Default ClusterRole ve ClusterRoleBinding'ler

Kubernetes, cluster'ı kurduğunuzda default olarak bazı Role, ClusterRole, RoleBinding ve ClusterRoleBinding nesnelerini otomatik olarak oluşturur. Örneğin bazılarını görelim:

# kubectl get clusterroles | grep -v '^system'
NAME                                                                   AGE
admin                                                                  33h
cluster-admin                                                          33h
edit                                                                   33h
view                                                                   33h

Tüm bu default eklenen nesneleri inceleyebilirsiniz fakat özet geçmek gerekirsek:

  • Hem cluster-admin hem de admin, tüm kaynaklara okuma-yazma erişimi verir. Genel olarak, birini superuser veya cluster root yapmak istiyorsanız, Cluster Role olan cluster-admin rolünü kullanın. Tabi bunu yaparken iyi düşünmelisiniz.
  • cluster-admin tüm apiGroup, resource ve verblere wildcard (*) ile sahipken, admin ClusterRole'ün de tüm bunlar tek tek eklidir. Yani yeni bir resource veya custom resource geldiğinde admin rolü yeni resource'a yetkiye sahip değilken (manual eklenmeli) cluster-admin sahiptir. İncelemek için kubectl get clusterrole cluster-admin -o yaml ve kubectl get clusterrole admin -o yaml komutlarını kullanabilirsiniz.
  • edit rolü, deployments, services veya configmaps gibi normal core kaynakların birçoğunun oluşturulmasına, güncellenmesine ve silinmesine izin verir, ancak RBAC izinlerinin değiştirilmesine izin verilmez.
  • view rolü, çoğu kaynakta (secretlar dahil olmak üzere) salt okunur erişim içindir.

Ayrıca cluster-admin ClusterRoleBinding nesnesini incelerseniz, system:masters isimli bir gruba atandığını görürsünüz. Bu nedenle cluster'da kullanıcılar oluştururken eğer cluster genelinde admin yetkisi vermek istemiyorsanız, grubunun system:masters ayarlanmadığından emin olmalısınız.

# kubectl get clusterrolebindings/cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:masters

Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes Service Account Nedir?
Service Account’lar, pod’ların Kubernetes API’sine erişmesine ve diğer pod’larla iletişim kurmasına izin vermek için kullanılır.