Service Accounts in Kubernetes sind spezielle Benutzerkonten, die von Prozessen innerhalb von Pods genutzt werden, um mit der Kubernetes-API zu interagieren. Diese Konten sind in der Kubernetes-API integriert und werden dazu verwendet, Prozessen in Containern Identitäten zuzuweisen.
Service Accounts werden in Kubernetes mit einem Manifest im
YAML-Format definiert. Die Erstellung erfolgt über das Kommando
kubectl create serviceaccount [name] oder durch Anwendung
eines ServiceAccount-Manifests.
apiVersion: v1
kind: ServiceAccount
metadata:
name: mein-service-accountDie Verwaltung von Service Accounts erfolgt ebenfalls über
kubectl, wobei die typischen Aktionen Erstellen, Löschen
und Abrufen der Informationen eines Service Accounts beinhalten.
Ein Service Account wird einem Pod durch Eintrag im Pod-Manifest
zugewiesen. Jeder Pod, der keinen Service Account spezifiziert, wird dem
default Service Account im gleichen Namespace
zugeordnet.
apiVersion: v1
kind: Pod
metadata:
name: mein-pod
spec:
serviceAccountName: mein-service-account
containers:
- name: mein-container
image: mein-imageService Accounts sind mit Rollen und ClusterRollen verbunden, die über RoleBindings und ClusterRoleBindings zugewiesen werden. Diese Rollen definieren die Berechtigungen, die ein Service Account innerhalb des Clusters hat.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: service-account-role-binding
subjects:
- kind: ServiceAccount
name: mein-service-account
namespace: default
roleRef:
kind: Role
name: meine-rolle
apiGroup: rbac.authorization.k8s.ioKubernetes mountet automatisch ServiceAccount-Tokens in Pods, die
einen Service Account verwenden. Diese Tokens befinden sich im
Dateisystem des Containers unter
/var/run/secrets/kubernetes.io/serviceaccount und werden
für die Authentifizierung bei der Kubernetes-API verwendet.
Da Service Accounts die Fähigkeit besitzen, mit der Kubernetes-API zu interagieren, ist es entscheidend, dass ihre Berechtigungen dem Prinzip der geringsten Privilegien folgen. Nicht genutzte Service Accounts sollten deaktiviert oder gelöscht werden, um die Angriffsfläche zu minimieren.
Service Accounts sind ein mächtiges Werkzeug in Kubernetes, das eine sichere und effiziente Interaktion von Anwendungen mit der Kubernetes-API ermöglicht. Durch sorgfältige Verwaltung und Konfiguration können Service Accounts dazu beitragen, die Sicherheit in Kubernetes-Clustern zu erhöhen.
Ein Service Account in Kubernetes kann über die Kommandozeile mit
kubectl oder durch Anwendung eines YAML-Manifests erstellt
werden. Hier wird zuerst ein Service Account im Namespace
mein-namespace mit dem Namen
mein-service-account über die Kommandozeile erstellt:
kubectl create serviceaccount mein-service-account --namespace mein-namespaceUm denselben Vorgang mit einem YAML-Manifest durchzuführen, kann folgende Definition genutzt werden:
apiVersion: v1
kind: ServiceAccount
metadata:
name: mein-service-account
namespace: mein-namespaceDieses YAML-Manifest kann dann mit dem folgenden Befehl angewendet werden:
kubectl apply -f service-account.yamlIm nächsten Schritt wird ein Pod im Namespace
mein-namespace definiert, der den Service Account
mein-service-account verwendet.
Erstellen Sie ein YAML-Manifest für den Pod:
apiVersion: v1
kind: Pod
metadata:
name: mein-pod
namespace: mein-namespace
spec:
serviceAccountName: mein-service-account
containers:
- name: mein-container
image: mein-imageWenden Sie das Manifest auf den Cluster an:
kubectl apply -f pod.yamlZur Definition einer Rolle mit bestimmten Berechtigungen erstellen
Sie ein YAML-Manifest meine-rolle.yaml:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: mein-namespace
name: meine-rolle
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]Anwenden der Rolle:
kubectl apply -f meine-rolle.yamlAnschließend wird ein RoleBinding erstellt, um den Service Account
mein-service-account mit der Rolle meine-rolle
zu verknüpfen. Dafür wird ein weiteres YAML-Manifest
role-binding.yaml benötigt:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: service-account-role-binding
namespace: mein-namespace
subjects:
- kind: ServiceAccount
name: mein-service-account
namespace: mein-namespace
roleRef:
kind: Role
name: meine-rolle
apiGroup: rbac.authorization.k8s.ioAnwenden des RoleBindings:
kubectl apply -f role-binding.yamlDiese Schritte etablieren einen Service Account im spezifischen Namespace, weisen ihm einen Pod zu und definieren eine Rolle sowie ein RoleBinding, um die Zugriffsberechtigungen des Service Accounts zu regeln.