Kubernetes RBAC: Rol Tabanlı Erişim Kontrolü Detayları

Kubernetes'te kullanıcı ve servislerin kaynaklara erişimini güvenli bir şekilde yönetin.

Giriş: RBAC Nedir ve Neden Önemlidir?

Kubernetes kümelerinde, birden fazla kullanıcının (insan veya otomasyon aracı) ve uygulamanın (Pod'lar, kontrolörler) kaynaklarla etkileşime girmesi yaygın bir durumdur. Bu etkileşimlerin güvenli ve kontrollü bir şekilde gerçekleşmesini sağlamak için güçlü bir yetkilendirme (authorization) mekanizmasına ihtiyaç duyulur. İşte bu noktada **RBAC (Role-Based Access Control - Rol Tabanlı Erişim Kontrolü)** devreye girer.

RBAC, Kubernetes'in yerleşik bir yetkilendirme mekanizmasıdır. Kullanıcıların veya servislerin (ServiceAccount'lar) hangi kaynaklara (Pod'lar, Deployments, Services vb.) hangi eylemleri (oluşturma, okuma, güncelleme, silme) gerçekleştirebileceğini tanımlamanıza olanak tanır. RBAC kullanmak, "en az ayrıcalık" (least privilege) ilkesini uygulamanıza yardımcı olur; yani her kullanıcının veya servisin yalnızca işini yapmak için ihtiyaç duyduğu minimum izinlere sahip olmasını sağlar. Bu, güvenlik ihlali riskini önemli ölçüde azaltır.

RBAC Temel Kavramları

RBAC, dört ana Kubernetes objesi etrafında döner: `Role`, `ClusterRole`, `RoleBinding` ve `ClusterRoleBinding`. Bu objeler, "kimin" "neye" "ne yapabileceğini" tanımlar.

1. Role (Rol)

Bir **Role**, belirli bir `namespace` (ad alanı) içinde izinler kümesini tanımlar. Yalnızca bu ad alanı içindeki kaynaklara uygulanabilecek eylemleri belirtir. Örneğin, bir Role sadece `default` namespace'indeki Pod'ları listeleme izni verebilir. Rollerin kapsamı her zaman ad alanı ile sınırlıdır.

Örnek YAML:


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development # Bu rol sadece 'development' namespace'inde geçerlidir
  name: pod-okuyucu
rules: # İzinlerin listesi
- apiGroups: [""] # "" core API grubunu ifade eder (Pod, Service vb.)
  resources: ["pods", "pods/log"] # "pods" ve "pods/log" kaynaklarına izin ver
  verbs: ["get", "watch", "list"] # "get", "watch", "list" eylemlerine izin ver
                

2. ClusterRole (Küme Rolü)

Bir **ClusterRole**, küme genelinde (namespacesiz) veya küme kapsamındaki kaynaklar (düğümler gibi) üzerinde izinler kümesini tanımlar. Ayrıca tüm ad alanlarındaki belirli kaynak türlerine izin vermek için de kullanılabilir. ClusterRole'lar genellikle küme yöneticileri tarafından, küme düzeyinde yönetim görevleri veya tüm ad alanlarında uygulanması gereken politikalar için oluşturulur.

Örnek YAML:


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-okuyucu # Bu rol küme genelinde geçerlidir
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "watch", "list"]
- apiGroups: ["extensions", "apps"] # Deployment'lar gibi kaynaklar için
  resources: ["deployments"]
  verbs: ["list"] # Tüm ad alanlarındaki deployment'ları listeleme izni
                

Role vs. ClusterRole Kapsamı

📜
Role: pod-okuyucu

Kapsam: Namespace (development)

Namespace: development

📦
Pods
🌟
ClusterRole: node-okuyucu

Kapsam: Küme Geneli

Tüm Cluster

💻
Nodes
📦
Tüm Namespace'lerdeki Pods

Roller ad alanına bağlıdır, Küme Rolleri ise küme genelinde veya tüm ad alanlarında geçerlidir.

3. RoleBinding (Rol Bağlama)

Bir **RoleBinding**, bir `Role`'de tanımlanan izinleri bir veya daha fazla "konuya" (Subject: kullanıcılar, gruplar veya ServiceAccount'lar) belirli bir `namespace` içinde atar. Yani, bir RoleBinding, bir Rolü kimin kullanabileceğini ve hangi ad alanında kullanabileceğini belirtir.

Örnek YAML:


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-pod-okuyucu-binding
  namespace: development # Bu bağlama 'development' namespace'inde geçerlidir
subjects: # İzin verilecek konular
- kind: User # Konu tipi: Kullanıcı
  name: developer-ali # Kullanıcı adı
  apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount # Konu tipi: Servis Hesabı
  name: ci-cd-sa # Servis Hesabı adı
  namespace: ci-cd-namespace # Servis Hesabının ait olduğu namespace
