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

Kubernetes’te servisleri açmanın farklı yolları vardır, böylece hem 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-IP alanı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

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