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.
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
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 deadmin
, tüm kaynaklara okuma-yazma erişimi verir. Genel olarak, birini superuser veya cluster root yapmak istiyorsanız, Cluster Role olancluster-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çinkubectl get clusterrole cluster-admin -o yaml
vekubectl 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.