Exposing Services in Kubernetes

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Kubernetes'te hizmetleri açığa çıkarmak için farklı yöntemler vardır, böylece hem hem de dış uç noktalarına erişilebilir. Bu Kubernetes yapılandırması oldukça önemlidir çünkü yönetici, saldırganlara erişmemeleri gereken hizmetlere erişim sağlayabilir.

Otomatik Numaralandırma

Halka hizmet sunmak için K8s'nin sunduğu yolları numaralandırmaya başlamadan önce, ad alanlarını, hizmetleri ve girişleri listeleyebilirseniz, her şeyi aşağıdaki komutla halka açık olarak bulabilirsiniz:

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, Kubernetes'in varsayılan servisidir. Bu, kümeniz içindeki diğer uygulamaların erişebileceği bir servis sağlar. Harici erişim yoktur.

Ancak, bu Kubernetes Proxy kullanılarak erişilebilir:

kubectl proxy --port=8080

Şimdi, hizmetlere erişmek için Kubernetes API'si üzerinden gezinebilirsiniz. Bu şema kullanılarak erişim sağlanabilir:

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 için kubectl'yi kimlik doğrulaması yapılmış bir kullanıcı olarak çalıştırmanız gerekmektedir.

NodePort

NodePort kullanıldığında, belirli bir bağlantı noktası tüm Düğümlerde (Sanal Makineleri temsil eden) kullanılabilir hale getirilir. Bu belirli bağlantı noktasına yönlendirilen trafik, ardından hizmete sistemli bir şekilde yönlendirilir. Genellikle bu yöntem, dezavantajları nedeniyle önerilmez.

Bir NodePort örneği:

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 dosyasında nodePort belirtmezseniz (bu açılacak olan porttur) 30000-32767 aralığında bir port kullanılır.

LoadBalancer

Servisi bir bulut sağlayıcısının yük dengeleyicisi kullanarak dışarıya açar. GKE'de, bu bir Ağ Yük Dengeleyici oluşturacak ve tüm trafiği servisinize iletecek tek bir IP adresi sağlayacaktır.

Her bir açık servis için bir Yük Dengeleyiciye ödeme yapmanız gerekmektedir, bu da maliyetli olabilir.

ExternalName

Dokümantasyondan: ExternalName tipindeki servisler, bir Servisi my-service veya cassandra gibi tipik bir seçiciye değil, bir DNS adına eşler. Bu Servisleri spec.externalName parametresiyle belirtirsiniz.

Örneğin, aşağıdaki Servis tanımı, 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 adını sorguladığımızda, küme DNS Hizmeti my.database.example.com değeriyle bir CNAME kaydı döndürür. my-service'e erişmek, diğer Hizmetlerle aynı şekilde çalışırken, yönlendirme DNS seviyesinde gerçekleşir ve proxy veya yönlendirme ile değil.

Harici IP'ler

Küme dışına giren trafiğin harici IP (hedef IP) ile, Hizmet bağlantı noktasına yönlendirilir ve bir Hizmet uç noktasına yönlendirilir. externalIPs Kubernetes tarafından yönetilmez ve küme yöneticisinin sorumluluğundadır.

Hizmet özelliklerinde, externalIPs 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

Ingress

Tüm yukarıdaki örneklerin aksine, Ingress bir hizmet türü DEĞİLDİR. Bunun yerine, birden fazla hizmetin önünde oturur ve kümenize bir "akıllı yönlendirici" veya giriş noktası olarak hareket eder.

Bir Ingress ile birçok farklı şey yapabilirsiniz ve farklı yeteneklere sahip birçok Ingress denetleyicisi vardır.

Varsayılan GKE Ingress denetleyicisi sizin için bir HTTP(S) Yük Dengeleyici oluşturur. Bu, hem yol tabanlı hem de alt alan tabanlı yönlendirme yapmanıza olanak sağlar. Örneğin, foo.yourdomain.com üzerindeki her şeyi foo hizmetine gönderebilir ve yourdomain.com/bar/ yolunun altındaki her şeyi bar hizmetine yönlendirebilirsiniz.

GKE'deki bir Ingress nesnesi için YAML, L7 HTTP Yük Dengeleyici ile şuna benzer olabilir:

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

Referanslar

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated