DEV Community

Tarık Anafarta
Tarık Anafarta

Posted on

Kubernetes - Keycloak OIDC Entegrasyonu

Amaç: kube-apiserver'ı Keycloak'u OIDC Identity Provider olarak kullanacak şekilde yapılandırmak ve kubelogin tabanlı kubeconfig ile kubectl erişimini sağlamak.


Ortam / Topoloji

Bileşen Değer
Kubernetes VM (control-plane) <ip_adresi> (RKE2, single-node, static pod)
Keycloak Helm ile keycloak namespace'inde
Rancher Helm ile cattle-system namespace'inde
Ingress Controller kube-system içindeki rke2-ingress-nginx (hostPort 80/443)
Keycloak host keycloak.example.com
Rancher host rancher.example.com
Kubernetes API <ip_adresi>:6443

keycloak.example.com ve rancher.example.com gerçek DNS'te yoksa istemci makinede /etc/hosts'a <ip_adresi> keycloak.example.com ve <ip_adresi> rancher.example.com olarak eklenmelidir.


1. Keycloak TLS Sertifikası

Adım 1: CA oluştur

kc-ca.key ve kc-ca.crt üretildi. basicConstraints: CA:TRUE ve keyUsage: keyCertSign ile CA olarak işaretlendi.

Adım 2: SAN config

san.cnf oluşturuldu, subjectAltName olarak DNS.1 = keycloak.example.com eklendi.

Adım 3: Server sertifikası

keycloak.key ve keycloak.csr üretildi. CSR, kc-ca.crt ile imzalanarak keycloak.crt elde edildi.

Adım 4: Keycloak proxy/hostname ayarları

RKE2 ingress hostPort 443 üzerinden yayın yaptığı için issuer'ın port içermemesi gerekiyor. Bu yüzden KC_HOSTNAME şu şekilde set edildi:

  • KC_PROXY_HEADERS=xforwarded
  • KC_HOSTNAME=https://keycloak.example.com

/.well-known/openid-configuration ile issuer URL doğrulandı.


2. Keycloak Realm / Client / User / Group

Tüm işlemler Keycloak pod'u içinde kcadm.sh ile yapılır. Container FS read-only olabildiği için HOME=/tmp set edilmeli.

Realm: kubernetes adıyla oluşturuldu.

Client: kubernetes client ID'siyle oluşturuldu. Browser'sız kubeconfig için directAccessGrantsEnabled açık olmalı (password grant).

Groups claim: Token içinde groups claim'i gelmesi için oidc-group-membership-mapper eklendi (claim name: groups).

Group, User, Membership: k8s-admins grubu oluşturuldu. Kullanıcı oluşturuldu, şifresi set edildi (Temporary: Off) ve gruba eklendi.


3. kube-apiserver OIDC Yapılandırması

Yeni Kubernetes sürümlerinde --oidc-ca-file yerine AuthenticationConfiguration daha stabil bir yol. Biz de AuthenticationConfiguration kullandık.

Adım 1: Auth config dosyası

/etc/kubernetes/oidc-auth-config.yaml oluşturuldu. apiVersion: apiserver.config.k8s.io/v1beta1, kind: AuthenticationConfiguration formatında; issuer URL, audiences, CA sertifikası ve claim mapping'leri (preferred_username, groups) içeriyor.

Önemli nokta: issuer URL port içermemeli ve Keycloak'ın .well-known içindeki issuer ile birebir aynı olmalı.

Adım 2: RKE2'de apiserver'a bağlama

RKE2 kube-apiserver manifest'ini direkt editlemek yerine /etc/rancher/rke2/config.yaml kullanılır. Biz şu argümanı ekledik:

  • authentication-config=/etc/kubernetes/oidc-auth-config.yaml

RKE2 bunu static pod manifest'ine yansıtır.

Adım 3: Doğrulama

kube-apiserver args içinde --authentication-config=/etc/kubernetes/oidc-auth-config.yaml göründüğünde ve loglarda OIDC/TLS hatası kalmadığında entegrasyon başarılı.


4. İstemci Tarafı: kubelogin + kubeconfig

kubelogin kurulumu: GitHub releases'ten Linux amd64 zip indirildi, /usr/local/bin/kubelogin olarak kuruldu.

CA kopyalama: kc-ca.crt (Keycloak CA) istemci makinede ~/.kube/keycloak-ca.crt olarak tutulur.

kubeconfig: Her kullanıcı için ~/.kube/<kullaniciadi>-kubeconfig oluşturulur. exec plugin olarak kubelogin get-token tanımlanır.

Kubernetes cluster CA'sı için istemciye server-ca.crt kopyalanabilir ve kubeconfig'te certificate-authority: ile kullanılabilir (base64 gömmek şart değil).


5. Kullanıcı Bazlı kubeconfig Dağıtımı

Her kullanıcı için Keycloak'ta hesap açılır, o kullanıcının bilgilerini içeren bir kubeconfig üretilir ve dosya kullanıcıya verilir. Kullanıcı sadece bu dosyayla kubectl kullanır, tarayıcı açılmaz, başka bir şey bilmesine de gerek yoktur.

Kullanıcı oluşturma:

Keycloak UI'dan kubernetes realm'ı altında Users -> Add user ile oluşturulur. Credentials sekmesinden şifre set edilir (Temporary: Off). Required Actions boş olmalıdır.

kubeconfig üretme:

~/.kube/<kullaniciadi>-kubeconfig dosyası oluşturulur. exec plugin olarak kubelogin get-token tanımlandı; --grant-type=password, --username, --password, --oidc-client-secret ve --certificate-authority argümanları verilir. interactiveMode: Never ile tarayıcı açılması engellenir.

RBAC:

Her kullanıcı Kubernetes loglarında kendi adıyla görünür. Gruba göre ClusterRoleBinding veya namespace bazlı RoleBinding ile yetkilendirilir.

Test:

KUBECONFIG=~/.kube/<kullaniciadi>-kubeconfig kubectl auth whoami ile kullanıcının doğru kimlikle bağlandığı doğrulanır.

Top comments (0)