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)
Υπάρχουν διαφορετικοί τρόποι για να εκθέσετε υπηρεσίες στο Kubernetes έτσι ώστε τόσο οι εσωτερικές όσο και οι εξωτερικές τελικές σημεία να μπορούν να τις προσπελάσουν. Αυτή η ρύθμιση του Kubernetes είναι αρκετά κρίσιμη καθώς ο διαχειριστής θα μπορούσε να δώσει πρόσβαση σε επιτιθέμενους σε υπηρεσίες που δεν θα έπρεπε να έχουν πρόσβαση.
Πριν ξεκινήσετε να απαριθμείτε τους τρόπους που προσφέρει το K8s για να εκθέσει υπηρεσίες στο κοινό, γνωρίστε ότι αν μπορείτε να καταγράψετε namespaces, υπηρεσίες και ingresses, μπορείτε να βρείτε τα πάντα εκτεθειμένα στο κοινό με:
Μια ClusterIP υπηρεσία είναι η προεπιλεγμένη υπηρεσία Kubernetes. Σας δίνει μια υπηρεσία μέσα στο cluster σας που μπορούν να προσπελάσουν άλλες εφαρμογές μέσα στο cluster σας. Δεν υπάρχει εξωτερική πρόσβαση.
Ωστόσο, αυτό μπορεί να προσπελαστεί χρησιμοποιώντας το Kubernetes Proxy:
Τώρα, μπορείτε να πλοηγηθείτε μέσω του Kubernetes API για να αποκτήσετε πρόσβαση σε υπηρεσίες χρησιμοποιώντας αυτό το σχήμα:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε την ακόλουθη διεύθυνση URL:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
για να αποκτήσετε πρόσβαση σε αυτή την υπηρεσία:
Αυτή η μέθοδος απαιτεί να εκτελείτε το kubectl
ως επαληθευμένος χρήστης.
Λίστα όλων των ClusterIPs:
Όταν χρησιμοποιείται το NodePort, μια καθορισμένη θύρα είναι διαθέσιμη σε όλους τους Κόμβους (που αντιπροσωπεύουν τις Εικονικές Μηχανές). Η κυκλοφορία που κατευθύνεται σε αυτήν τη συγκεκριμένη θύρα δρομολογείται στη υπηρεσία. Συνήθως, αυτή η μέθοδος δεν συνιστάται λόγω των μειονεκτημάτων της.
Λίστα όλων των NodePorts:
Ένα παράδειγμα προδιαγραφής NodePort:
Αν δεν καθορίσετε το nodePort στο yaml (είναι η θύρα που θα ανοιχτεί) θα χρησιμοποιηθεί μια θύρα στην εμβέλεια 30000–32767.
Εκθέτει την Υπηρεσία εξωτερικά χρησιμοποιώντας τον φορτωτή ισχύος ενός παρόχου cloud. Στο GKE, αυτό θα εκκινήσει έναν Network Load Balancer που θα σας δώσει μια μοναδική διεύθυνση IP που θα προωθεί όλη την κίνηση στην υπηρεσία σας. Στο AWS θα εκκινήσει έναν Load Balancer.
Πρέπει να πληρώσετε για έναν LoadBalancer ανά εκτεθειμένη υπηρεσία, κάτι που μπορεί να είναι ακριβό.
Λίστα όλων των LoadBalancers:
Οι εξωτερικές IP εκτίθενται από υπηρεσίες τύπου Load Balancers και γενικά χρησιμοποιούνται όταν χρησιμοποιείται ένας εξωτερικός Load Balancer Cloud Provider.
Για να τις βρείτε, ελέγξτε για load balancers με τιμές στο πεδίο EXTERNAL-IP
.
Η κίνηση που εισέρχεται στο cluster με την εξωτερική IP (ως destination IP), στην θύρα της Υπηρεσίας, θα δρομολογηθεί σε ένα από τα endpoints της Υπηρεσίας. Οι externalIPs
δεν διαχειρίζονται από το Kubernetes και είναι ευθύνη του διαχειριστή του cluster.
Στην προδιαγραφή της Υπηρεσίας, οι externalIPs
μπορούν να καθοριστούν μαζί με οποιονδήποτε από τους ServiceTypes
. Στο παρακάτω παράδειγμα, "my-service
" μπορεί να προσπελαστεί από πελάτες στο "80.11.12.10:80
" (externalIP:port
)
Από τα έγγραφα: Οι υπηρεσίες τύπου ExternalName χαρτογραφούν μια Υπηρεσία σε ένα όνομα DNS, όχι σε έναν τυπικό επιλεγέα όπως my-service
ή cassandra
. Αυτές τις Υπηρεσίες τις καθορίζετε με την παράμετρο spec.externalName
.
Αυτή η ορισμός Υπηρεσίας, για παράδειγμα, χαρτογραφεί την Υπηρεσία my-service
στο namespace prod
στο my.database.example.com
:
Όταν αναζητάτε τον κόμβο my-service.prod.svc.cluster.local
, η υπηρεσία DNS του κλάσματος επιστρέφει μια εγγραφή CNAME
με την τιμή my.database.example.com
. Η πρόσβαση στο my-service
λειτουργεί με τον ίδιο τρόπο όπως και άλλες Υπηρεσίες, αλλά με τη σημαντική διαφορά ότι η ανακατεύθυνση συμβαίνει σε επίπεδο DNS αντί μέσω προξενίου ή προώθησης.
Λίστα όλων των ExternalNames:
Σε αντίθεση με όλα τα παραπάνω παραδείγματα, το Ingress ΔΕΝ είναι τύπος υπηρεσίας. Αντίθετα, βρίσκεται μπροστά από πολλές υπηρεσίες και λειτουργεί ως “έξυπνος δρομολογητής” ή σημείο εισόδου στο cluster σας.
Μπορείτε να κάνετε πολλά διαφορετικά πράγματα με ένα Ingress, και υπάρχουν πολλοί τύποι ελεγκτών Ingress που έχουν διαφορετικές δυνατότητες.
Ο προεπιλεγμένος ελεγκτής ingress GKE θα δημιουργήσει έναν HTTP(S) Load Balancer για εσάς. Αυτό θα σας επιτρέψει να κάνετε δρομολόγηση τόσο με βάση τη διαδρομή όσο και με βάση το υποτομέα προς τις υπηρεσίες backend. Για παράδειγμα, μπορείτε να στείλετε τα πάντα στο foo.yourdomain.com στην υπηρεσία foo, και τα πάντα κάτω από τη διαδρομή yourdomain.com/bar/ στην υπηρεσία bar.
Το YAML για ένα αντικείμενο Ingress στο GKE με έναν L7 HTTP Load Balancer μπορεί να μοιάζει έτσι:
Καταγράψτε όλα τα ingresses:
Αν και σε αυτή την περίπτωση είναι καλύτερο να αποκτήσετε τις πληροφορίες η καθεμία ξεχωριστά για να τις διαβάσετε καλύτερα:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)