- Dieser Inhalt soll auf die Bedeutung von Kubernetes-Sicherheit aufmerksam machen
- Speicherorte von Secrets
- Wenn ein Benutzer eine Ressource mit dem Befehl
kubectl deklariert, erstellt Kubernetes eine Manifestdatei, die diese Ressource definiert, und speichert sie in etcd
- Wenn ein Benutzer eine Secret-Ressource deklariert, wird auch dieses Secret in
etcd gespeichert
- Wenn ein Benutzer ein Pod erstellt, das ein Secret als Volume oder Umgebungsvariable liest, wird das Secret in diesem Pod gespeichert
- Wenn man das
etcd hackt, in dem Secrets gespeichert werden, und das Pod, das das Secret verwendet, kann man das in dem Secret gespeicherte Passwort herausfinden
- Vorbereitung
- Cluster mit
kubeadm erstellen
- Für die Übung vorab drei Ressourcen anlegen: Secret
credit-card, Pod app1, Pod app2
etcd hacken
etcd: Ein Key-Value-Datenspeicher, der den Zustand des Kubernetes-Clusters speichert. Alle in Kubernetes deklarierten Informationen werden hier gespeichert. Auch Secrets lassen sich durch Abfragen von etcd einsehen
- 1.1 Passwort mit
etcdctl finden
- Das Manifest von
kube-apiserver einsehen und die certificate authority, den öffentlichen Schlüssel und den privaten Schlüssel des etcd-Servers holen
- Das Passwort mit dem Befehl
etcdctl finden, der die Arbeit mit etcd erleichtert
- 1.2 Direkt auf die
etcd-DB zugreifen und Werte holen
- Den laufenden Prozess von
etcd finden, alle Daten dieses Prozesses durchsuchen und das Passwort finden
ps aux | grep etcd - die etcd-PID ermitteln
ll /proc/<pid>/fd - dort ist eine verlinkte Datei mit der Bezeichnung db zu sehen
- Mit dem Befehl
cat /proc/<pid>fd/<db> | grep -A10 -B10 credit-card das vorab angelegte Passwort finden
- Pod hacken
- Über
kubectl exec holen
- Wenn man über passende Berechtigungen zum Abfragen von Kubernetes verfügt, kann man das Passwort mit dem Befehl
kubectl holen
- Durch direkten Zugriff auf den Container holen
- Wenn man auf dem Worker-Node Docker-Befehle frei verwenden kann, lässt sich das Passwort exfiltrieren
- Auf dem Worker-Node, auf dem Pod
app1 eingeplant ist, den Container finden und die Liste der im Container registrierten Umgebungsvariablen extrahieren
crictl pods - die Pod-ID von app1 finden
crictl ps - den zur Pod-ID gehörenden Container finden
crictl inspect <container id> | grep -A16 env - den Container im Detail prüfen und die Umgebungsvariablen extrahieren
- Mit einem ServiceAccount holen, der Zugriff auf das Secret hat
- Wenn der ServiceAccount des Pods Zugriff auf das Secret hat, kann man das Passwort durch einen API-Aufruf innerhalb des Pods finden
- So lassen sich die oben beschriebenen Angriffe verhindern
- Nach dem Prinzip der geringsten Privilegien keine ServiceAccounts mit unnötigen Berechtigungen erstellen
- Gegen Bedrohungen wie Social Engineering vorsorgen und Benutzer-Credentials nicht offenlegen
etcd-Verschlüsselung über die Ressource EncryptionConfiguration
Noch keine Kommentare.