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
Command | Erklärung | kubectl 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. |