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
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
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"]
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
ClusterRole
apiVersion: v1
kind: ClusterRole
metadata:
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create"]
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
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)