Exposing Services in Kubernetes

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Υπάρχουν διάφοροι τρόποι για να εκθέσετε υπηρεσίες στο Kubernetes, έτσι ώστε τόσο οι εσωτερικές όσο και οι εξωτερικές καταλήξεις να μπορούν να τις προσεγγίσουν. Αυτή η διαμόρφωση του Kubernetes είναι αρκετά κρίσιμη, καθώς ο διαχειριστής μπορεί να δώσει πρόσβαση σε επιτιθέμενους για υπηρεσίες στις οποίες δεν θα έπρεπε να έχουν πρόσβαση.

Αυτόματη Απαρίθμηση

Πριν ξεκινήσετε να απαριθμείτε τους τρόπους που προσφέρει το K8s για να εκθέσει υπηρεσίες στο κοινό, γνωρίστε ότι αν μπορείτε να καταλογίσετε τα namespaces, τις υπηρεσίες και τις εισαγωγές, μπορείτε να βρείτε όλα όσα είναι εκτεθειμένα στο κοινό με:

kubectl get namespace -o custom-columns='NAME:.metadata.name' | grep -v NAME | while IFS='' read -r ns; do
echo "Namespace: $ns"
kubectl get service -n "$ns"
kubectl get ingress -n "$ns"
echo "=============================================="
echo ""
echo ""
done | grep -v "ClusterIP"
# Remove the last '| grep -v "ClusterIP"' to see also type ClusterIP

ClusterIP

Ένα ClusterIP service είναι το προεπιλεγμένο Kubernetes service. Σας παρέχει ένα service μέσα στο cluster σας που άλλες εφαρμογές μέσα στο cluster σας μπορούν να έχουν πρόσβαση. Δεν υπάρχει εξωτερική πρόσβαση.

Ωστόσο, αυτό μπορεί να προσπελαστεί χρησιμοποιώντας το Kubernetes Proxy:

kubectl proxy --port=8080

Τώρα, μπορείτε να πλοηγηθείτε μέσω του Kubernetes API για να αποκτήσετε πρόσβαση σε υπηρεσίες χρησιμοποιώντας τον παρακάτω τρόπο:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τον παρακάτω σύνδεσμο:

http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/

για να αποκτήσετε πρόσβαση σε αυτήν την υπηρεσία:

apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
selector:
app: my-app
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP

Αυτή η μέθοδος απαιτεί να εκτελέσετε το kubectl ως έναν εξουσιοδοτημένο χρήστη.

NodePort

Όταν χρησιμοποιείται η επιλογή NodePort, δημιουργείται ένας καθορισμένος θύρα σε όλους τους κόμβους (που αντιπροσωπεύουν τις εικονικές μηχανές). Ο κίνητος ρυθμιστής που κατευθύνεται σε αυτήν τη συγκεκριμένη θύρα δρομολογείται συστηματικά στην υπηρεσία. Συνήθως, αυτή η μέθοδος δεν συνιστάται λόγω των ανεπιθύμητων επιπτώσεών της.

Ένα παράδειγμα προδιαγραφής NodePort:

apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCP

Εάν δεν καθορίσετε το nodePort στο yaml (είναι η θύρα που θα ανοίξει), θα χρησιμοποιηθεί μια θύρα στο εύρος 30000-32767.

LoadBalancer

Εκθέτει την υπηρεσία εξωτερικά χρησιμοποιώντας έναν ισορροπητή φορτίου του παρόχου cloud. Στο GKE, αυτό θα δημιουργήσει έναν Ισορροπητή Φορτίου Δικτύου που θα σας δώσει μια μοναδική διεύθυνση IP που θα προωθεί όλη την κίνηση στην υπηρεσία σας.

Πρέπει να πληρώσετε για έναν ισορροπητή φορτίου για κάθε εκτεθειμένη υπηρεσία, που μπορεί να γίνει ακριβό.

ExternalName

Από τα έγγραφα: Οι υπηρεσίες τύπου ExternalName αντιστοιχίζουν μια υπηρεσία σε ένα όνομα DNS, όχι σε έναν τυπικό επιλογέα όπως my-service ή cassandra. Καθορίζετε αυτές τις υπηρεσίες με την παράμετρο spec.externalName.

Για παράδειγμα, ο ακόλουθος ορισμός υπηρεσίας αντιστοιχίζει την υπηρεσία my-service στο περιβάλλον prod στο my.database.example.com:

apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com

Όταν αναζητείτε τον κεντρικό υπολογιστή my-service.prod.svc.cluster.local, ο υπηρεσία DNS του συστήματος επιστρέφει ένα εγγραφή CNAME με την τιμή my.database.example.com. Η πρόσβαση στο my-service λειτουργεί με τον ίδιο τρόπο με άλλες υπηρεσίες, με την κρίσιμη διαφορά ότι η ανακατεύθυνση συμβαίνει στο επίπεδο DNS αντί να γίνεται μέσω προϊστάμενης ή προώθησης.

Εξωτερικές Διευθύνσεις IP

Ο κίνηση που εισέρχεται στο σύμπλεγμα με την εξωτερική διεύθυνση IP (ως διεύθυνση προορισμού), στη θύρα της υπηρεσίας, θα δρομολογηθεί σε ένα από τα άκρα της υπηρεσίας. Οι externalIPs δεν διαχειρίζονται από το Kubernetes και είναι ευθύνη του διαχειριστή του συμπλέγματος.

Στην προδιαγραφή της υπηρεσίας, μπορούν να καθοριστούν οι externalIPs μαζί με οποιοδήποτε από τα ServiceTypes. Στο παρακάτω παράδειγμα, η "my-service" μπορεί να προσεγγιστεί από πελάτες στη διεύθυνση "80.11.12.10:80" (externalIP:port)

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- 80.11.12.10

Ingress

Αντίθετα από όλα τα παραπάνω παραδείγματα, το Ingress ΔΕΝ είναι ένας τύπος υπηρεσίας. Αντ' αυτού, βρίσκεται μπροστά από πολλές υπηρεσίες και λειτουργεί ως ένας "έξυπνος δρομολογητής" ή είσοδος στο cluster σας.

Μπορείτε να κάνετε πολλά διαφορετικά πράγματα με ένα Ingress, και υπάρχουν πολλοί τύποι ελεγκτών Ingress που έχουν διαφορετικές δυνατότητες.

Ο προεπιλεγμένος ελεγκτής Ingress του GKE θα δημιουργήσει έναν HTTP(S) Load Balancer για εσάς. Αυτό θα σας επιτρέψει να κάνετε δρομολόγηση βάσει διαδρομής ή υποτομέα προς υπηρεσίες πίσω από τον φορέα. Για παράδειγμα, μπορείτε να στείλετε όλα τα foo.yourdomain.com στην υπηρεσία foo, και όλα τα yourdomain.com/bar/ κάτω από τη διαδρομή bar στην υπηρεσία bar.

Το YAML για ένα αντικείμενο Ingress στο GKE με έναν L7 HTTP Load Balancer μπορεί να μοιάζει με αυτό:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated