yeke.io · dokümanlar

Yetkilendirme ve RBAC

Kimin hangi işlemi yapabileceğini Kubernetes RBAC belirler. YEKE ise kullanıcıyı cluster’daki bir kimlikle eşler. Bu rehber kimlik kurallarını, kişisel bağlamaları ve sınırlı yetki vermeyi anlatır.

Model: iki soru, iki yer

Karıştırıldığında en pahalı hatayı üreten ayrım budur.

YEKE cevaplar: kim?

Bir YEKE kullanıcısı cluster'a hangi Kubernetes kimliğiyle gider. Kimlik ekranında yazılır.

Kubernetes cevaplar: ne yapabilir?

O kimliğin hangi namespace'te hangi kaynağa ne yapabileceği. Role, ClusterRole ve bağlamalarıyla, cluster'da.

  YEKE kullanıcısı            YEKE'nin kimlik eşlemesi        apiserver
  ────────────────            ───────────────────────        ─────────
  deniz (rol: admin)   ──►    Impersonate-User: deniz@…  ──►  RBAC karar verir
                              Impersonate-Group: yeke:cluster-admins

Hiçbir istek agent'ın kendi kimliğiyle gitmez. Agent bir taşıyıcıdır; isteğe bürünme başlığı ekler ve kararı apiserver verir. Bu bir yapılandırma tercihi değil, üründe tip düzeyinde zorlanan bir değişmez: kimliksiz bir istek core'dan çıkamaz.

Kimlik ekranı

Cluster → Kimlik. Yönetici yetkisi ister.

YEKE kimlik eşlemesi ekranı: üstte cluster kuralı ve kullanıcı adı şablonu, altta kişisel bağlamalar listesi
Üstte cluster kuralı — herkese uygulanan şablon. Altta kişisel bağlamalar; ikinci satırdaki kullanıcı bir bağlama taşıyor ve rozet apiserver'ın doğruladığı kimliği yazıyor.

Kural ve kişisel bağlama

İki katman var; ikisi de ayardır, kod değil.

Cluster kuralı — herkes

Bir şablon ve sabit bir grup kümesi. Şablonda tanınan iki değişken var: {user.username} ve {user.email}; fonksiyon ve koşul yoktur.

kullanıcı adı şablonu :  {user.username}@ornek.com
sabit gruplar         :  yeke:cluster-admins

Cluster başına en fazla bir kural olur.

Kişisel bağlama — tek kişi

Kuralı ezer ve kişinin YEKE rolünden bağımsızdır: rol değişse bile bağlama aynen geçerli kalır. Kaydederken YEKE apiserver'a sorar ve cevabı satırda gösterir; o yüzden yanlış yazılmış bir ad kayıt anında görünür, ilk operasyonda değil.

Bağlama yazabilen kişi, bürünülebilen her kimliği dağıtabilir. Ekran bunu açıkça yazıyor. Tek istisna: system:masters hiçbir koşulda kabul edilmez — hem YEKE tarafında hem üretilen agent manifestinde ayrı ayrı reddedilir.

Aynı yetkiyi çok sayıda kişiye tekrar tekrar bağlamak yerine tanımlamak isterseniz Yetki grupları sayfasına bakın: arayüzden ön seçimli bir yetki kümesi kurulur, namespace'lere kapsanır ve tek düğmeyle kümede RBAC üretilir.

Örnek: sınırlı yetki

Hedef — nöbetçi yalnız odeme namespace'inde Deployment ölçekleyebilsin, başka hiçbir şey yapamasın.

1Cluster'da RBAC'i yazın

Bu adımı YEKE yapmaz ve yapmaması bilinçlidir: yetki cluster'ın kendi kaydıdır, YEKE ele geçse bile oradan genişletilemez.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: odeme-nobet
  namespace: odeme
rules:
  # Görebilmek için okuma — ölçeklemek için önce listeyi görmek gerekir.
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch"]
  # Ölçekleme ALT KAYNAK üzerinden; `deployments` üzerinde `update` VERİLMİYOR,
  # yoksa imaj, env ve prob'lar da değiştirilebilir olurdu.
  - apiGroups: ["apps"]
    resources: ["deployments/scale"]
    verbs: ["get", "update", "patch"]
  # Sonucu görebilmek için pod okuma (opsiyonel ama pratikte gerekli).
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: odeme-nobet
  namespace: odeme
subjects:
  # Buradaki ad, YEKE'de yazacağınız bağlamanın ADIYLA birebir aynı olmalı.
  - kind: User
    name: nobet@ornek.com
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: odeme-nobet
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f odeme-nobet.yaml

2YEKE'de kişisel bağlamayı yazın

