DEV Community

Suleyman
Suleyman

Posted on

Kubernetes Üzerinde RBAC ile Kullanıcı Olusturma ve Yetkilendirme

Kubernetes'te RBAC nedir?

Rol Tabanlı Erişim Kontrolü (RBAC) in Kubernetes, kümenizdeki kaynaklara erişimi düzenlemek için kullanılan bir yöntemdir. RBAC, rolleri belirli izinlerle tanımlayarak ve bu rolleri kullanıcılara atayarak, kullanıcıların en az ayrıcalık ilkesine bağlı kalarak yalnızca ihtiyaç duydukları kaynaklara erişmelerini sağlar.

RBAC için 3 önemli bileşeni vardır;

Subject: Kullanıcılar, gruplar veya service accountları temsil eder.

Resource: Üzerinde yetkilendirme yapılacak kubernetes api objelerini temsil eder. (Pods, services, configMap etc)

Verbs: Yapılacak işlemi temsil eder.

Bu işlemler için aşağıdaki 2 kavramı birbirinden ayırmamız gerekmektedir.

Authentication: Kubernetes clusterımız üzerinde kimlik doğrulama yapabilmeyi sağlar.
Authorization: Kimlik doğrulama işlemi yapıldıktan sonra cluster üzerinde hangi işlemleri yapabileceğini belirler.

Kubernetes üzerinde bir kullanıcı oluşturursak varsayılan olarak hiçbir işlem yapamaz. Kullanıcı oluşturduktan sonra RBAC ile yetkilendirme işlemlerini gerçekleştirmemiz gerekir.

Kuberneteste kullanıcı oluşturma işlemini x509 SSL Sertifikası ile yapacağız.

Kullanıcı Oluşturma İşlemleri

mkdir RBAC && cd RBAC

Aşağıdaki komutla bir private key oluşturacağız.

openssl genrsa -out suleymanakturk.key 2048

Aşağıdaki komutla SSL sertifikamızı talep edebilmek için CSR dosyası oluşturacağız. Benim kullanıcım suleymanakturk isminde olacak. Organizasyon olarak Developer isminde bir organizasyon oluşturdum

openssl req -new -key suleymanakturk.key -out suleymanakturk.csr -subj /CN=suleymanakturk/O=Developer

Bu işlemlerden sonra CSR dosyamızı kubernetes API ya göndermemiz gerekiyor. Aşağıdaki komutla CSR dosyamızı base64 formatına çevirip içeriğini alıyoruz.

cat suleymanakturk.csr | base64 | tr -d '\n'

Çıkan sonucu aşağıdaki bulunan request yerine yazıyoruz ve komutu çalıştırıyoruz.

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: suleymanakturk
spec:
  groups:
  - system:authenticated
  request:  "CSR"
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF
Enter fullscreen mode Exit fullscreen mode

Bu işlemlerden sonra aşağıdaki komutla csr dosyamızın oluşup oluşmadığını ve durumunu görüntüleyeceğiz.

Karşımıza çıkan sonuca baktığımızda en sağ tarafta CONDITION ile bu CSR dosyamızın durumunu görüntülüyoruz ve bu CSR dosyamızının kubernetes tarafından onaylanmadığı görülmektedir.

kubectl get csr

Aşağıdaki komutla sertifikamızı onaylıyoruz ve artık durumunun "Pending" değil "Approved,Issued" olduğunu görebiliriz.

kubectl certificate approve suleymanakturk

Bu işlemlerden sonra sertifikamızı dışarıya alacağız

kubectl get csr suleymanakturk -o jsonpath='{.status.certificate}' | base64 --decode > suleymanakturk.crt

Bu işlemlerden sonra kullanıcı oluşturma (Authentication) işlemleri tamamlanmıştır.

Oluşturmuş olduğumuz crt ve key dosyası ile kubernetes clusterımızın ca dosyasını yeni kullanıcımıza vereceğiz. Kubernetes ca dosyası varsayılan olarak aşağıdaki konumda bulunmaktadır.

/etc/kubernetes/pki/ca.cert

Yeni kullanıcımız bu dosyaları aldıktan sonra aşağıdaki komutla kubeconfig dosyası oluşturacaktır. Burada kullanıcının kubeconfig dosyası oluşturacağı sunucu üzerinde kubectl toolu ve kubernetes clusterına 6443 portu üzerinden erişmesi yeterlidir.

kubectl config set-credentials suleymanakturk \
  --client-certificate=suleymanakturk.crt \
  --client-key=suleymanakturk.key \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config set-cluster my-cluster \
  --server=https://172.35.28.10:6443 \
  --certificate-authority=/root/ca.crt \
  --embed-certs=true \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config set-context suleymanakturk@my-cluster \
  --cluster=my-cluster \
  --user=suleymanakturk \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config use-context suleymanakturk@my-cluster \
  --kubeconfig=suleymanakturk.kubeconfig
Enter fullscreen mode Exit fullscreen mode

Kullanıcı aşağıdaki komutla , Kubernetes API ya istek attığında 403 hatası alacaktır çünkü herhangi bir authorization işlemi yapmadık.

kubectl --kubeconfig=suleymanakturk.kubeconfig get pods

Kubernetes Authorization işlemi aşağıdaki 4 obje ile yapılabilmektedir.

Role,
RoleBinding
ClusterRole
ClusterRoleBinding

Role namespace bazlı erişim izni verirken, ClusterRole ise tüm cluster bazında verir. RoleBindg ve ClusterRoleBinding ise oluşturulan Role ve ClusterRole objelerinin istenilen user, group, serviceaccount vb. objelere atanmasını sağlamaktadır.

Öncelikle bir Role ve RoleBinding oluşturalım. Bu role default namespacesinde verbs ile belirtilen işlemleri yapabilecektir.

ApiGroups: Hangi kubernetes API ile iletişime geçebileceğini belirtir. Boş bırakılırsa v1 API geçerli olur. Örneğin; deployment objeleri apps/v1 API grubunda olduğu için resource kısmında yazılırsa bile çalışmayacaktır.

Resources: Hangi kubernetes objeleri üzerinde işlem yapılacağını belirtir.

Verbs: Objeler üzerinde hangi işlemlerin yapılabileceğini belirtir.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developers-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "create"]
Enter fullscreen mode Exit fullscreen mode

RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-role-binding
  namespace: default
subjects:
- kind: User
  name: suleymanakturk
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developers-role
  apiGroup: rbac.authorization.k8s.io
Enter fullscreen mode Exit fullscreen mode

ClusterRole

apiVersion: v1
kind: ClusterRole
metadata:
  name: my-clusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "create"]
Enter fullscreen mode Exit fullscreen mode

ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-clusterrole-binding
subjects:
- kind: User
  name: suleymanakturk 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: my-clusterrole
  apiGroup: rbac.authorization.k8s.io
Enter fullscreen mode Exit fullscreen mode

ClusterRole ile aşağıdaki komutla istediğimiz namespace tanımlanan yetkilerle işlem yapabiliriz.

kubectl --kubeconfig=suleymanakturk.kubeconfig run testpod --image=nginx -n test-ns

Her komut çalıştırdığımızda --kubeconfig=suleymanakturk.kubeconfig şeklinde parametre eklemek istemiyorsak bu dosyayı varsayılan config yaparsak bu sorunu çözebiliriz.

Aşağıdaki komutla kubeconfig dosyamızı varsayılan config dosyayı yapıyoruz.

cp /root/suleymanakturk.kubeconfig ~/.kube/config

Bir sonraki makalede görüşmek üzere...

Top comments (0)