roleRef: # Hangi Role'e bağlanıldığı
  kind: Role
  name: pod-okuyucu # Yukarıda tanımlanan 'pod-okuyucu' Role'e referans
  apiGroup: rbac.authorization.k8s.io
                

4. ClusterRoleBinding (Küme Rolü Bağlama)

Bir **ClusterRoleBinding**, bir `ClusterRole`'de tanımlanan izinleri bir veya daha fazla "konuya" (kullanıcılar, gruplar veya ServiceAccount'lar) **küme genelinde** atar. ClusterRoleBinding'ler `namespace`'e bağlı değildir ve ClusterRole'un küme genelindeki izinlerini tüm konulara uygular.

Örnek YAML:


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tum-node-okuyucular
subjects:
- kind: Group # Konu tipi: Grup
  name: system:masters # Kubernetes'in varsayılan yönetici grubu
  apiGroup: rbac.authorization.k8s.io
- kind: User
  name: admin-veli
  apiGroup: rbac.authorization.k8s.io
roleRef: # Hangi ClusterRole'e bağlanıldığı
  kind: ClusterRole
  name: node-okuyucu # Yukarıda tanımlanan 'node-okuyucu' ClusterRole'e referans
  apiGroup: rbac.authorization.k8s.io
                

5. Konular (Subjects): Kimlere İzin Verilir?

