Exposing Services in Kubernetes
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Es gibt verschiedene Möglichkeiten, Dienste in Kubernetes exponiert zu machen, sodass sowohl interne als auch externe Endpunkte darauf zugreifen können. Diese Kubernetes-Konfiguration ist ziemlich kritisch, da der Administrator Angreifern Zugriff auf Dienste gewähren könnte, auf die sie keinen Zugriff haben sollten.
Bevor Sie mit der Enumeration der Möglichkeiten beginnen, die K8s bietet, um Dienste öffentlich zugänglich zu machen, wissen Sie, dass Sie, wenn Sie Namespaces, Dienste und Ingresses auflisten können, alles finden können, was öffentlich exponiert ist mit:
Ein ClusterIP-Dienst ist der Standard-Kubernetes-Dienst. Er bietet Ihnen einen Dienst innerhalb Ihres Clusters, auf den andere Apps innerhalb Ihres Clusters zugreifen können. Es gibt keinen externen Zugriff.
Dieser kann jedoch über den Kubernetes Proxy zugegriffen werden:
Jetzt können Sie über die Kubernetes-API auf Dienste zugreifen, indem Sie dieses Schema verwenden:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Zum Beispiel könnten Sie die folgende URL verwenden:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
um auf diesen Dienst zuzugreifen:
Diese Methode erfordert, dass Sie kubectl
als authentifizierter Benutzer ausführen.
Liste alle ClusterIPs auf:
Wenn NodePort verwendet wird, wird ein bestimmter Port auf allen Knoten (die die virtuellen Maschinen darstellen) verfügbar gemacht. Traffic, der an diesen spezifischen Port gerichtet ist, wird dann systematisch zum Dienst weitergeleitet. Typischerweise wird diese Methode aufgrund ihrer Nachteile nicht empfohlen.
Liste aller NodePorts:
Ein Beispiel für die NodePort-Spezifikation:
Wenn Sie den nodePort im yaml nicht angeben, wird ein Port im Bereich 30000–32767 verwendet.
Stellt den Service extern unter Verwendung eines Load Balancers des Cloud-Anbieters bereit. In GKE wird dies einen Network Load Balancer starten, der Ihnen eine einzelne IP-Adresse gibt, die den gesamten Datenverkehr an Ihren Service weiterleitet. In AWS wird ein Load Balancer gestartet.
Sie müssen für jeden exponierten Service einen LoadBalancer bezahlen, was teuer sein kann.
Liste aller LoadBalancers:
Externe IPs werden von Diensten des Typs Load Balancer bereitgestellt und werden normalerweise verwendet, wenn ein externer Cloud Provider Load Balancer eingesetzt wird.
Um sie zu finden, überprüfen Sie die Load Balancer mit Werten im Feld EXTERNAL-IP
.
Der Datenverkehr, der mit der externen IP (als Ziel-IP) in den Cluster gelangt, wird am Dienstport an einen der Dienstendpunkte weitergeleitet. externalIPs
werden nicht von Kubernetes verwaltet und liegen in der Verantwortung des Clusteradministrators.
Im Dienst-Spezifikationsdokument können externalIPs
zusammen mit einem der ServiceTypes
angegeben werden. Im folgenden Beispiel kann "my-service
" von Clients unter "80.11.12.10:80
" (externalIP:port
) erreicht werden.
Aus den Dokumenten: Dienste vom Typ ExternalName verknüpfen einen Dienst mit einem DNS-Namen, nicht mit einem typischen Selektor wie my-service
oder cassandra
. Diese Dienste geben Sie mit dem Parameter spec.externalName
an.
Diese Dienstdefinition verknüpft beispielsweise den my-service
Dienst im prod
Namespace mit my.database.example.com
:
Beim Nachschlagen des Hosts my-service.prod.svc.cluster.local
gibt der Cluster-DNS-Dienst einen CNAME
-Eintrag mit dem Wert my.database.example.com
zurück. Der Zugriff auf my-service
funktioniert auf die gleiche Weise wie bei anderen Diensten, jedoch mit dem entscheidenden Unterschied, dass die Umleitung auf DNS-Ebene und nicht über Proxy oder Weiterleitung erfolgt.
Liste aller ExternalNames:
Im Gegensatz zu all den oben genannten Beispielen ist Ingress KEIN Typ von Dienst. Stattdessen sitzt es vor mehreren Diensten und fungiert als „intelligenter Router“ oder Einstiegspunkt in Ihren Cluster.
Sie können mit einem Ingress viele verschiedene Dinge tun, und es gibt viele Arten von Ingress-Controllern, die unterschiedliche Fähigkeiten haben.
Der standardmäßige GKE Ingress-Controller wird für Sie einen HTTP(S) Load Balancer erstellen. Dies ermöglicht Ihnen sowohl pfadbasiertes als auch subdomänenbasiertes Routing zu Backend-Diensten. Zum Beispiel können Sie alles auf foo.yourdomain.com an den foo-Dienst senden und alles unter dem Pfad yourdomain.com/bar/ an den bar-Dienst.
Die YAML für ein Ingress-Objekt auf GKE mit einem L7 HTTP Load Balancer könnte so aussehen:
Liste alle Ingresses:
Obwohl es in diesem Fall besser ist, die Informationen einzeln abzurufen, um sie besser lesen zu können:
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)