Cluster → Kimlik → ilgili kullanıcının satırı:

AlanDeğer
Kubernetes kullanıcı adı[email protected] — RoleBinding'deki subjects[].name ile birebir aynı.
GruplarBu örnekte gerekmez; bağlama doğrudan kullanıcı adına yapıldı.

Kaydet ve doğrulaya bastığınızda satırda apiserver'ın döndüğü kimlik belirir. Belirmiyorsa bir şey tutmamıştır: ad yanlış yazılmış ya da bürünme tavanı o adı kapsamıyordur.

3Tavanı kontrol edin

Agent Kısıtlı moddaysa, bürünülebilecek adlar manifestin içindeki listeyle sınırlıdır. Yeni bir ad kullanacaksanız o listeye eklenmesi ve manifestin yeniden uygulanması gerekir. Tam erişim modunda kullanıcı adı ekseninde tavan yoktur; yeni bir grup kullanacaksanız yine manifest yenilenmelidir.

Doğrulama tahminle değil ölçümle: nöbetçi kullanıcıyla girip odeme dışında bir namespace'te bir yazma deneyin. Beklenen sonuç, planın apiserver tarafından reddedilmesi.

YEKE rolleri

YEKE’de admin ve member olmak üzere iki rol bulunur.

RolYEKE içindeCluster'da (agent, tam erişim)
adminKullanıcılar, denetim izi, kimlik ekranı, cluster ekleme/silme, hook'lar.yeke:cluster-admins grubuna düşer; kurulum bu grubu cluster-admine bağlar.
memberYönetim ekranları kapalı. Yazma planı kurabilir — reddi apiserver verir.yeke:cluster-viewers grubuna düşer; salt okuma, ve Secret okuyamaz.

Rol değişimi anında yansır: ikinci bir kayıt yoktur, kimlik her istekte güncel rolden çözülür. Kişisel bağlaması olan kullanıcı bundan etkilenmez.

İkinci onaycı kimdir? — çift onay (Enterprise)

Üçüncü bir rol yok; onaycı kümesi mevcut kimlik kuralından türetilir.

Politika requireSecondApproval istediğinde onaycılar yeniden belirlenir. Onaycı; plan sahibinden farklı, aktif ve o cluster’da kimliği eşlenmiş bir kullanıcı olmalıdır. requiredApproverGroup varsa bu gruba üyelik de gerekir. YEKE rolünün admin olması şart değildir. Uygun onaycı yoksa uyarı plan hazırlanırken gösterilir. Çift onay ayrıntıları →

"Yetkiyi ver" düğmesi

Dar bir kurtarma yolu — bir daraltma aracı değil.

Doğrudan modda, kubeconfig'in kimliği apiserver'da tanınıyor ama hiçbir role bağlı değilse ekranda bir düğme belirir. Bastığınızda YEKE bir plan kurar; plan tek bir nesne yaratır:

ClusterRoleBinding/yeke-kubeconfig-user
  subjects: [ User/<kubeconfig kullanıcısı> ]
  roleRef:  ClusterRole/cluster-admin
  • Yalnız doğrudan modda görünür. Agent modunda hiç çıkmaz.
  • Yalnız yöneticiye görünür; endpoint de aynı kontrolü ayrıca yapar.
  • Onay kartından geçer ve çıtası yükseltilmiştir: kaynağın adını yazmanız istenir. YEKE'nin kendi düğmesi de kendi guardrail'inden muaf değildir.
  • Verdiği yetki cluster-admin. Daraltmak istiyorsanız yol yukarıdaki örnektir, bu düğme değil.

Sınırlar

Yetkilendirme modelinin sınırları.

  • YEKE'nin namespace/kaynak ACL'i yoktur. "Bu kullanıcı yalnız şu namespace'i görsün" ayarı aramayın; o karar Kubernetes'in ve cevabı RBAC'tir.
  • YEKE cluster'a RBAC yazmaz. Tek istisna yukarıdaki düğmedir: tek nesne, sabit ad, yalnız doğrudan modda, yalnız onaydan geçerek.
  • Guardrail politikaları sıkılaştırır, gevşetmez. Bir planı durdurabilirler ama kimseye yetki veremezler; RBAC'in yerine geçmezler.
  • system:masters hiçbir yoldan verilemez. İki ayrı kapı reddeder.
  • Agent'ın kendi yetkisi yazma içermez. Okuma, keşif ve bürünme; secrets yok.

Kendi onay sürecinizi de bağlayın

Kubernetes RBAC "bu kimlik yapabilir mi" sorusunu cevaplar. "Şu an yapılmalı mı" — açık change kaydı var mı, bakım penceresi mi — dışarının sorusudur ve hook'lar tam olarak onun içindir.