Exposing Services in Kubernetes

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Postoje različiti načini izlaganja usluga u Kubernetesu tako da ih mogu pristupiti kako interni tako i eksterni endpointi. Ova konfiguracija Kubernetesa je prilično kritična jer administrator može omogućiti pristup napadačima uslugama do kojih ne bi trebali imati pristup.

Automatsko nabrojavanje

Pre nego što počnete nabrojavati načine na koje K8s omogućava izlaganje usluga javnosti, znajte da ako možete izlistati namespace-ove, usluge i ingress-e, možete pronaći sve što je izloženo javnosti pomoću:

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 servis je podrazumevani Kubernetes servis. Pruža vam servis unutar vašeg klastera kojem drugi programi unutar klastera mogu pristupiti. Nema spoljnog pristupa.

Međutim, ovome se može pristupiti korišćenjem Kubernetes Proxy-ja:

kubectl proxy --port=8080

Sada možete navigirati kroz Kubernetes API kako biste pristupili uslugama koristeći ovu šemu:

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

Na primer, možete koristiti sledeći URL:

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

da pristupite ovoj usluzi:

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

Ova metoda zahteva da pokrenete kubectl kao autentifikovanog korisnika.

NodePort

Kada se koristi NodePort, određeni port je dostupan na svim čvorovima (koji predstavljaju virtuelne mašine). Saobraćaj usmeren ka ovom specifičnom portu se zatim sistematski preusmerava na servis. Ova metoda se obično ne preporučuje zbog svojih nedostataka.

Primer specifikacije NodePort-a:

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

Ako ne navedete nodePort u yaml (to je port koji će biti otvoren), koristiće se port u opsegu 30000-32767.

LoadBalancer

Izlaže Servis spolja koristeći load balancer cloud provajdera. Na GKE, ovo će pokrenuti Network Load Balancer koji će vam dati jednu IP adresu koja će preusmeravati sav saobraćaj ka vašem servisu.

Morate platiti za LoadBalancer po izloženom servisu, što može biti skupo.

ExternalName

Iz dokumentacije: Servisi tipa ExternalName mapiraju Servis na DNS ime, a ne na tipični selektor kao što su my-service ili cassandra. Ove Servise definišete sa parametrom spec.externalName.

Na primer, ovaj definisani Servis mapira my-service Servis u prod namespace-u na my.database.example.com:

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

Kada se pretražuje host my-service.prod.svc.cluster.local, DNS usluga klastera vraća CNAME zapis sa vrednošću my.database.example.com. Pristupanje my-service radi na isti način kao i ostale usluge, ali sa ključnom razlikom da preusmeravanje se dešava na nivou DNS-a, umesto putem proksiranja ili prosleđivanja.

Spoljni IP-ovi

Saobraćaj koji ulazi u klaster sa spoljnim IP-om (kao odredišni IP), na portu usluge, će biti usmeren ka jednom od krajnjih tačaka usluge. externalIPs nisu upravljani od strane Kubernetes-a i odgovornost je administratora klastera.

U specifikaciji usluge, externalIPs mogu biti navedeni zajedno sa bilo kojim od ServiceTypes. U primeru ispod, "my-service" može biti pristupljen od strane klijenata na "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

Za razliku od svih prethodnih primera, Ingress NIJE vrsta servisa. Umesto toga, on se nalazi ispred više servisa i deluje kao "pametni ruter" ili ulaz u vaš klaster.

Možete uraditi mnogo različitih stvari sa Ingress-om, i postoje mnoge vrste kontrolera Ingress-a koji imaju različite mogućnosti.

Podrazumevani GKE kontroler Ingress-a će pokrenuti HTTP(S) Load Balancer za vas. To će vam omogućiti rutiranje na osnovu putanje i poddomena ka pozadinskim servisima. Na primer, možete poslati sve sa foo.yourdomain.com na servis foo, a sve ispod putanje yourdomain.com/bar/ na servis bar.

YAML za Ingress objekat na GKE sa L7 HTTP Load Balancer može izgledati ovako:

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

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated