Kubernetes’te Servisleri Açma
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
Kubernetes’te servisleri açmanın farklı yolları vardır, böylece hem iç hem de dış uç noktalar onlara erişebilir. Bu Kubernetes yapılandırması oldukça kritik olup, yönetici saldırganlara erişmemeleri gereken servislere erişim verebilir.
Otomatik Sayım
K8s’in servisleri halka açma yollarını saymaya başlamadan önce, eğer ad alanlarını, servisleri ve girişleri listeleyebiliyorsanız, halka açık olan her şeyi bulabileceğinizi bilin:
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
Bir ClusterIP servisi, varsayılan Kubernetes servisidir. Küme içindeki diğer uygulamaların erişebileceği bir hizmet sağlar. Dış erişim yoktur.
Ancak, bu Kubernetes Proxy kullanılarak erişilebilir:
kubectl proxy --port=8080
Artık bu şemayı kullanarak Kubernetes API’si aracılığıyla hizmetlere erişebilirsiniz:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Örneğin, aşağıdaki URL’yi kullanabilirsiniz:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
bu hizmete erişmek için:
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
Bu yöntem, kubectl’ü kimlik doğrulaması yapılmış bir kullanıcı olarak çalıştırmanızı gerektirir.
Tüm ClusterIP’leri listeleyin:
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
NodePort kullanıldığında, tüm Düğümlerde (Sanal Makineleri temsil eden) belirlenmiş bir port kullanılabilir hale gelir. Bu belirli porta yönlendirilen trafik, sistematik olarak servise yönlendirilir. Genellikle, bu yöntem dezavantajları nedeniyle önerilmez.
Tüm NodePort’ları listele:
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
NodePort spesifikasyonuna bir örnek:
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
Eğer yaml’da nodePort belirtmezseniz (açılacak port), 30000–32767 aralığında bir port kullanılacaktır.
LoadBalancer
Servisi harici olarak bir bulut sağlayıcısının yük dengeleyicisini kullanarak açar. GKE’de, bu, servisinize tüm trafiği yönlendirecek tek bir IP adresi sağlayan bir Ağ Yük Dengeleyicisi başlatacaktır. AWS’de bir Yük Dengeleyici başlatacaktır.
Açık olan her servis için bir LoadBalancer için ödeme yapmanız gerekecek, bu da pahalı olabilir.
Tüm LoadBalancer’ları listele:
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
Dış IP’ler
Tip
Dış IP’ler, Load Balancer türündeki hizmetler tarafından açığa çıkarılır ve genellikle bir dış Bulut Sağlayıcı Load Balancer kullanıldığında kullanılır.
Onları bulmak için,
EXTERNAL-IPalanında değerleri olan load balancer’lara bakın.
Küme içine dış IP (olarak hedef IP) ile gelen trafik, Hizmet portunda, Hizmet uç noktalarından birine yönlendirilecektir. externalIPs, Kubernetes tarafından yönetilmez ve küme yöneticisinin sorumluluğundadır.
Hizmet spesifikasyonunda, externalIPs herhangi bir ServiceTypes ile birlikte belirtilebilir. Aşağıdaki örnekte, “my-service” istemciler tarafından “80.11.12.10:80” (externalIP:port) üzerinden erişilebilir.
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
Belgelerden: ExternalName türündeki Servisler bir Servisi bir DNS adına eşler, my-service veya cassandra gibi tipik bir seçiciye değil. Bu Servisleri spec.externalName parametresi ile belirtirsiniz.
Bu Servis tanımı, örneğin, prod ad alanındaki my-service Servisini my.database.example.com adresine eşler:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
my-service.prod.svc.cluster.local ana bilgisayarını ararken, küme DNS Servisi my.database.example.com değeriyle bir CNAME kaydı döndürür. my-service’e erişim, diğer Servislerde olduğu gibi çalışır, ancak yönlendirme DNS seviyesinde gerçekleşir, proxy veya yönlendirme yoluyla değil.
Tüm ExternalNames’leri listeleyin:
kubectl get services --all-namespaces | grep ExternalName
Ingress
Yukarıdaki tüm örneklerin aksine, Ingress bir hizmet türü DEĞİLDİR. Bunun yerine, birden fazla hizmetin önünde yer alır ve “akıllı bir yönlendirici” veya kümenize giriş noktası olarak işlev görür.
Bir Ingress ile birçok farklı şey yapabilirsiniz ve farklı yeteneklere sahip birçok Ingress kontrolörü vardır.
Varsayılan GKE ingress kontrolörü sizin için bir HTTP(S) Load Balancer oluşturacaktır. Bu, arka uç hizmetlerine hem yol tabanlı hem de alt alan tabanlı yönlendirme yapmanıza olanak tanır. Örneğin, foo.yourdomain.com üzerindeki her şeyi foo hizmetine, yourdomain.com/bar/ yolundaki her şeyi ise bar hizmetine gönderebilirsiniz.
GKE’deki bir Ingress nesnesi için L7 HTTP Load Balancer ile YAML şu şekilde görünebilir:
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
Tüm girişleri listele:
kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'
Her birinin bilgilerini tek tek almak, daha iyi okumak için daha iyidir:
kubectl get ingresses --all-namespaces -o=yaml
Referanslar
- 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
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

