Role Based Access Control

Werte in spitzen Klammern <..> sind zu ersetzen.

User

Es wird ein User erstellt, der bestimmte Berechtigungen für einen einzelnen Namespace bekommt, um Pods aufzulisten, zu starten, auszuführen und zu beenden. Um Berechtigungen für den gesamten Cluster zu erstellen, müssen alternativ Cluster Roles und Cluster Role Bindings verwendet werden.
 

Private Key erstellen

openssl genrsa -out <johndoe>.key 2048
 

CSR erstellen

Es wir der Common Name ("CN") gesetzt, mit dem der User im Cluster identifiziert werden soll. Weiters wird eine Gruppe "Developers" gesetzt. Diese kann z.B. später verwendet werden, um Role Bindings zu ganzen Gruppen zuzuweisen.

openssl req -new -key <johndoe>.key -out <johndoe>.csr -subj "/CN=<John Doe>/O=<Developers>"
 

CSR signen


Manuell

''ca.crt'' und ''ca.key'' von einem Control Plane Cluster Node auslesen (befindet sich in: ''/etc/kubernetes/pki/'')

CSR signen, cert erstellen und Laufzeit angeben

openssl x509 -req -in <johndoe>.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out <johndoe>.crt -days 1
 

Via API

Base64 CSR data: cat <johndoe>.csr | base64 | tr -d "\n"
 

Certificate Signing Request erstellen

kubectl apply -f csr.yml csr.yml
 

Signing request approven

kubectl get csr kubectl certificate approve <johndoe>
 

Cert ausgeben

kubectl get csr <johndoe> -o jsonpath='{.status.certificate}'| base64 -d
 

Role erstellen

Eine Role namens “manage-pods” wird erstellt und diese in den gewünschten Namespace deployed.
kubectl -n <mynamespace> apply -f role.yml  role.yaml

Alternativ:
kubectl --namespace=<mynamespace> create role <manage-pods> --verb=get,watch,list,create,delete --resource=pods,pods/exec

Mehr Infos:
https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb & kubectl api-resources --sort-by name -o wide
 

Role binding erstellen

Das Role Binding definiert, welche Role (“manage-pods”) mit welchem User Zertifikat (Common Name “John Doe” muss übereinstimmen) verknüpft wird. Roles können natürlich auch mit Gruppen verknüpft werden und müssen nicht direkt an einen User gebunden sein.
kubectl -n <mynamespace> apply -f role-binding.yml role-binding.yaml

Alternativ:
kubectl --namespace=<mynamespace> create rolebinding <manage-pods> --role=<manage-pods> --user="<John Doe>"
 

Default Roles

Es gibt spezielle, vordefinierte Roles die entweder Cluster-weit (mittels Cluster Role Binding) oder in einem Namespace angewandt werden können: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles
 


Service Account

Für Applikationen, die selbst auf die Kubernetes API zugreifen müssen.
 

Service account erstellen

kubectl -n <mynamespace> apply -f serviceaccount.yaml  serviceaccount.yaml

Alternativ:
kubectl --namespace=<mynamespace> create serviceaccount <my-app>
 

Permissions prüfen

kubectl --namespace=<mynamespace> auth can-i --as=system:serviceaccount:<mynamespace>:<my-app> list pods


Kube config erstellen

export KUBECONFIG=~/.kube/<my-new-config>
 

Cluster Eintrag erstellen

kubectl config set-cluster <my-cluster-name> --server=https://<cluster-api-ip>:<cluster-api-port> --certificate-authority=ca.crt --embed-certs=true
 

User Eintrag erstellen

kubectl config set-credentials <johndoe> --client-certificate=<johndoe>.crt --client-key=<johndoe>.key --embed-certs=true
 

Context erstellen

kubectl config set-context <my-context> --cluster=<my-cluster-name> --namespace=<mynamespace> --user=<johndoe>
 

Context aktivieren

kubextl config use-context <my-context>


Commands

CommandErklärungkubectl get rolebinding,
clusterrolebinding -A
Alle Role Bindings und Cluster Role Bindings aus allen Namespaces auflisten. kubectl describe clusterrolebinding <cluster-admin>Listet auf, welche User, Gruppen oder Serviceaccounts (Subjects) mit dem Cluster Role Binding “cluster-admin” verknüpft sind.