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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
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:
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:
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:
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:
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:
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:
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:
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
)
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
:
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:
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:
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:
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:
kubectl get ingresses --all-namespaces -o=yaml
Marejeleo
- https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
- https://kubernetes.io/docs/concepts/services-networking/service/
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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.