48 Service Accounts in Kubernetes

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.

48.1 Erstellung und Verwaltung von Service Accounts

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-account

Die Verwaltung von Service Accounts erfolgt ebenfalls über kubectl, wobei die typischen Aktionen Erstellen, Löschen und Abrufen der Informationen eines Service Accounts beinhalten.

48.2 Zuweisung von Service Accounts zu Pods

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-image

48.3 Berechtigungen und Rollen

Service 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.io

48.4 Automatische Mounts von ServiceAccount-Token

Kubernetes 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.

48.5 Sicherheit von Service Accounts

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.

48.6 Best Practices

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.

48.7 Konkrete Erstellung eines Service Accounts in Kubernetes

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-namespace

Um denselben Vorgang mit einem YAML-Manifest durchzuführen, kann folgende Definition genutzt werden:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: mein-service-account
  namespace: mein-namespace

Dieses YAML-Manifest kann dann mit dem folgenden Befehl angewendet werden:

kubectl apply -f service-account.yaml

48.8 Beispiel: Zuweisung eines Service Accounts zu einem Pod im spezifischen Namespace

Im 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-image

Wenden Sie das Manifest auf den Cluster an:

kubectl apply -f pod.yaml

48.9 Beispiel: Erstellung einer Role und eines RoleBinding für den Service Account

Zur 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.yaml

Anschließ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.io

Anwenden des RoleBindings:

kubectl apply -f role-binding.yaml

Diese 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.