- Dieser Inhalt soll auf die Bedeutung von Kubernetes-Sicherheit aufmerksam machen
- Speicherorte von Secrets
- Wenn ein Benutzer eine Ressource mit dem Befehl
kubectldeklariert, erstellt Kubernetes eine Manifestdatei, die diese Ressource definiert, und speichert sie inetcd - Wenn ein Benutzer eine Secret-Ressource deklariert, wird auch dieses Secret in
etcdgespeichert - Wenn ein Benutzer ein Pod erstellt, das ein Secret als Volume oder Umgebungsvariable liest, wird das Secret in diesem Pod gespeichert
- Wenn man das
etcdhackt, in dem Secrets gespeichert werden, und das Pod, das das Secret verwendet, kann man das in dem Secret gespeicherte Passwort herausfinden
- Wenn ein Benutzer eine Ressource mit dem Befehl
- Vorbereitung
- Cluster mit
kubeadmerstellen - Für die Übung vorab drei Ressourcen anlegen: Secret
credit-card, Podapp1, Podapp2
- Cluster mit
etcdhackenetcd: 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 vonetcdeinsehen- 1.1 Passwort mit
etcdctlfinden- Das Manifest von
kube-apiservereinsehen und die certificate authority, den öffentlichen Schlüssel und den privaten Schlüssel desetcd-Servers holen - Das Passwort mit dem Befehl
etcdctlfinden, der die Arbeit mitetcderleichtert
- Das Manifest von
- 1.2 Direkt auf die
etcd-DB zugreifen und Werte holen- Den laufenden Prozess von
etcdfinden, alle Daten dieses Prozesses durchsuchen und das Passwort findenps aux | grep etcd- dieetcd-PID ermittelnll /proc/<pid>/fd- dort ist eine verlinkte Datei mit der Bezeichnungdbzu sehen- Mit dem Befehl
cat /proc/<pid>fd/<db> | grep -A10 -B10 credit-carddas vorab angelegte Passwort finden
- Den laufenden Prozess von
- Pod hacken
- Über
kubectl execholen- Wenn man über passende Berechtigungen zum Abfragen von Kubernetes verfügt, kann man das Passwort mit dem Befehl
kubectlholen
- Wenn man über passende Berechtigungen zum Abfragen von Kubernetes verfügt, kann man das Passwort mit dem Befehl
- 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
app1eingeplant ist, den Container finden und die Liste der im Container registrierten Umgebungsvariablen extrahierencrictl pods- die Pod-ID vonapp1findencrictl ps- den zur Pod-ID gehörenden Container findencrictl 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
- Über
- 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 RessourceEncryptionConfiguration
Noch keine Kommentare.