RBAC izinleri, aşağıdaki konulara atanabilir:

  • **User (Kullanıcı):** Genellikle insan kullanıcıları temsil eder. Kubernetes'in yerleşik bir kullanıcı yönetimi sistemi yoktur, bu nedenle kullanıcılar harici kimlik doğrulama sistemleri (örneğin X.509 sertifikaları, OIDC) aracılığıyla kimlik doğrulaması yapılır.
  • **Group (Grup):** Birden fazla kullanıcıyı bir araya getiren mantıksal bir kümedir. Kullanıcılarda olduğu gibi, gruplar da harici sistemler aracılığıyla yönetilir.
  • **ServiceAccount (Servis Hesabı):** Kubernetes içinde çalışan süreçler (örneğin Pod'lar, kontrolörler) için kimlik sağlar. Kubernetes, Pod'lara otomatik olarak bir ServiceAccount atar ve bu hesaplara RBAC izinleri atanabilir. Bir Pod'un Kubernetes API'si ile etkileşime girmesi gerektiğinde kullanılır.

RBAC Çalışma Prensibi: Yetkilendirme Akışı

Bir kullanıcı veya servis (konu), Kubernetes API'sine bir istek gönderdiğinde, bu istek `kube-apiserver` tarafından işlenir. API sunucusu, isteği doğrulamadan (authentication) sonra yetkilendirme (authorization) aşamasına geçer. RBAC, bu yetkilendirme aşamasının bir parçasıdır.

RBAC Yetkilendirme Akışı

👤
Kullanıcı / Servis Hesabı

(Konu - Subject)

İstek Gönderir (kubectl/API)
🌐
kube-apiserver

(Kimlik Doğrulama Sonrası)

Yetkilendirme Sorgusu
🔗
RoleBinding / ClusterRoleBinding

(Kimi, Hangi Role Bağlıyor?)

Hangi Rol?
📜
Role / ClusterRole

(Hangi İzinleri İçeriyor?)

İzin Kontrolü
İzin Verildi (Kaynak Erişimi)
⬇️ Veya ⬇️
Erişim Reddedildi

İstek, API sunucusu tarafından işlenir ve ilgili RoleBinding/ClusterRoleBinding ile Role/ClusterRole üzerinden izin kontrolü yapılır.

Örnek Kullanım Senaryoları ve YAML

Senaryo 1: Bir Geliştiriciye Belirli Bir Namespace'de Pod Yaratma İzni Verme

Bir geliştirici olan "developer-ayse"nin sadece `dev-apps` namespace'inde Pod'ları ve Deployments'ları oluşturmasına, güncellemesine, listelemesine ve silmesine izin vermek istiyoruz.

1. Role Tanımı (`dev-apps-editor-role.yaml`):


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev-apps # Bu rol sadece 'dev-apps' namespace'inde geçerlidir
  name: dev-apps-editor
rules:
- apiGroups: ["", "apps", "extensions"] # Core API, apps, extensions grupları
  resources: ["pods", "deployments", "services", "ingresses"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
                

2. RoleBinding Tanımı (`dev-apps-editor-binding.yaml`):


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-apps-editor-binding
  namespace: dev-apps # Bu bağlama 'dev-apps' namespace'inde geçerlidir
subjects:
- kind: User
  name: developer-ayse # Kullanıcı adı
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: dev-apps-editor # Yukarıdaki Role'e referans
  apiGroup: rbac.authorization.k8s.io
                

Uygulama:


kubectl apply -f dev-apps-editor-role.yaml
kubectl apply -f dev-apps-editor-binding.yaml
                

Artık `developer-ayse` kullanıcısı, sadece `dev-apps` namespace'i içindeki belirli kaynakları yönetebilir. Diğer namespace'lerde herhangi bir işlem yapamayacaktır.

Senaryo 2: Bir CI/CD Servis Hesabına Küme Genelinde Sadece Okuma İzni Verme

Bir CI/CD işlem hattının, küme genelindeki tüm Pod'ları ve Düğümleri okuma (listeleme, alma, izleme) iznine sahip olmasını istiyoruz.

1. ClusterRole Tanımı (`cluster-reader-role.yaml`):


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-reader
rules:
- apiGroups: [""] # Core API grubu
  resources: ["pods", "nodes", "services", "namespaces"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["apps"] # Uygulama API grubu
  resources: ["deployments", "replicasets"]
  verbs: ["get", "list", "watch"]
                

2. ServiceAccount Tanımı (`ci-cd-serviceaccount.yaml`):


apiVersion: v1
kind: ServiceAccount
metadata:
  name: ci-cd-viewer
  namespace: default # ServiceAccount'ın bulunacağı namespace
                

3. ClusterRoleBinding Tanımı (`cluster-reader-binding.yaml`):


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ci-cd-viewer-binding
subjects:
- kind: ServiceAccount
  name: ci-cd-viewer
  namespace: default # ServiceAccount'ın namespace'i
roleRef:
  kind: ClusterRole
  name: cluster-reader # Yukarıdaki ClusterRole'e referans
  apiGroup: rbac.authorization.k8s.io
                

Uygulama:


kubectl apply -f cluster-reader-role.yaml
kubectl apply -f ci-cd-serviceaccount.yaml
kubectl apply -f cluster-reader-binding.yaml
                

Bu sayede `default` namespace'indeki `ci-cd-viewer` ServiceAccount'ı, tüm küme genelindeki Pod'lar, Düğümler ve diğer belirtilen kaynaklar üzerinde okuma izinlerine sahip olacaktır. Bu ServiceAccount, CI/CD işlem hattında kullanılabilir.

Sıkça Karşılaşılan RBAC Problemleri ve İpuçları

  • **"Forbidden" Hataları:** Bir işlem yapmaya çalıştığınızda "Forbidden" hatası alıyorsanız, bu genellikle RBAC izninizin olmadığını gösterir. İlgili kullanıcının/ServiceAccount'ın hangi Rollere veya ClusterRollere bağlı olduğunu ve bu rollerin ihtiyaç duyulan izinleri içerip içermediğini kontrol edin.
  • **`kubectl auth can-i`:** Bu komut, belirli bir kullanıcının/ServiceAccount'ın belirli bir kaynak üzerinde belirli bir eylemi yapıp yapamayacağını kontrol etmek için paha biçilmezdir. Örnek: `kubectl auth can-i create deployments --as=developer-ayse --namespace=dev-apps`
  • **`kubectl get roles` / `clusterroles` / `rolebindings` / `clusterrolebindings`:** İzin yapılandırmanızı kontrol etmek için bu komutları kullanın.
  • **`ServiceAccount` Kullanımı:** Pod'lar için her zaman özel `ServiceAccount`'lar oluşturun ve onlara yalnızca ihtiyaç duydukları minimum izinleri verin. Varsayılan `default` ServiceAccount'ı kullanmaktan kaçının.
  • **`ServiceAccount` Token'ları:** Bir Pod içinde çalışan uygulamanızın Kubernetes API'si ile iletişim kurması gerektiğinde, Pod'un bağlandığı `ServiceAccount`'ın otomatik olarak monte edilen token'ını kullanır. Bu token'ın doğru RBAC izinlerine sahip olduğundan emin olun.
  • **Audit Logları:** Kubernetes audit loglarını etkinleştirerek, küme içinde kimin ne zaman hangi işlemi yapmaya çalıştığını ve yetkilendirme kararlarını ayrıntılı olarak izleyebilirsiniz. Bu, güvenlik denetimi ve sorun giderme için kritiktir.

Sonuç

Kubernetes RBAC, kümelerinizin güvenliğini sağlamak için temel bir yetkilendirme mekanizmasıdır. `Role`, `ClusterRole`, `RoleBinding` ve `ClusterRoleBinding` gibi objeleri doğru bir şekilde kullanarak, kullanıcılarınıza ve servislerinize en az ayrıcalık prensibine dayalı, granüler izinler atayabilirsiniz. Bu, yetkisiz erişimi engeller, operasyonel hataları azaltır ve güvenlik denetimini kolaylaştırır. Karmaşık Kubernetes ortamlarında, güçlü bir RBAC stratejisi uygulamak, güvenliğin ve yönetilebilirliğin temelini oluşturur. RBAC kavramlarını ve uygulama yöntemlerini iyi anlamak, her Kubernetes yöneticisi ve geliştiricisi için vazgeçilmez bir beceridir.