Exposing Services in Kubernetes
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Il existe diffĂ©rentes maniĂšres dâexposer des services dans Kubernetes afin que les points de terminaison internes et externes puissent y accĂ©der. Cette configuration Kubernetes est assez critique car lâadministrateur pourrait donner accĂšs Ă des attaquants Ă des services auxquels ils ne devraient pas avoir accĂšs.
Automatic Enumeration
Avant de commencer Ă Ă©numĂ©rer les maniĂšres dont K8s offre dâexposer des services au public, sachez que si vous pouvez lister les espaces de noms, les services et les ingresses, vous pouvez trouver tout ce qui est exposĂ© au public avec :
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
Un service ClusterIP est le service par dĂ©faut de Kubernetes. Il vous fournit un service Ă lâintĂ©rieur de votre cluster auquel dâautres applications Ă lâintĂ©rieur de votre cluster peuvent accĂ©der. Il nây a pas dâaccĂšs externe.
Cependant, cela peut ĂȘtre accessible en utilisant le Proxy Kubernetes :
kubectl proxy --port=8080
Maintenant, vous pouvez naviguer Ă travers lâAPI Kubernetes pour accĂ©der aux services en utilisant ce schĂ©ma :
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Par exemple, vous pourriez utiliser lâURL suivante :
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
pour accéder à ce service :
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
Cette mĂ©thode nĂ©cessite que vous exĂ©cutiez kubectl en tant quâutilisateur authentifiĂ©.
Listez tous les ClusterIPs :
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
Lorsque NodePort est utilisĂ©, un port dĂ©signĂ© est rendu disponible sur tous les nĆuds (reprĂ©sentant les machines virtuelles). Le trafic dirigĂ© vers ce port spĂ©cifique est ensuite systĂ©matiquement acheminĂ© vers le service. En gĂ©nĂ©ral, cette mĂ©thode nâest pas recommandĂ©e en raison de ses inconvĂ©nients.
Liste de tous les NodePorts :
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
Un exemple de spécification 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
Si vous ne spĂ©cifiez pas le nodePort dans le yaml (câest le port qui sera ouvert), un port dans la plage 30000â32767 sera utilisĂ©.
LoadBalancer
Expose le Service Ă lâextĂ©rieur en utilisant le load balancer dâun fournisseur de cloud. Sur GKE, cela lancera un Network Load Balancer qui vous donnera une seule adresse IP qui redirigera tout le trafic vers votre service. Sur AWS, cela lancera un Load Balancer.
Vous devez payer pour un LoadBalancer par service exposĂ©, ce qui peut ĂȘtre coĂ»teux.
Listez tous les LoadBalancers :
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
Les IP externes sont exposĂ©es par des services de type Load Balancers et elles sont gĂ©nĂ©ralement utilisĂ©es lorsquâun Load Balancer de fournisseur de Cloud externe est utilisĂ©.
Pour les trouver, vérifiez les load balancers avec des valeurs dans le champ
EXTERNAL-IP.
Le trafic qui entre dans le cluster avec lâIP externe (comme IP de destination), sur le port du Service, sera acheminĂ© vers lâun des points de terminaison du Service. externalIPs ne sont pas gĂ©rĂ©s par Kubernetes et relĂšvent de la responsabilitĂ© de lâadministrateur du cluster.
Dans la spĂ©cification du Service, externalIPs peuvent ĂȘtre spĂ©cifiĂ©s avec nâimporte lequel des ServiceTypes. Dans lâexemple ci-dessous, âmy-serviceâ peut ĂȘtre accessible par les clients sur â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
DâaprĂšs la documentation : Les Services de type ExternalName mappent un Service Ă un nom DNS, et non Ă un sĂ©lecteur typique tel que my-service ou cassandra. Vous spĂ©cifiez ces Services avec le paramĂštre spec.externalName.
Cette dĂ©finition de Service, par exemple, mappe le Service my-service dans lâespace de noms prod Ă my.database.example.com :
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
Lors de la recherche de lâhĂŽte my-service.prod.svc.cluster.local, le Service DNS du cluster renvoie un enregistrement CNAME avec la valeur my.database.example.com. LâaccĂšs Ă my-service fonctionne de la mĂȘme maniĂšre que dâautres Services, mais avec la diffĂ©rence cruciale que la redirection se produit au niveau DNS plutĂŽt que par le biais de proxy ou de transfert.
Listez tous les ExternalNames :
kubectl get services --all-namespaces | grep ExternalName
Ingress
Contrairement Ă tous les exemples ci-dessus, Ingress nâest PAS un type de service. Au lieu de cela, il se trouve devant plusieurs services et agit comme un ârouteur intelligentâ ou point dâentrĂ©e dans votre cluster.
Vous pouvez faire beaucoup de choses différentes avec un Ingress, et il existe de nombreux types de contrÎleurs Ingress qui ont des capacités différentes.
Le contrĂŽleur dâingress GKE par dĂ©faut va crĂ©er un HTTP(S) Load Balancer pour vous. Cela vous permettra de faire Ă la fois un routage basĂ© sur le chemin et un routage basĂ© sur le sous-domaine vers des services backend. Par exemple, vous pouvez envoyer tout sur foo.yourdomain.com au service foo, et tout sous le chemin yourdomain.com/bar/ au service bar.
Le YAML pour un objet Ingress sur GKE avec un L7 HTTP Load Balancer pourrait ressembler Ă ceci :
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
Listez tous les ingresses :
kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'
Bien quâil soit prĂ©fĂ©rable dans ce cas dâobtenir les informations de chacun un par un pour mieux les lire :
kubectl get ingresses --all-namespaces -o=yaml
Références
- 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
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

