7 Punkte von ironlung 2023-10-05 | Noch keine Kommentare. | Auf WhatsApp teilen
  • 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.

Noch keine Kommentare.