Wir können eingeschränkten Zugriff auf unsere Cluster mithilfe von Kubernetes Service Accounts und dem Kubernetes RBAC Feature umsetzen.
Dafür müssen wir folgendes tun:
- Einen Kubernetes Service Account anlegen.
- Eine Rolle mit beschränktem Zugriff definieren.
- Dem Kubernetes Service Account diese Rolle zuordnen.
Die Authentifizierung in Kubernetes Clustern die mit iMKE erzeugt werden, geschieht über sogenannte Bearer Token
. Wenn wir einen neuen Kubernetes Service Account anlegen, wird ein solches Token oder Secret im jeweiligen Namespace hinterlegt. Dieses Secret wird gelöscht, wenn der Kubernetes Service Account gelöscht wird.
Anlegen eines Kubernetes Service Accounts
Um einen Kubernetes Service Account anzulegen, benutzen wir das folgende Kommando, wobei wir my-serviceaccount
mit dem Namen ersetzen, den wir dem Kubernetes Service Account geben wollen:
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
namespace: my-namespace
EOF
Dadurch wird im Cluster automatisch ein neues Access Token angelegt. Dieses Token trägt einen Namen wir my-serviceaccount-token-####
wobei die ‘#’ zufällige alphanumerische Zeichen sind.
Um die Token in einem Namespace zu sehen, verwenden wir folgendes Kommando:
kubectl get secrets --namespace=my-namespace
Wir können uns dann das eigentliche Token mit dem folgenden Kommando ausgeben lassen (nicht vergessen, ‘$SECRETNAME’ durch den Namen zu ersetzen, der für unseren Kubernetes Service Account gilt):
kubectl get secret $SECRETNAME -o jsonpath='{.data.token}' --namespace=my-namespace
Das angezeigte Token können wir zusammen mit dem Namen des Serviceaccounts an Dritte übermitteln, um ihnen den Zugriff zu dem Cluster zu ermöglichen.
Jetzt haben wir einen Kubernetes Service Account, der sich an unserem Cluster authentifizieren kann, aber er hat noch keine Rechte. Im nächsten Schritt definieren wir eine Rolle und weisen diese Rolle dem Kubernetes Service Account zu, damit er die entsprechenden Rechte erhält.
Definition einer Rolle mit ihren Rechten
Grundsätzlich gibt es zwei Wege, einem Kubernetes Service Account Rechte zuzuweisen: Cluster-weite Rollen oder Rollen, die auf einen jeweiligen Namespace beschränkt sind. Da die Cluster-weiten Rollen Zugriff auf alle Namespaces geben, empfehlen wir, diese nur zu verwenden, wenn es absolut notwendig ist. Unsere Beispiele definieren Rollen, die auf einen jeweiligen Namespace beschränkt sind.
Alle Rechte einer Rolle werden explizit freigegeben – das gilt sowohl für persönliche Zugänge als auch für Kubernetes Service Accounts. Wenn ein Account über mehrere Rollen verfügt, bekommt er die kombinierten Rechte aller Rollen.
Um eine Rolle zu definieren, mit der ein Account die Informationen über Pods im Namespace my-namespace
auslesen kann, verwenden wir den folgenden Befehl:
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: my-namespace
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
EOF
Jetzt wollen wir dem zuvor angelegten Kubernetes Service Account diese Rolle zuweisen. Für dieses role binding verwenden wir das folgende Kommando:
kubectl create rolebinding read-pods \
--role=pod-reader \
--serviceaccount=my-namespace:my-serviceaccount \
--namespace=my-namespace
Um alle Ressourcen aufzulisten, rufen wir folgendes Kommando auf:
kubectl api-resources
Für die meisten Ressourcen sind folgende Verben definiert:
- get
- list
- watch
- create
- edit
- update
- delete
- exec
Weiterführende Informationen
Die offizielle Kubernetes-Dokumentation zu Zugriffskontrollen und using roles and role bindings in RBAC behandelt das Thema ausführlich.
Zusammenfassung
In dieser Anleitung haben wir gelernt, wie wir über die Kommandozeile:
- Kubernetes Service Accounts anlegen
- Das automatisch generierte Bearer Token für einen Kubernetes Service Accounts auslesen können
- Eine Rolle mithilfe des Kubernetes RBAC Features definieren
- Mithilfe eines role bindings solche Rollen einem Kubernetes Service Account zuordnen