Exposing Services in Kubernetes

Reading time: 7 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Kuna njia tofauti za kufichua huduma katika Kubernetes ili nukta za ndani na nukta za nje ziweze kuzifikia. Mipangilio hii ya Kubernetes ni muhimu sana kwani msimamizi anaweza kutoa ufikiaji kwa washambuliaji kwa huduma ambazo hawapaswi kuwa na ufikiaji.

Automatic Enumeration

Kabla ya kuanza kuorodhesha njia ambazo K8s inatoa kufichua huduma kwa umma, fahamu kwamba ikiwa unaweza kuorodhesha majina ya maeneo, huduma na ingresses, unaweza kupata kila kitu kilichofichuliwa kwa umma kwa:

bash
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

Huduma ya ClusterIP ni ya kawaida katika Kubernetes. Inakupa huduma ndani ya klasta yako ambayo programu nyingine ndani ya klasta yako zinaweza kufikia. Hakuna ufikiaji wa nje.

Hata hivyo, hii inaweza kufikiwa kwa kutumia Proxy ya Kubernetes:

bash
kubectl proxy --port=8080

Sasa, unaweza kuvinjari kupitia API ya Kubernetes ili kufikia huduma kwa kutumia mpango huu:

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

Kwa mfano unaweza kutumia URL ifuatayo:

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

ili kufikia huduma hii:

yaml
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

Hii mbinu inahitaji uendeshe kubectl kama mtumiaji aliyeidhinishwa.

Orodhesha ClusterIPs zote:

bash
kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep ClusterIP

NodePort

Wakati NodePort inatumika, bandari maalum inapatikana kwenye Nodes zote (zinazoakilisha Mashine za Kijamii). Mwelekeo unaoelekezwa kwenye bandari hii maalum kisha unachukuliwa kupelekwa kwa huduma. Kawaida, njia hii haitashauriwa kutokana na hasara zake.

Orodha ya NodePorts zote:

bash
kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port,NODEPORT(S):.spec.ports[*].nodePort,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep NodePort

Mfano wa spesifikasiyo ya NodePort:

yaml
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

Ikiwa hujabainisha nodePort katika yaml (ni bandari ambayo itafunguliwa) bandari katika kikundi 30000–32767 itatumika.

LoadBalancer

Inafichua Huduma nje kwa kutumia balancer ya mzigo ya mtoa huduma wa wingu. Kwenye GKE, hii itazindua Network Load Balancer ambayo itakupa anwani moja ya IP ambayo itapeleka trafiki yote kwa huduma yako. Katika AWS itazindua Load Balancer.

Lazima ulipie LoadBalancer kwa kila huduma iliyofichuliwa, ambayo inaweza kuwa ghali.

Orodhesha LoadBalancers zote:

bash
kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,EXTERNAL-IP:.status.loadBalancer.ingress[*],PORT(S):.spec.ports[*].port,NODEPORT(S):.spec.ports[*].nodePort,TARGETPORT(S):.spec.ports[*].targetPort,SELECTOR:.spec.selector' | grep LoadBalancer

External IPs

tip

External IPs zinakabiliwa na huduma za aina ya Load Balancers na kwa ujumla hutumiwa wakati Load Balancer wa Mtoa Huduma wa Nje unatumika.

Ili kuzipata, angalia kwa load balancers zenye thamani katika uwanja wa EXTERNAL-IP.

Mwanzo wa trafiki unaoingia kwenye klasta kwa external IP (kama destination IP), kwenye bandari ya Huduma, uta elekezwa kwa moja ya maeneo ya Huduma. externalIPs hazisimamiwi na Kubernetes na ni jukumu la msimamizi wa klasta.

Katika spesifikas ya Huduma, externalIPs zinaweza kuainishwa pamoja na aina yoyote ya ServiceTypes. Katika mfano hapa chini, "my-service" inaweza kufikiwa na wateja kwenye "80.11.12.10:80" (externalIP:port)

yaml
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

ExternalName

Kutoka kwenye hati: Huduma za aina ya ExternalName zinachora Huduma kwa jina la DNS, si kwa mteule wa kawaida kama my-service au cassandra. Unabainisha hizi Huduma kwa kutumia parameter ya spec.externalName.

Mwelekeo huu wa Huduma, kwa mfano, unachora Huduma ya my-service katika nafasi ya prod kwa my.database.example.com:

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

Wakati wa kutafuta mwenyeji my-service.prod.svc.cluster.local, Huduma ya DNS ya klasta inarudisha rekodi ya CNAME yenye thamani my.database.example.com. Kufikia my-service kunafanya kazi kwa njia ile ile kama Huduma nyingine lakini kwa tofauti muhimu kwamba mwelekeo unafanyika katika kiwango cha DNS badala ya kupitia proxy au kupeleka.

Orodhesha ExternalNames zote:

bash
kubectl get services --all-namespaces | grep ExternalName

Ingress

T tofauti na mifano yote hapo juu, Ingress SIO aina ya huduma. Badala yake, inakaa mbele ya huduma nyingi na inafanya kazi kama "router mwenye akili" au kiingilio katika klasta yako.

Unaweza kufanya mambo mengi tofauti na Ingress, na kuna aina nyingi za Ingress controllers ambazo zina uwezo tofauti.

Msimamizi wa ingrees wa GKE wa kawaida utaanzisha HTTP(S) Load Balancer kwa ajili yako. Hii itakuruhusu kufanya upitishaji wa msingi wa njia na wa subdomain kwa huduma za nyuma. Kwa mfano, unaweza kutuma kila kitu kwenye foo.yourdomain.com kwa huduma ya foo, na kila kitu chini ya njia ya yourdomain.com/bar/ kwa huduma ya bar.

YAML ya kitu cha Ingress kwenye GKE na L7 HTTP Load Balancer inaweza kuonekana kama hii:

yaml
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

Orodha ya ingresses zote:

bash
kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'

Ingawa katika kesi hii ni bora kupata taarifa ya kila mmoja mmoja ili kuisoma vizuri:

bash
kubectl get ingresses --all-namespaces -o=yaml

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks