mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-basics.
This commit is contained in:
@@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Kubernetes içinde services’leri expose etmenin **farklı yolları** vardır; böylece hem **internal** endpoint’ler hem de **external** endpoint’ler bunlara erişebilir. Bu Kubernetes configuration oldukça kritiktir çünkü administrator, **attackers**’a erişmemesi gereken services’lere erişim verebilir.
|
||||
Kubernetes içinde servisleri expose etmenin **farklı yolları** vardır, böylece hem **internal** endpointler hem de **external** endpointler bunlara erişebilir. Bu Kubernetes konfigürasyonu oldukça kritiktir çünkü administrator, **attackers**'a erişmemeleri gereken servisler için access verebilir.
|
||||
|
||||
### Automatic Enumeration
|
||||
|
||||
K8s’in services’leri public’e expose etmek için sunduğu yöntemleri enumerate etmeye başlamadan önce, eğer namespaces, services ve ingresses listesini alabiliyorsan, public’e exposed olan her şeyi şununla bulabileceğini bil:
|
||||
K8s’nin servisleri public’e expose etmek için sunduğu yolları enumerate etmeye başlamadan önce, namespaces, services ve ingresses listeleyebiliyorsan public’e exposed olan her şeyi şu şekilde bulabileceğini bil:
|
||||
```bash
|
||||
kubectl get namespace -o custom-columns='NAME:.metadata.name' | grep -v NAME | while IFS='' read -r ns; do
|
||||
echo "Namespace: $ns"
|
||||
@@ -20,17 +20,17 @@ done | grep -v "ClusterIP"
|
||||
```
|
||||
### ClusterIP
|
||||
|
||||
Bir **ClusterIP** service, Kubernetes’in **varsayılan** **service**’idir. Cluster’ınızın içinde, diğer uygulamaların erişebileceği bir **service inside** sağlar. **Harici erişim yoktur**.
|
||||
Bir **ClusterIP** service, varsayılan Kubernetes **service**'idir. Bu, clusterınızın içinde diğer app'lerin erişebileceği bir **service inside** sağlar. **Dış erişim yoktur**.
|
||||
|
||||
Ancak, buna Kubernetes Proxy kullanılarak erişilebilir:
|
||||
```bash
|
||||
kubectl proxy --port=8080
|
||||
```
|
||||
Şimdi, bu şemayı kullanarak services erişmek için Kubernetes API içinde gezinebilirsiniz:
|
||||
Artık bu şemayı kullanarak services erişmek için Kubernetes API içinde gezinebilirsiniz:
|
||||
|
||||
`http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/`
|
||||
|
||||
Örneğin, şu URL'yi kullanabilirsiniz:
|
||||
Örneğin, aşağıdaki URL'yi kullanabilirsiniz:
|
||||
|
||||
`http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/`
|
||||
|
||||
@@ -58,7 +58,7 @@ kubectl get services --all-namespaces -o=custom-columns='NAMESPACE:.metadata.nam
|
||||
```
|
||||
### NodePort
|
||||
|
||||
**NodePort** kullanıldığında, tüm **Node**’larda (Virtual Machines’i temsil eden) belirlenmiş bir port erişime açılır. Bu belirli porta yönlendirilen **Traffic**, sistematik olarak **service**’e **routed** edilir. Genellikle, dezavantajları nedeniyle bu yöntem önerilmez.
|
||||
**NodePort** kullanıldığında, tüm Node’larda (Virtual Machines’i temsil eden) belirlenmiş bir port erişime açılır. Bu belirli porta yönlendirilen **traffic**, daha sonra sistematik olarak **service’e yönlendirilir**. Genellikle, dezavantajları nedeniyle bu yöntem önerilmez.
|
||||
|
||||
Tüm NodePort’ları listele:
|
||||
```bash
|
||||
@@ -81,30 +81,41 @@ targetPort: 80
|
||||
nodePort: 30036
|
||||
protocol: TCP
|
||||
```
|
||||
yaml içinde **nodePort** belirtmezseniz (açılacak port budur), **30000–32767 aralığındaki** bir port kullanılacaktır.
|
||||
Eğer yaml içinde **nodePort** belirtmezseniz (açılacak port budur), **30000–32767 aralığında** bir port kullanılacaktır.
|
||||
|
||||
NodePort veya LoadBalancer Services incelerken, traffic-policy alanlarını da kontrol edin; çünkü bunlar, belirli bir kaynaktan hangi node’ların ve backend’lerin kullanılabilir olduğunu değiştirir:
|
||||
```bash
|
||||
kubectl get services --all-namespaces \
|
||||
-o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,TYPE:.spec.type,ETP:.spec.externalTrafficPolicy,ITP:.spec.internalTrafficPolicy,AFFINITY:.spec.sessionAffinity,DIST:.spec.trafficDistribution,NODEPORTS:.spec.ports[*].nodePort'
|
||||
```
|
||||
- `externalTrafficPolicy: Local` gerçek istemci source IP’sini NodePort/LoadBalancer trafiği için korur ve trafiği diğer node’lar üzerindeki endpoints’e yönlendirmekten kaçınır. Local hazır bir endpoint olmayan bir node, Service’in başka yerlerde endpoints’i olsa bile trafiği drop edebilir.
|
||||
- `externalTrafficPolicy: Cluster` varsayılandır ve herhangi bir node üzerinden forward edebilir, ancak backend logları gerçek external client IP yerine node IP’lerini görebilir.
|
||||
- `internalTrafficPolicy: Local` cluster içi Service trafiğini source node üzerindeki local endpoints ile sınırlar. Bu locality routing’dir, authorization boundary değildir.
|
||||
- `sessionAffinity: ClientIP` bir client’tan yapılan tekrarlı testlerin aynı backend’e düşmesini sağlayabilir ve manuel kontroller sırasında diğer hazır endpoints’i gizleyebilir.
|
||||
- `trafficDistribution` ve EndpointSlice topology hints, yeni clusters üzerinde aynı-zone veya aynı-node endpoints’i tercih edebilir; bunları hard security policy yerine routing preference olarak değerlendirin.
|
||||
|
||||
### LoadBalancer
|
||||
|
||||
Service'i harici olarak **bir cloud provider load balancer'ı kullanarak** expose eder. GKE'de bu, tüm trafiği service'inize yönlendirecek tek bir IP address sağlayan bir [Network Load Balancer](https://cloud.google.com/compute/docs/load-balancing/network/) oluşturur. AWS'de ise bir Load Balancer başlatır.
|
||||
Service’i harici olarak **cloud provider'ın load balancer'ını kullanarak** açar. GKE üzerinde bu, tüm trafiği service’inize forward edecek tek bir IP address sağlayan bir [Network Load Balancer](https://cloud.google.com/compute/docs/load-balancing/network/) başlatır. AWS’de ise bir Load Balancer başlatır.
|
||||
|
||||
Expose edilen her service için bir LoadBalancer ücreti ödemeniz gerekir; bu pahalı olabilir.
|
||||
Açığa çıkarılan her service için bir LoadBalancer için ödeme yapmanız gerekir; bu pahalı olabilir.
|
||||
|
||||
Tüm LoadBalancer'ları listeleyin:
|
||||
Tüm LoadBalancers’ları listeleyin:
|
||||
```bash
|
||||
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, Load Balancers türündeki services tarafından exposed edilir ve genellikle external Cloud Provider Load Balancer kullanıldığında kullanılır.
|
||||
> External IPs, Load Balancers tipindeki services tarafından expose edilir ve genellikle bir external Cloud Provider Load Balancer kullanıldığında kullanılır.
|
||||
>
|
||||
> Onları bulmak için, `EXTERNAL-IP` alanında değer bulunan load balancer'ları kontrol edin.
|
||||
> Bunları bulmak için, `EXTERNAL-IP` alanında değerleri olan load balancer'ları kontrol edin.
|
||||
|
||||
**external IP** ile cluster içine giren trafik (**destination IP** olarak), Service portunda, **Service endpoints**'lerinden birine **route** edilir. `externalIPs` Kubernetes tarafından yönetilmez ve cluster administrator'ın sorumluluğundadır.
|
||||
**external IP** ile cluster'a giren traffic, Service portunda, **Service endpoints**'ten birine **routed** edilir. `externalIPs`, Kubernetes tarafından yönetilmez ve cluster administrator'ın sorumluluğundadır.
|
||||
|
||||
`externalIPs`, hassas bir route-control field'dır çünkü bunu ayarlayabilen bir kullanıcı, çevredeki network bu IP'yi cluster'a route ediyorsa, Service owner'ın kontrol etmemesi gereken bir IP address için trafiği sahiplenebilir. Kubernetes, v1.36'da Service `externalIPs` için deprecation ve planned removal duyurdu; bu yüzden mümkün olduğunda LoadBalancer integrations veya Gateway API gibi controller-owned exposure mechanisms tercih edin ve bu field hâlâ mevcutken dikkatlice restrict/admit edin.
|
||||
`externalIPs`, hassas bir route-control alanıdır çünkü onu ayarlayabilen bir kullanıcı, çevredeki network bu IP'yi cluster'a route ediyorsa, Service sahibinin kontrol etmemesi gereken bir IP address için traffic'i sahiplenebilir. Kubernetes, v1.36'da Service `externalIPs` için deprecation ve planlanan removal duyurdu; bu yüzden mümkün olduğunda LoadBalancer integrations veya Gateway API gibi controller-owned exposure mekanizmalarını tercih edin ve bu alan var olmaya devam ederken onu dikkatle restrict/admit edin.
|
||||
|
||||
Service spec içinde `externalIPs`, herhangi bir `ServiceTypes` ile birlikte specified edilebilir. Aşağıdaki example'da, "`my-service`" istemciler tarafından "`80.11.12.10:80`" (`externalIP:port`) üzerinden erişilebilir.
|
||||
Service spec içinde, `externalIPs`, herhangi bir `ServiceTypes` ile birlikte belirtilebilir. Aşağıdaki örnekte, "`my-service`", "`80.11.12.10:80`" (`externalIP:port`) üzerindeki clients tarafından erişilebilir.
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
@@ -123,9 +134,9 @@ externalIPs:
|
||||
```
|
||||
### ExternalName
|
||||
|
||||
[**Belgelerden:**](https://kubernetes.io/docs/concepts/services-networking/service/#externalname) ExternalName türündeki Services, bir Service’i bir DNS adına **eşler**, `my-service` veya `cassandra` gibi tipik bir selector’a değil. Bu Services’i `spec.externalName` parametresi ile belirtirsiniz.
|
||||
[**From the docs:**](https://kubernetes.io/docs/concepts/services-networking/service/#externalname) ExternalName türündeki Services, bir Service'i tipik bir selector olan `my-service` veya `cassandra` yerine bir DNS adına **map eder**. Bu Services'leri `spec.externalName` parametresiyle belirtirsiniz.
|
||||
|
||||
Örneğin, bu Service tanımı `prod` namespace içindeki `my-service` Service’ini `my.database.example.com` adresine eşler:
|
||||
Örneğin, bu Service tanımı `prod` namespace'indeki `my-service` Service'ini `my.database.example.com` adresine map eder:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
@@ -136,34 +147,34 @@ spec:
|
||||
type: ExternalName
|
||||
externalName: my.database.example.com
|
||||
```
|
||||
`my-service.prod.svc.cluster.local` hostunu ararken, cluster DNS Service `my.database.example.com` değerine sahip bir `CNAME` kaydı döndürür. `my-service` erişimi, diğer Services ile aynı şekilde çalışır; ancak kritik fark, **yönlendirme proxyleme veya forwarding yerine DNS seviyesinde gerçekleşir**.
|
||||
Ana makine `my-service.prod.svc.cluster.local` sorgulandığında, cluster DNS Service `my.database.example.com` değerine sahip bir `CNAME` kaydı döndürür. `my-service`e erişmek, diğer Services ile aynı şekilde çalışır; ancak kritik fark, **yönlendirme proxying veya forwarding ile değil, DNS seviyesinde gerçekleşir**.
|
||||
|
||||
Tüm ExternalNames listesini çıkarın:
|
||||
Tüm ExternalNames listesini verin:
|
||||
```bash
|
||||
kubectl get services --all-namespaces | grep ExternalName
|
||||
```
|
||||
### EndpointSlices
|
||||
|
||||
EndpointSlices, bir Service’in şu anda yönlendirdiği gerçek backend adreslerini ve portlarını gösterir. Bir Service’in selector’ı olmadığında, label’lar trafik yolunu açıklamadığında veya yalnızca bazı backend’ler hazır olduğunda özellikle faydalıdır.
|
||||
EndpointSlices, bir Service’in şu anda yönlendirme yaptığı somut backend adreslerini ve portlarını gösterir. Özellikle bir Service’in selector’ı yoksa, labels trafik yolunu açıklamıyorsa veya yalnızca bazı backend’ler hazırsa faydalıdır.
|
||||
|
||||
Service’lerle ilişkili EndpointSlices listesini çıkarın:
|
||||
Service’lerle ilişkili EndpointSlices’ları listele:
|
||||
```bash
|
||||
kubectl get endpointslices --all-namespaces
|
||||
kubectl get endpointslice -n <namespace> -l kubernetes.io/service-name=<service-name> -o yaml
|
||||
kubectl get endpointslice -n <namespace> -l kubernetes.io/service-name=<service-name> \
|
||||
-o custom-columns='NAME:.metadata.name,ADDR:.endpoints[*].addresses,READY:.endpoints[*].conditions.ready,PORTS:.ports[*].port'
|
||||
```
|
||||
Exposure’u incelerken, Service selector ile EndpointSlice `targetRef`, endpoint addresses, readiness conditions ve ports’u karşılaştırın. Selector’sız bir Service, elle yönetilen EndpointSlices ile eşleştirilebilir ve trafiği non-Pod veya beklenmeyen hedeflere yönlendirebilir.
|
||||
Exposure’u incelerken, Service selector’ını EndpointSlice `targetRef`, endpoint addresses, readiness conditions ve ports ile karşılaştırın. Selectorless bir Service, manuel olarak yönetilen EndpointSlice’larla eşleştirilebilir ve trafiği non-Pod veya beklenmedik hedeflere yönlendirebilir.
|
||||
|
||||
### Ingress
|
||||
|
||||
Yukarıdaki tüm örneklerden farklı olarak, **Ingress bir service türü DEĞİLDİR**. Bunun yerine, birden fazla service’in **önünde** yer alır ve cluster’ınıza giriş noktası olarak bir “smart router” gibi davranır.
|
||||
Yukarıdaki tüm örneklerden farklı olarak, **Ingress bir service türü DEĞİLDİR**. Bunun yerine, **birden fazla service’in önünde** yer alır ve cluster’ınıza giriş noktası veya “smart router” olarak hareket eder.
|
||||
|
||||
Ingress ile birçok farklı şey yapabilirsiniz ve **farklı yeteneklere sahip birçok Ingress controller türü vardır**.
|
||||
Ingress ile birçok farklı şey yapabilirsiniz ve **farklı yeteneklere sahip birçok Ingress controller türü** vardır.
|
||||
|
||||
Varsayılan GKE ingress controller, sizin için bir [HTTP(S) Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) başlatır. Bu, hem path tabanlı hem de subdomain tabanlı routing yapmanızı sağlar. Örneğin, foo.yourdomain.com üzerindeki her şeyi foo service’ine, yourdomain.com/bar/ path’i altındaki her şeyi de bar service’ine gönderebilirsiniz.
|
||||
Default GKE ingress controller sizin için bir [HTTP(S) Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) başlatır. Bu, path bazlı ve subdomain bazlı routing’i backend services’e yapmanıza olanak tanır. Örneğin, foo.yourdomain.com altındaki her şeyi foo service’ine, yourdomain.com/bar/ path’i altındaki her şeyi bar service’ine gönderebilirsiniz.
|
||||
|
||||
GKE üzerinde [L7 HTTP Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) kullanan bir Ingress object için YAML şu şekilde görünebilir:
|
||||
GKE üzerinde bir [L7 HTTP Load Balancer](https://cloud.google.com/compute/docs/load-balancing/http/) kullanan bir Ingress object için YAML şöyle görünebilir:
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
@@ -197,7 +208,7 @@ name: bar
|
||||
port:
|
||||
number: 8080
|
||||
```
|
||||
Tüm ingress’leri listeleyin:
|
||||
Tüm ingress’leri listele:
|
||||
```bash
|
||||
kubectl get ingresses --all-namespaces -o=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,RULES:spec.rules[*],STATUS:status'
|
||||
```
|
||||
@@ -207,9 +218,9 @@ kubectl get ingresses --all-namespaces -o=yaml
|
||||
```
|
||||
### Gateway API
|
||||
|
||||
Gateway API, Services’i expose etmek için daha yeni Kubernetes API’sidir. Infrastructure-owned Gateway object’lerini HTTPRoute gibi application-owned Route object’lerinden ayırır. Bu, delegation için faydalıdır, ancak exposure’ın namespace’ler arasında bölünebilmesi anlamına da gelir.
|
||||
Gateway API, Services’i dışa açmak için kullanılan daha yeni Kubernetes API’sidir. Infrastructure-owned Gateway nesnelerini, HTTPRoute gibi application-owned Route nesnelerinden ayırır. Bu, delegation için faydalıdır; ancak exposure’ın namespace’ler arasında bölünebilmesi anlamına da gelir.
|
||||
|
||||
Gateway API exposure object’lerini listele:
|
||||
Gateway API exposure objects’larını listeleyin:
|
||||
```bash
|
||||
kubectl get gatewayclasses
|
||||
kubectl get gateways --all-namespaces
|
||||
@@ -217,13 +228,16 @@ kubectl get httproutes --all-namespaces
|
||||
kubectl get gateway -n <namespace> <gateway-name> -o yaml
|
||||
kubectl get httproute -n <namespace> <route-name> -o yaml
|
||||
```
|
||||
Gateway listener'larını, izin verilen route namespace'lerini, Route `parentRefs`'lerini, hostname'leri, filter'ları, backend reference'ları ve route'un kabul edilip edilmediği gibi status condition'ları kontrol edin. Paylaşılan bir Gateway tarafından kabul edilen bir Route, legacy bir Ingress object'i olmasa bile bir backend'i expose edebilir.
|
||||
Gateway listeners, allowed route namespaces, Route `parentRefs`, hostnames, filters, backend references, ve status conditions such as whether the route was accepted. Shared bir Gateway tarafından accepted edilen bir Route, legacy Ingress object olmasa bile bir backend’i expose edebilir.
|
||||
|
||||
### References
|
||||
|
||||
- [https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0](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/](https://kubernetes.io/docs/concepts/services-networking/service/)
|
||||
- [https://kubernetes.io/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/](https://kubernetes.io/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/](https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/)
|
||||
- [https://kubernetes.io/docs/tutorials/services/source-ip/](https://kubernetes.io/docs/tutorials/services/source-ip/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)
|
||||
- [https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/](https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/)
|
||||
- [https://gateway-api.sigs.k8s.io/](https://gateway-api.sigs.k8s.io/)
|
||||
|
||||
|
||||
@@ -2,53 +2,55 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Bu sayfanın orijinal yazarı** [**Jorge**](https://www.linkedin.com/in/jorge-belmonte-a924b616b/) **(orijinal yazısını oku** [**burada**](https://sickrov.github.io)**)**
|
||||
**Bu sayfanın orijinal yazarı** [**Jorge**](https://www.linkedin.com/in/jorge-belmonte-a924b616b/) **(orijinal yazısını okumak için** [**buraya**](https://sickrov.github.io)**)**
|
||||
|
||||
## Architecture & Basics
|
||||
|
||||
### Kubernetes ne yapar?
|
||||
|
||||
- Bir container engine içinde container/s çalıştırmaya izin verir.
|
||||
- Schedule, container’ların görevini verimli şekilde planlamayı sağlar.
|
||||
- Container’ları canlı tutar.
|
||||
- Container iletişimine izin verir.
|
||||
- container engine içinde container/s çalıştırmaya izin verir.
|
||||
- Schedule, container’ların görevini verimli şekilde yapmasını sağlar.
|
||||
- container’ları canlı tutar.
|
||||
- container iletişimine izin verir.
|
||||
- deployment tekniklerine izin verir.
|
||||
- Bilgi hacimlerini yönetir.
|
||||
- bilgi hacimlerini yönetir.
|
||||
|
||||
### Architecture
|
||||
|
||||

|
||||
|
||||
- **Node**: pod veya pods içeren operating system.
|
||||
- **Pod**: Bir container veya birden fazla container etrafındaki sarmalayıcı. Bir pod yalnızca bir application içermelidir (bu yüzden genelde bir pod sadece 1 container çalıştırır). Pod, kubernetes’in çalışan container technology’sini soyutlama yoludur.
|
||||
- **Service**: Her pod, node’un internal aralığından 1 internal **IP address** alır. Ancak bir service üzerinden de exposed edilebilir. **Service’in ayrıca bir IP address’i vardır** ve amacı pod’lar arasındaki iletişimi sürdürmektir; böylece biri ölürse **yeni replacement** (farklı bir internal IP ile) **aynı service IP’si üzerinden erişilebilir** olur. Internal veya external olarak yapılandırılabilir. Service, **2 pod aynı service’e bağlandığında load balancer** gibi de davranır.\
|
||||
Bir **service** **oluşturulduğunda** çalışan her service’in endpoint’lerini `kubectl get endpoints` ile bulabilirsin
|
||||
- **Kubelet**: Primary node agent. Node ile kubectl arasında iletişimi kuran bileşen ve yalnızca pod çalıştırabilir (API server üzerinden). Kubelet, Kubernetes tarafından oluşturulmamış container’ları yönetmez.
|
||||
- **Kube-proxy**: apiserver ile node arasındaki communications (services) ile ilgilenen service’tir. Temeli node’lar için IPtables’tır. Deneyimli kullanıcılar başka vendor’ların başka kube-proxy’lerini kurabilir.
|
||||
- **Sidecar container**: Sidecar container’lar, pod içindeki ana container ile birlikte çalışması gereken container’lardır. Bu sidecar pattern, mevcut container’ların işlevselliğini onları değiştirmeden genişletir ve iyileştirir. Günümüzde, application’ın her yerde çalışması için gereken tüm dependencies’i sarmalamak amacıyla container technology kullandığımızı biliyoruz. Bir container yalnızca bir şey yapar ve onu çok iyi yapar.
|
||||
- **Node**: pod veya pod’lar içeren operating system.
|
||||
- **Pod**: Bir container veya birden fazla container etrafındaki sarmalayıcı. Bir pod yalnızca bir application içermelidir (bu yüzden genelde bir pod sadece 1 container çalıştırır). Pod, kubernetes’in çalışan container teknolojisini soyutlama yöntemidir.
|
||||
- **Service**: Her pod, node’un internal aralığından 1 internal **IP address** alır. Ancak bir service üzerinden de expose edilebilir. **Service’in de bir IP address’i vardır** ve amacı pod’lar arasındaki iletişimi sürdürmektir; böylece biri ölürse, **yeni replacement** (farklı bir internal IP ile) **aynı service IP’si** üzerinden erişilebilir olur. Internal veya external olarak yapılandırılabilir. Service ayrıca **2 pod aynı service’e bağlı olduğunda load balancer** gibi davranır.\
|
||||
Bir **service** **oluşturulduğunda** çalışan her service’in endpoint’lerini `kubectl get endpoints` ile bulabilirsiniz
|
||||
- **Kubelet**: Primary node agent. Node ile kubectl arasında iletişimi kuran bileşen ve sadece pod çalıştırabilir (API server üzerinden). Kubelet, Kubernetes tarafından oluşturulmamış container’ları yönetmez.
|
||||
- **Kube-proxy**: apiserver ile node arasındaki iletişimden (services) sorumlu hizmettir. Temeli node’lar için bir IPtables’tır. Deneyimli kullanıcılar diğer vendor’ların başka kube-proxy’lerini kurabilir.
|
||||
- **Sidecar container**: Sidecar container’lar, pod içindeki main container ile birlikte çalışması gereken container’lardır. Bu sidecar pattern, mevcut container’ların işlevselliğini değiştirmeden genişletir ve artırır. Günümüzde, application’ın her yerde çalışması için tüm dependencies’i sarmalamak üzere container teknolojisini kullandığımızı biliyoruz. Bir container yalnızca bir şey yapar ve onu çok iyi yapar.
|
||||
- **Master process:**
|
||||
- **Api Server:** Kullanıcıların ve pod’ların master process ile iletişim kurmak için kullandığı yoldur. Yalnızca authenticated request’lere izin verilmelidir.
|
||||
- **Scheduler**: Scheduling, Pod’ların Kubelet’in onları çalıştırabilmesi için Nodes ile eşleştirilmesini sağlama sürecidir. Yeni pod’u hangi node’un daha fazla available resource’a sahip olduğuna karar verecek kadar akıllıdır ve ona atar. Unutma, scheduler yeni pod’ları başlatmaz; yalnızca node içinde çalışan Kubelet process’i ile iletişim kurar, bu process yeni pod’u başlatır.
|
||||
- **Kube Controller manager**: Replica set’ler veya deployments gibi resources’ları kontrol ederek, örneğin doğru sayıda pod veya node çalışıyor mu diye bakar. Bir pod eksikse, yenisini başlatmak için scheduler ile iletişim kurar. Replication, token’lar ve account services’i API’ye karşı kontrol eder.
|
||||
- **etcd**: Data storage, persistent, consistent ve distributed. Kubernetes’in database’i ve cluster’ların tam durumunu tuttuğu key-value storage’tır (her değişiklik burada loglanır). Scheduler veya Controller manager gibi bileşenler, hangi değişikliklerin meydana geldiğini bilmek için bu date’e bağlıdır (node’ların available resourced’ları, çalışan pod sayısı...)
|
||||
- **Cloud controller manager**: AWS veya OpenStack’te cluster’ların olması gibi flow controls ve applications için özel controller’dır.
|
||||
- **Api Server:** Kullanıcıların ve pod’ların master process ile iletişim kurmak için kullandığı yoldur. Sadece authenticated request’lere izin verilmelidir.
|
||||
- **Scheduler**: Scheduling, Pod’ların Kubelet’in onları çalıştırabilmesi için Node’larla eşleştirilmesini sağlama sürecidir. Yeni pod’u hangi node’un daha fazla kullanılabilir resource’a sahip olduğuna karar verecek kadar zekidir. Scheduler’ın yeni pod’ları başlatmadığını, sadece node içinde çalışan Kubelet process’i ile iletişim kurduğunu, ve onun yeni pod’u başlatacağını unutmayın.
|
||||
- **Kube Controller manager**: Örneğin doğru sayıda pod veya node’un çalışıp çalışmadığını kontrol etmek için replica sets veya deployments gibi resources’u denetler. Bir pod eksikse, yeni bir tane başlatmak için scheduler ile iletişim kurar. Replication, token’lar ve account services’i API’ye karşı kontrol eder.
|
||||
- **etcd**: Data storage, persistent, consistent ve distributed. Kubernetes’in database’idir ve cluster’ların tam durumunu tuttuğu key-value storage’dır (her değişiklik burada kaydedilir). Scheduler veya Controller manager gibi bileşenler, hangi değişikliklerin meydana geldiğini bilmek için bu date’e bağlıdır (node’ların available resourced’ları, çalışan pod sayısı...)
|
||||
- **Cloud controller manager**: Flow controls ve applications için özel controller’dır; örneğin AWS veya OpenStack üzerinde cluster’larınız varsa.
|
||||
|
||||
Birden fazla node (birden fazla pod çalıştıran) olabileceği gibi, Api server’a erişimleri load balanced ve etcd’leri synchronized olan birden fazla master process de olabilir.
|
||||
Birden fazla node (birden fazla pod çalıştıran) olabileceği gibi, Api server’a load balanced erişimi olan ve etcd’si synchronized birçok master process de olabilir.
|
||||
|
||||
**Volumes:**
|
||||
|
||||
Bir pod, kaybolduğunda kaybolmaması gereken data oluşturduğunda, bunun fiziksel bir volume’da saklanması gerekir. **Kubernetes, data’yı kalıcı tutmak için bir volume’un pod’a attach edilmesine izin verir**. Volume local makinede veya bir **remote storage** üzerinde olabilir. Farklı fiziksel node’larda çalışan pod’lar varsa, hepsinin erişebilmesi için remote storage kullanmalısın.
|
||||
Bir pod, pod kaybolduğunda kaybedilmemesi gereken data oluşturduğunda bunun fiziksel bir volume’da saklanması gerekir. **Kubernetes, data’yı kalıcı tutmak için bir volume’u pod’a attach etmeye izin verir**. Volume yerel makinede veya bir **remote storage** üzerinde olabilir. Farklı physical node’larda pod’lar çalıştırıyorsanız, hepsinin erişebilmesi için remote storage kullanmalısınız.
|
||||
|
||||
Kubernetes recent versions içinde **image volumes** da destekler. Bir `image` volume, OCI image veya artifact’i Pod içinde **read-only** bir filesystem kaynağı olarak mount eder; bunun için `volumes[].image.reference` ve `volumes[].image.pullPolicy` gibi alanlar kullanılır. kubelet, container image’ları için kullanılan aynı credential kaynaklarıyla artifact’i çeker; buna node credentials, Pod `imagePullSecrets` ve ServiceAccount `imagePullSecrets` dahildir. Bir security review sırasında image volumes’e runtime inputs ve supply-chain dependencies olarak bakın: reference’ın digest ile pinlenip pinlenmediğini, hangi registry credentials’ın onu çekebildiğini, nereye mount edildiğini ve `subPath`’in görünür directory’yi kısıtlayıp kısıtlamadığını kontrol edin.
|
||||
|
||||
**Other configurations:**
|
||||
|
||||
- **ConfigMap**: Servislere erişmek için **URLs** yapılandırabilirsin. Pod, diğer services (pods) ile nasıl iletişim kuracağını bilmek için buradan data alır. Bunun credentials saklamak için önerilen yer olmadığını unutma!
|
||||
- **Secret**: Bu, passwords, API keys... gibi **secret data**’yı B64 ile encoded olarak **saklamak** için kullanılan yerdir. Pod, gerekli credentials’ı kullanmak için bu data’ya erişebilir.
|
||||
- **Deployments**: kubernetes tarafından çalıştırılacak components burada belirtilir. Bir user genelde doğrudan pod’larla çalışmaz; pod’lar, deployments üzerinden çalıştırılan **ReplicaSets** (aynı pod’lardan çoğaltılmış sayı) içinde soyutlanır. Deployments’in **stateless** applications için olduğunu unutma. Bir deployment için minimum configuration, name ve çalıştırılacak image’dır.
|
||||
- **StatefulSet**: Bu component özellikle **databases** gibi **aynı storage’a erişmesi** gereken application’lar için tasarlanmıştır.
|
||||
- **Ingress**: Uygulamayı public olarak **bir URL ile expose etmek** için kullanılan configuration budur. Bunun external services kullanılarak da yapılabileceğini unutma, ancak application’ı expose etmenin doğru yolu budur.
|
||||
- Bir Ingress uygularsan **Ingress Controllers** oluşturman gerekir. Ingress Controller, request’leri alacak ve kontrol edip onları services’e load balance edecek **bir pod**’dur. ingress controller, request’i **yapılandırılmış ingress rules’a göre gönderir**. Ingress rules’un farklı paths’e veya hatta subdomain’lere farklı internal kubernetes services’e işaret edebileceğini unutma.
|
||||
- Daha iyi bir security practice, Kubernetes cluster’ın hiçbir parçasını exposed etmemek için giriş noktası olarak bir cloud load balancer veya proxy server kullanmaktır.
|
||||
- Hiçbir ingress rule ile eşleşmeyen bir request alındığında, ingress controller onu "**Default backend**"e yönlendirir. Bu parametrenin address’ini almak için ingress controller’ı `describe` edebilirsin.
|
||||
- **ConfigMap**: services’e erişmek için **URLs** yapılandırabilirsiniz. Pod, diğer services (pods) ile nasıl iletişim kuracağını bilmek için veriyi buradan alır. Credentials saklamak için burası önerilen yer değildir!
|
||||
- **Secret**: password, API keys... gibi **secret data** saklamak için yerdir; B64 ile encoded edilir. Pod, gerekli credentials’ı kullanmak için bu data’ya erişebilir.
|
||||
- **Deployments**: kubernetes tarafından çalıştırılacak bileşenlerin belirtildiği yerdir. Bir kullanıcı genelde doğrudan pod’larla çalışmaz; pod’lar **ReplicaSets** içinde soyutlanır (aynı pod’ların replike edilmiş sayısı), ve bunlar deployments aracılığıyla çalıştırılır. Deployments’in **stateless** application’lar için olduğunu unutmayın. Bir deployment için minimum yapılandırma name ve çalıştırılacak image’dır.
|
||||
- **StatefulSet**: Bu bileşen özellikle **databases** gibi **aynı storage’a erişmesi** gereken application’lar için tasarlanmıştır.
|
||||
- **Ingress**: application’ı bir **URL** ile public olarak **expose etmek** için kullanılan yapılandırmadır. Bunun external services kullanılarak da yapılabileceğini unutmayın, ancak application’ı expose etmenin doğru yolu budur.
|
||||
- Bir Ingress uygularsanız **Ingress Controllers** oluşturmanız gerekir. Ingress Controller, request’leri alacak ve kontrol edecek endpoint olan bir **pod**’dur ve onları services’e load balance eder. ingress controller, **configure edilmiş ingress rules’a göre request’i gönderecektir**. ingress rules’un farklı internal kubernetes services’lere farklı paths veya hatta subdomains gösterebileceğini unutmayın.
|
||||
- Daha iyi bir security practice, Kubernetes cluster’ının herhangi bir kısmını expose etmemek için giriş noktası olarak bir cloud load balancer veya proxy server kullanmaktır.
|
||||
- Herhangi bir ingress rule ile eşleşmeyen bir request alındığında, ingress controller bunu "**Default backend**"e yönlendirecektir. Bu parametrenin address’ini almak için ingress controller’ı `describe` edebilirsiniz.
|
||||
- `minikube addons enable ingress`
|
||||
|
||||
### PKI infrastructure - Certificate Authority CA:
|
||||
@@ -56,7 +58,7 @@ Bir pod, kaybolduğunda kaybolmaması gereken data oluşturduğunda, bunun fizik
|
||||

|
||||
|
||||
- CA, cluster içindeki tüm certificates için trusted root’tur.
|
||||
- Bileşenlerin birbirini validate etmesine izin verir.
|
||||
- Bileşenlerin birbirini doğrulamasına izin verir.
|
||||
- Tüm cluster certificates CA tarafından imzalanır.
|
||||
- ETCd’nin kendi certificate’i vardır.
|
||||
- types:
|
||||
@@ -68,7 +70,7 @@ Bir pod, kaybolduğunda kaybolmaması gereken data oluşturduğunda, bunun fizik
|
||||
|
||||
### Minikube
|
||||
|
||||
**Minikube**, tüm bir kubernetes environment deploy etmeye gerek kalmadan kubernetes üzerinde bazı **quick tests** yapmak için kullanılabilir. **Master ve node process’lerini tek bir makinede** çalıştırır. Minikube, node’u çalıştırmak için virtualbox kullanır. Bunu nasıl kuracağını **buradan** gör: [**here how to install it**](https://minikube.sigs.k8s.io/docs/start/).
|
||||
**Minikube**, tam bir kubernetes environment deploy etmeye gerek kalmadan kubernetes üzerinde bazı **quick tests** yapmak için kullanılabilir. **master ve node process’lerini tek bir makinede** çalıştırır. Minikube, node’u çalıştırmak için virtualbox kullanır. Kurulum için [**buraya bakın**](https://minikube.sigs.k8s.io/docs/start/).
|
||||
```
|
||||
$ minikube start
|
||||
😄 minikube v1.19.0 on Ubuntu 20.04
|
||||
@@ -103,9 +105,9 @@ $ minikube delete
|
||||
🔥 Deleting "minikube" in virtualbox ...
|
||||
💀 Removed all traces of the "minikube" cluster
|
||||
```
|
||||
### Kubectl Temelleri
|
||||
### Kubectl Basics
|
||||
|
||||
**`Kubectl`** kubernetes cluster’ları için command line aracıdır. kubernetes içinde işlemler gerçekleştirmek veya veri istemek için master process’in Api server’ı ile iletişim kurar.
|
||||
**`Kubectl`** kubernetes clusterları için komut satırı aracıdır. Kubernetes içinde işlemler gerçekleştirmek veya veri istemek için master process'in Api server'ı ile iletişim kurar.
|
||||
```bash
|
||||
kubectl version #Get client and server version
|
||||
kubectl get pod
|
||||
@@ -138,7 +140,7 @@ kubectl apply -f deployment.yml
|
||||
```
|
||||
### Minikube Dashboard
|
||||
|
||||
Dashboard, minikube içinde nelerin çalıştığını daha kolay görmenizi sağlar; erişmek için URL'yi şurada bulabilirsiniz:
|
||||
Dashboard, minikube içinde neyin çalıştığını daha kolay görmenizi sağlar, erişim URL’sini şurada bulabilirsiniz:
|
||||
```
|
||||
minikube dashboard --url
|
||||
|
||||
@@ -153,12 +155,12 @@ http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kube
|
||||
```
|
||||
### YAML configuration files examples
|
||||
|
||||
Her configuration file 3 parçadan oluşur: **metadata**, **specification** (ne başlatılması gerektiği), **status** (istenen durum).\
|
||||
Her configuration file 3 bölümden oluşur: **metadata**, **specification** (ne başlatılması gerektiği), **status** (desired state).\
|
||||
deployment configuration file içindeki specification bölümünde, çalıştırılacak image’i tanımlayan yeni bir configuration structure ile tanımlanmış template’i bulabilirsiniz:
|
||||
|
||||
**Aynı configuration file içinde declared edilmiş Deployment + Service örneği (** [**burada**](https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/demo-kubernetes-components/mongo.yaml)**)**
|
||||
**Same configuration file içinde declared edilmiş Deployment + Service örneği (**[**here**](https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/demo-kubernetes-components/mongo.yaml)**)**
|
||||
|
||||
Bir service genellikle bir deployment ile ilişkili olduğundan, ikisini aynı configuration file içinde declare etmek mümkündür (bu config içinde declared edilen service yalnızca internally erişilebilir):
|
||||
Bir service genellikle bir deployment ile ilişkili olduğundan, ikisini de aynı configuration file içinde declare etmek mümkündür (bu config içinde declared edilen service yalnızca internal olarak erişilebilir):
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
@@ -205,9 +207,9 @@ ports:
|
||||
port: 27017
|
||||
targetPort: 27017
|
||||
```
|
||||
**Dış servis config örneği**
|
||||
**Harici servis config örneği**
|
||||
|
||||
Bu service dışarıdan erişilebilir olacak (`nodePort` ve `type: LoadBlancer` attribute'larını kontrol edin):
|
||||
Bu servis dışarıdan erişilebilir olacak (`nodePort` ve `type: LoadBlancer` attributes kontrol edin):
|
||||
```yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
@@ -225,11 +227,11 @@ targetPort: 8081
|
||||
nodePort: 30000
|
||||
```
|
||||
> [!NOTE]
|
||||
> Bu test için faydalıdır ancak production için yalnızca internal services ve uygulamayı expose etmek için bir Ingress olmalıdır.
|
||||
> Bu, testing için kullanışlıdır; ancak production için yalnızca internal services ve application'ı expose etmek için bir Ingress olmalıdır.
|
||||
|
||||
**Example of Ingress config file**
|
||||
|
||||
Bu, uygulamayı `http://dashboard.com` adresinde expose edecektir.
|
||||
Bu, application'ı `http://dashboard.com` adresinde expose edecektir.
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
@@ -247,7 +249,7 @@ servicePort: 80
|
||||
```
|
||||
**Secrets config file örneği**
|
||||
|
||||
Parolaların B64 içinde kodlandığına dikkat edin (bu güvenli değildir!)
|
||||
Parolaların B64 ile kodlandığına dikkat edin (bu güvenli değildir!)
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
@@ -258,9 +260,9 @@ data:
|
||||
mongo-root-username: dXNlcm5hbWU=
|
||||
mongo-root-password: cGFzc3dvcmQ=
|
||||
```
|
||||
**ConfigMap örneği**
|
||||
**ConfigMap Örneği**
|
||||
|
||||
Bir **ConfigMap**, pod’lara verilen ve onların diğer servisleri nasıl bulup erişeceklerini bilmelerini sağlayan konfigürasyondur. Bu durumda, her pod `mongodb-service` adının, iletişim kurabilecekleri bir pod’un adresi olduğunu bilecektir (bu pod bir mongodb çalıştıracaktır):
|
||||
Bir **ConfigMap**, pod’lara verilen yapılandırmadır; böylece diğer services’leri nasıl bulup erişeceklerini bilirler. Bu durumda, her pod `mongodb-service` adının, iletişim kurabilecekleri bir pod’un adresi olduğunu bilecektir (bu pod bir mongodb çalıştırıyor olacaktır):
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
@@ -269,7 +271,7 @@ name: mongodb-configmap
|
||||
data:
|
||||
database_url: mongodb-service
|
||||
```
|
||||
Ardından, bir **deployment config** içinde bu adres aşağıdaki şekilde belirtilebilir, böylece pod'un env içine yüklenir:
|
||||
Daha sonra, bir **deployment config** içinde bu adres aşağıdaki şekilde belirtilebilir; böylece pod’un env içine yüklenir:
|
||||
```yaml
|
||||
[...]
|
||||
spec:
|
||||
@@ -292,14 +294,14 @@ key: database_url
|
||||
```
|
||||
**Volume config örneği**
|
||||
|
||||
[https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes) adresinde farklı storage configuration yaml dosyası örnekleri bulabilirsiniz.\
|
||||
**Volumeların namespaces içinde olmadığını unutmayın**
|
||||
[https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes) adresinde farklı storage configuration yaml dosyalarının örneklerini bulabilirsiniz.\
|
||||
**Volumes'un namespaces içinde olmadığını unutmayın**
|
||||
|
||||
### Namespaces
|
||||
|
||||
Kubernetes, aynı physical cluster tarafından desteklenen **multiple virtual clusters**'ı destekler. Bu virtual cluster'lara **namespaces** denir. Bunlar, birden fazla team veya project arasında yayılmış çok sayıda user'ın olduğu ortamlarda kullanım için tasarlanmıştır. Birkaç ila onlarca user olan cluster'lar için, namespace oluşturmanız veya bunları düşünmeniz genellikle gerekmez. Namespace kullanmaya ancak kubernetes üzerinde deploy edilen application'ın her bir parçasının daha iyi kontrolü ve organization'ı için başlamalısınız.
|
||||
Kubernetes, aynı fiziksel cluster tarafından desteklenen **birden fazla virtual cluster**'ı destekler. Bu virtual cluster'lara **namespaces** denir. Bunlar, birden fazla takım ya da projeye yayılmış çok sayıda kullanıcının bulunduğu ortamlar için tasarlanmıştır. Az sayıda ile onlarca kullanıcıya sahip cluster'larda, namespaces oluşturmanız veya onlar hakkında düşünmeniz gerekmez. namespaces kullanmaya yalnızca kubernetes'te dağıtılan application'ın her bir parçası üzerinde daha iyi control ve organization sağlamak için başlamalısınız.
|
||||
|
||||
Namespaces, names için bir scope sağlar. Resource'ların names'i bir namespace içinde unique olmalıdır, ancak namespaces arasında olmak zorunda değildir. Namespaces birbirlerinin içine nested edilemez ve **her** Kubernetes **resource** yalnızca **bir** **namespace** içinde olabilir.
|
||||
Namespaces, isimler için bir scope sağlar. resource isimleri bir namespace içinde unique olmalıdır, ancak namespaces arasında olmak zorunda değildir. Namespaces birbirinin içine nested olamaz ve **her** Kubernetes **resource** yalnızca **bir** **namespace** içinde olabilir.
|
||||
|
||||
minikube kullanıyorsanız varsayılan olarak 4 namespace vardır:
|
||||
```
|
||||
@@ -310,39 +312,39 @@ kube-node-lease Active 1d
|
||||
kube-public Active 1d
|
||||
kube-system Active 1d
|
||||
```
|
||||
- **kube-system**: Kullanıcıların kullanması için değildir ve ona dokunmamalısınız. master ve kubectl süreçleri içindir.
|
||||
- **kube-public**: Herkese açık veri. Küme bilgilerini içeren bir configmap içerir
|
||||
- **kube-node-lease**: Bir node'un kullanılabilirliğini belirler
|
||||
- **kube-system**: Kullanıcıların kullanması amaçlanmamıştır ve ona dokunmamalısınız. Master ve kubectl süreçleri içindir.
|
||||
- **kube-public**: Herkese açık veri. Cluster bilgilerini içeren bir configmap içerir
|
||||
- **kube-node-lease**: Bir node’un kullanılabilirliğini belirler
|
||||
- **default**: Kullanıcının kaynak oluşturmak için kullanacağı namespace
|
||||
```bash
|
||||
#Create namespace
|
||||
kubectl create namespace my-namespace
|
||||
```
|
||||
> [!NOTE]
|
||||
> Kubernetes kaynaklarının çoğunun (örn. pods, services, replication controllers ve diğerleri) bazı namespaces içinde olduğunu unutmayın. Ancak namespace resources ve low-level resources gibi nodes ve persistenVolumes namespace içinde değildir. Hangi Kubernetes kaynaklarının namespace içinde olup olmadığını görmek için:
|
||||
> Kubernetes kaynaklarının çoğunun (örn. pods, services, replication controllers ve diğerleri) bazı namespaces içinde olduğunu unutmayın. Ancak, namespace resources ve nodes ile persistenVolumes gibi low-level resources bir namespace içinde değildir. Hangi Kubernetes kaynaklarının namespace içinde olup olmadığını görmek için:
|
||||
>
|
||||
> ```bash
|
||||
> kubectl api-resources --namespaced=true #In a namespace
|
||||
> kubectl api-resources --namespaced=false #Not in a namespace
|
||||
> ```
|
||||
|
||||
O context için sonraki tüm kubectl commands'lerde namespace'i kaydedebilirsiniz.
|
||||
O context içindeki sonraki tüm kubectl commands için namespace’i kaydedebilirsiniz.
|
||||
```bash
|
||||
kubectl config set-context --current --namespace=<insert-namespace-name-here>
|
||||
```
|
||||
### Helm
|
||||
|
||||
Helm, Kubernetes için bir **package manager**dır. YAML dosyalarını paketleyip bunları public ve private repository’lerde dağıtmanıza olanak tanır. Bu paketlere **Helm Charts** denir.
|
||||
Helm, Kubernetes için **package manager**'dır. YAML dosyalarını paketlemeyi ve bunları public ve private repository'lerde dağıtmayı sağlar. Bu paketlere **Helm Charts** denir.
|
||||
```
|
||||
helm search <keyword>
|
||||
```
|
||||
Helm ayrıca değişkenlerle config files üretmeye izin veren bir template engine’dir:
|
||||
Helm ayrıca değişkenlerle config dosyaları oluşturmayı sağlayan bir template engine’dir:
|
||||
|
||||
## Kubernetes secrets
|
||||
|
||||
Bir **Secret**, bir password, bir token veya bir key gibi **hassas data** içeren bir object’tir. Bu bilgi normalde bir Pod specification içinde veya bir image içinde de tutulabilir. Users, Secrets oluşturabilir ve sistem de Secrets oluşturur. Bir Secret object’in adı geçerli bir **DNS subdomain name** olmalıdır. Buradaki [official documentation](https://kubernetes.io/docs/concepts/configuration/secret/) kısmına bakın.
|
||||
A **Secret** is an object that **contains sensitive data** such as a password, a token or a key. Such information might otherwise be put in a Pod specification or in an image. Users can create Secrets and the system also creates Secrets. The name of a Secret object must be a valid **DNS subdomain name**. Read here [the official documentation](https://kubernetes.io/docs/concepts/configuration/secret/).
|
||||
|
||||
Secrets şunlar gibi şeyler olabilir:
|
||||
Secrets might be things like:
|
||||
|
||||
- API, SSH Keys.
|
||||
- OAuth tokens.
|
||||
@@ -350,7 +352,7 @@ Secrets şunlar gibi şeyler olabilir:
|
||||
- Information or comments.
|
||||
- Database connection code, strings… .
|
||||
|
||||
Kubernetes içinde farklı secret type’ları vardır
|
||||
Kubernetes içinde farklı secret türleri vardır
|
||||
|
||||
| Builtin Type | Usage |
|
||||
| ----------------------------------- | ----------------------------------------- |
|
||||
@@ -364,13 +366,13 @@ Kubernetes içinde farklı secret type’ları vardır
|
||||
| bootstrap.kubernetes.io/token | bootstrap token data |
|
||||
|
||||
> [!NOTE]
|
||||
> **Opaque type default olanıdır, users tarafından tanımlanan tipik key-value pair.**
|
||||
> **Opaque type varsayılan olandır, kullanıcılar tarafından tanımlanan tipik key-value pair.**
|
||||
|
||||
**Secrets nasıl çalışır:**
|
||||
|
||||

|
||||
|
||||
Aşağıdaki configuration file, `mysecret` adlı bir **secret** tanımlar; `username: YWRtaW4=` ve `password: MWYyZDFlMmU2N2Rm` olmak üzere 2 key-value pair içerir. Ayrıca `secretpod` adlı bir **pod** tanımlar; bu pod, `mysecret` içinde tanımlı `username` ve `password` değerlerini **environment variables** `SECRET_USERNAME` \_\_ ve \_\_ `SECRET_PASSWOR` olarak exposed edecektir. Ayrıca `mysecret` içindeki `username` secret’ını `/etc/foo/my-group/my-username` path’ine `0640` permissions ile **mount** edecektir.
|
||||
Aşağıdaki configuration file, `mysecret` adlı bir **secret** tanımlar; içinde `username: YWRtaW4=` ve `password: MWYyZDFlMmU2N2Rm` olmak üzere 2 key-value pair vardır. Ayrıca `secretpod` adlı bir **pod** tanımlar; bu pod içinde `mysecret` içinde tanımlı `username` ve `password`, **environment variables** `SECRET_USERNAME` \_\_ ve \_\_ `SECRET_PASSWOR` olarak exposed edilir. Ayrıca `mysecret` içindeki `username` secret’ını `/etc/foo/my-group/my-username` path’ine `0640` permissions ile **mount** eder.
|
||||
```yaml:secretpod.yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
@@ -420,19 +422,19 @@ kubectl get pods #Wait until the pod secretpod is running
|
||||
kubectl exec -it secretpod -- bash
|
||||
env | grep SECRET && cat /etc/foo/my-group/my-username && echo
|
||||
```
|
||||
### etcd içinde Secrets <a href="#discover-secrets-in-etcd" id="discover-secrets-in-etcd"></a>
|
||||
### etcd içindeki Secrets <a href="#discover-secrets-in-etcd" id="discover-secrets-in-etcd"></a>
|
||||
|
||||
**etcd**, Kubernetes’in tüm cluster verileri için arka plan deposu olarak kullanılan tutarlı ve yüksek erişilebilirlikli bir **key-value store**’dur. Şimdi etcd içinde depolanan secrets’lara erişelim:
|
||||
**etcd**, tüm cluster verileri için Kubernetes backing store olarak kullanılan tutarlı ve yüksek erişilebilirlikli bir **key-value store**’dur. Şimdi etcd içinde saklanan secrets’e erişelim:
|
||||
```bash
|
||||
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
|
||||
```
|
||||
FS içinde sertifikaları, anahtarları ve URL’leri göreceksiniz. Onları ele geçirdiğinizde, etcd’ye bağlanabileceksiniz.
|
||||
FS'de sertifikalar, keys ve url’lerin nerede olduğunu göreceksiniz. Onları elde ettiğinizde, etcd'ye bağlanabilirsiniz.
|
||||
```bash
|
||||
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] health
|
||||
|
||||
ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] health
|
||||
```
|
||||
İletişimi kurmayı başardığınızda, secrets'e erişebileceksiniz:
|
||||
İletişimi kurmayı başardığınızda, secrets’ları elde edebileceksiniz:
|
||||
```bash
|
||||
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] get <path/to/secret>
|
||||
|
||||
@@ -440,7 +442,7 @@ ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key
|
||||
```
|
||||
**ETCD'ye encryption ekleme**
|
||||
|
||||
Varsayılan olarak tüm secrets, bir encryption katmanı uygulamazsanız etcd içinde düz metin olarak **stored in plain** şekilde saklanır. Aşağıdaki örnek [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) temel alınmıştır.
|
||||
Varsayılan olarak tüm secrets, bir encryption layer uygulamadığınız sürece etcd içinde düz text olarak **stored in plain** tutulur. Aşağıdaki örnek [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) temel alınmıştır.
|
||||
```yaml:encryption.yaml
|
||||
apiVersion: apiserver.config.k8s.io/v1
|
||||
kind: EncryptionConfiguration
|
||||
@@ -454,7 +456,7 @@ keys:
|
||||
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
|
||||
- identity: {}
|
||||
```
|
||||
Bundan sonra, oluşturulan config dosyasının konumunu gösterecek şekilde `kube-apiserver` üzerinde `--encryption-provider-config` flag'ini ayarlamanız gerekir. `/etc/kubernetes/manifest/kube-apiserver.yaml` dosyasını düzenleyip aşağıdaki satırları ekleyebilirsiniz:
|
||||
Bundan sonra, `kube-apiserver` üzerinde `--encryption-provider-config` bayrağını oluşturulan config dosyasının konumunu gösterecek şekilde ayarlamanız gerekir. `/etc/kubernetes/manifest/kube-apiserver.yaml` dosyasını değiştirebilir ve aşağıdaki satırları ekleyebilirsiniz:
|
||||
```yaml
|
||||
containers:
|
||||
- command:
|
||||
@@ -467,7 +469,7 @@ volumeMounts içinde aşağı kaydırın:
|
||||
name: etcd
|
||||
readOnly: true
|
||||
```
|
||||
volumeMounts içinde hostPath kısmına kadar aşağı kaydırın:
|
||||
volumeMounts içinde hostPath: kısmına aşağı kaydırın:
|
||||
```yaml
|
||||
- hostPath:
|
||||
path: /etc/kubernetes/etcd
|
||||
@@ -476,7 +478,7 @@ name: etcd
|
||||
```
|
||||
**Verifying that data is encrypted**
|
||||
|
||||
Data, etcd içine yazıldığında encrypted olur. `kube-apiserver` yeniden başlatıldıktan sonra, newly created veya updated olan herhangi bir secret, stored edildiğinde encrypted olmalıdır. Bunu kontrol etmek için, secret içeriğini retrieve etmek için `etcdctl` command line programını kullanabilirsiniz.
|
||||
Veri, etcd'ye yazıldığında şifrelenir. `kube-apiserver` yeniden başlatıldıktan sonra, yeni oluşturulan veya güncellenen herhangi bir secret depolanırken şifrelenmiş olmalıdır. Kontrol etmek için, secret içeriğini almak üzere `etcdctl` command line programını kullanabilirsiniz.
|
||||
|
||||
1. `default` namespace içinde `secret1` adlı yeni bir secret oluşturun:
|
||||
|
||||
@@ -484,20 +486,20 @@ Data, etcd içine yazıldığında encrypted olur. `kube-apiserver` yeniden baş
|
||||
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
|
||||
```
|
||||
|
||||
2. etcdctl commandline kullanarak, o secret’ı etcd’den okuyun:
|
||||
2. etcdctl commandline kullanarak, bu secret'ı etcd'den okuyun:
|
||||
|
||||
`ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C`
|
||||
|
||||
burada `[...]`, etcd server’a bağlanmak için ek arguments olmalıdır.
|
||||
burada `[...]`, etcd server'a bağlanmak için gerekli ek arguments olmalıdır.
|
||||
|
||||
3. Stored secret’ın `k8s:enc:aescbc:v1:` ile prefix’li olduğunu verify edin; bu, `aescbc` provider’ın resulting data’yı encrypt ettiğini gösterir.
|
||||
4. Secret’ın API üzerinden retrieve edildiğinde doğru şekilde decrypted olduğunu verify edin:
|
||||
3. Stored secret'ın `k8s:enc:aescbc:v1:` ile başladığını doğrulayın; bu, `aescbc` provider'ın resulting data'yı encrypted ettiğini gösterir.
|
||||
4. API üzerinden retrieve edildiğinde secret'ın doğru şekilde decrypted edildiğini doğrulayın:
|
||||
|
||||
```
|
||||
kubectl describe secret secret1 -n default
|
||||
```
|
||||
|
||||
`mykey: bXlkYXRh` ile match etmelidir; `mydata` encoded edilmiştir, secret’ı tamamen decode etmek için [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) kısmına bakın.
|
||||
`mykey: bXlkYXRh` ile eşleşmelidir, mydata encoded edilmiştir; secret'ı tamamen decode etmek için [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) bölümüne bakın.
|
||||
|
||||
**Since secrets are encrypted on write, performing an update on a secret will encrypt that content:**
|
||||
```
|
||||
@@ -505,8 +507,8 @@ kubectl get secrets --all-namespaces -o json | kubectl replace -f -
|
||||
```
|
||||
**Son ipuçları:**
|
||||
|
||||
- Gizli bilgileri FS içinde tutmamaya çalışın, bunları başka yerlerden alın.
|
||||
- Gizli bilgilerinize daha fazla koruma eklemek için [https://www.vaultproject.io/](https://www.vaultproject.io) sitesine bakın.
|
||||
- FS'de secrets tutmamaya çalışın, onları başka yerlerden alın.
|
||||
- Secrets'inize daha fazla koruma eklemek için [https://www.vaultproject.io/](https://www.vaultproject.io) adresine göz atın.
|
||||
- [https://kubernetes.io/docs/concepts/configuration/secret/#risks](https://kubernetes.io/docs/concepts/configuration/secret/#risks)
|
||||
- [https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm](https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm)
|
||||
|
||||
@@ -520,4 +522,12 @@ https://sickrov.github.io/
|
||||
https://www.youtube.com/watch?v=X48VuDVv0do
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://kubernetes.io/docs/concepts/storage/volumes/#image
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
https://kubernetes.io/docs/tasks/configure-pod-container/image-volumes/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
+38
-32
@@ -6,31 +6,31 @@
|
||||
|
||||
[**Dokümanlardan:**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)
|
||||
|
||||
Bir Pod'un security context'ini belirtirken birkaç attribute kullanabilirsiniz. Defensive security açısından şunları dikkate almalısınız:
|
||||
Bir Pod'un security context'ini belirtirken birkaç öznitelik kullanabilirsiniz. Savunmacı güvenlik açısından şunları dikkate almalısınız:
|
||||
|
||||
- **runASNonRoot** değerini **True** yapmak
|
||||
- **runAsUser** yapılandırmak
|
||||
- Mümkünse, **seLinuxOptions** ve **seccompProfile** belirterek izinleri **kısıtlamayı** düşünün
|
||||
- **runAsGroup** ve **supplementaryGroups** üzerinden **privilege** **group** erişimi VERMEYİN
|
||||
- **runAsGroup** ve **supplementaryGroups** aracılığıyla **privilege** **group** erişimi vermeyin
|
||||
|
||||
| Parameter | Description |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>integer</em></p> | <p>Tüm pod içindeki tüm container'lara uygulanan özel bir supplemental group. Bazı volume türleri, Kubelet'in o volume'un sahipliğini pod'a ait olacak şekilde <strong>değiştirmesine</strong> izin verir:<br>1. Sahip olan GID, FSGroup olacaktır<br>2. setgid biti ayarlanır (volume içinde oluşturulan yeni dosyalar FSGroup'a ait olur)<br>3. Permission bitleri rw-rw---- ile OR'lanır. Eğer unset ise, Kubelet herhangi bir volume'un sahipliğini ve permission'larını değiştirmez</p> |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>integer</em></p> | <p>Bir pod içindeki <strong>tüm containers</strong> için geçerli olan özel bir ek group. Bazı volume türleri, Kubelet'in o volume'ün <strong>sahipliğini pod'a ait olacak şekilde değiştirmesine</strong> izin verir:<br>1. Sahip GID, FSGroup olacaktır<br>2. setgid biti ayarlanır (volume içinde oluşturulan yeni dosyalar FSGroup'a ait olur)<br>3. İzin bitleri rw-rw---- ile OR'lanır. Ayarlanmazsa, Kubelet herhangi bir volume'ün sahipliğini ve izinlerini değiştirmez</p> |
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>string</em></p> | Bu, Pod içinde açığa çıkarılmadan önce volume'un sahipliğini ve permission'larını **değiştirmenin** davranışını tanımlar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için kullanılan **GID**. Ayarlanmamışsa runtime default kullanılır. SecurityContext içinde de ayarlanabilir. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Container'ın non-root user olarak çalışması gerektiğini belirtir. True ise, Kubelet image'ı runtime'da UID 0 (root) olarak çalışmadığını doğrular ve çalışıyorsa container'ın başlamasını engeller. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için kullanılan **UID**. Belirtilmezse image metadata'sında belirtilen user varsayılan olur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | Tüm container'lara uygulanacak **SELinux context**. Belirtilmezse, container runtime her container için rastgele bir SELinux context tahsis eder. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>More info about</em> <em><strong>Seccomp</strong></em></p> | Bu pod içindeki container'lar tarafından kullanılacak **seccomp options**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>integer array</em></p> | Container'ın primary GID'sine ek olarak, her container'da çalışan ilk process'e uygulanan **groups** listesi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>string</em></p> | Bu, Pod içinde açığa çıkarılmadan önce **volume'ün sahipliğini ve izinlerini değiştirme** davranışını tanımlar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için **GID**. Ayarlanmazsa runtime varsayılanını kullanır. SecurityContext içinde de ayarlanabilir. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Container'ın root olmayan bir user olarak çalışması gerektiğini belirtir. True ise, Kubelet image'ı çalışma anında doğrulayarak UID 0 (root) olarak çalışmadığından emin olur ve böyleyse container'ın başlatılmasını başarısız kılar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için **UID**. Belirtilmezse, image metadata'sında tanımlı user varsayılan olur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | Tüm containers'a uygulanacak **SELinux context'i**. Belirtilmezse, container runtime her container için rastgele bir SELinux context'i atar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>More info about</em> <em><strong>Seccomp</strong></em></p> | Bu pod'daki containers tarafından kullanılacak **seccomp seçenekleri**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>integer array</em></p> | Container'ın birincil GID'sine ek olarak, her container'da çalışan ilk process'e uygulanan **groups** listesi. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>sysctls</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#sysctl-v1-core"><em>Sysctl</em></a> <em>array</em><br><em>More info about</em> <a href="https://www.garron.me/en/go2linux/sysctl-linux.html"><em><strong>sysctls</strong></em></a></p> | Sysctls, pod için kullanılan **namespaced sysctls** listesini tutar. Desteklenmeyen sysctls'e (container runtime tarafından) sahip pod'lar başlatılamayabilir. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Tüm container'lara uygulanan Windows'a özgü ayarlar. Belirtilmezse, container'ın SecurityContext içindeki options kullanılacaktır. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Tüm containers'a uygulanan Windows'a özgü ayarlar. Belirtilmezse, container'ın SecurityContext içindeki seçenekler kullanılır. |
|
||||
|
||||
## SecurityContext
|
||||
|
||||
[**Dokümanlardan:**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)
|
||||
|
||||
Bu context, **containers definitions** içinde ayarlanır. Defensive security açısından şunları dikkate almalısınız:
|
||||
Bu context, **container tanımları** içine ayarlanır. Savunmacı güvenlik açısından şunları dikkate almalısınız:
|
||||
|
||||
- **allowPrivilegeEscalation** değerini **False** yapmak
|
||||
- Hassas **capabilities** eklemeyin (ve ihtiyaç duymadıklarınızı kaldırın)
|
||||
@@ -38,47 +38,53 @@ Bu context, **containers definitions** içinde ayarlanır. Defensive security a
|
||||
- Mümkünse, **readOnlyFilesystem** değerini **True** yapın
|
||||
- **runAsNonRoot** değerini **True** yapın ve bir **runAsUser** ayarlayın
|
||||
- Mümkünse, **seLinuxOptions** ve **seccompProfile** belirterek izinleri **kısıtlamayı** düşünün
|
||||
- **runAsGroup** üzerinden **privilege** **group** erişimi VERMEYİN.
|
||||
- **runAsGroup** aracılığıyla **privilege** **group** erişimi vermeyin.
|
||||
|
||||
Hem **SecurityContext** hem de **PodSecurityContext** içinde ayarlanmış attribute'larda, **SecurityContext** içinde belirtilen değer **önceliklidir**.
|
||||
Hem **SecurityContext** hem de **PodSecurityContext** içinde ayarlanan özniteliklerde, **SecurityContext** içinde belirtilen değer **önceliklidir**.
|
||||
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>boolean</em></p> | **AllowPrivilegeEscalation**, bir process'in parent process'inden daha fazla **privilege kazanıp kazanamayacağını** kontrol eder. Bu bool, no_new_privs flag'inin container process'ine set edilip edilmeyeceğini doğrudan kontrol eder. Container **Privileged** olarak çalışıyorsa veya **CAP_SYS_ADMIN** varsa AllowPrivilegeEscalation her zaman true olur |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>boolean</em></p> | **AllowPrivilegeEscalation**, bir process'in üst process'inden daha fazla **privilege kazanıp kazanamayacağını** kontrol eder. Bu bool, no_new_privs flag'inin container process'ine ayarlanıp ayarlanmayacağını doğrudan kontrol eder. Container **Privileged** olarak çalıştırıldığında veya **CAP_SYS_ADMIN** sahibi olduğunda AllowPrivilegeEscalation her zaman true'dur |
|
||||
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>More info about</em> <em><strong>Capabilities</strong></em></p> | Container'ları çalıştırırken eklenecek/kaldırılacak **capabilities**. Varsayılan capabilities setini kullanır. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>boolean</em></p> | Container'ı privileged modunda çalıştırır. Privileged container'lardaki process'ler esasen host üzerindeki root'a **eşdeğerdir**. Varsayılan false'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>string</em></p> | procMount, container'lar için kullanılacak **proc mount türünü** belirtir. Varsayılan, readonly path'ler ve masked path'ler için container runtime default'larını kullanan DefaultProcMount'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>boolean</em></p> | Bu **container'ın read-only root filesystem'e** sahip olup olmadığı. Varsayılan false'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için kullanılan **GID**. Ayarlanmamışsa runtime default kullanılır. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Container'ın non-root user olarak **çalışması** gerektiğini belirtir. True ise, Kubelet image'ı runtime'da UID 0 (root) olarak çalışmadığını doğrular ve çalışıyorsa container'ın başlamasını engeller. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için kullanılan **UID**. Belirtilmezse image metadata'sında belirtilen user varsayılan olur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | Container'a uygulanacak **SELinux context**. Belirtilmezse, container runtime her container için rastgele bir SELinux context tahsis eder. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p> | Bu container tarafından kullanılacak **seccomp options**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Tüm container'lara uygulanan **Windows'a özgü ayarlar**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>More info about</em> <em><strong>Capabilities</strong></em></p> | Container çalıştırılırken eklenecek/kaldırılacak **capabilities**. Varsayılan capabilities seti kullanılır. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>boolean</em></p> | Container'ı privileged mode'da çalıştırır. Privileged container'lardaki process'ler esasen host üzerindeki **root ile eşdeğerdir**. Varsayılan false'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>string</em></p> | procMount, container'lar için kullanılacak **proc mount türünü** belirtir. Varsayılan, salt okunur path'ler ve maskelenmiş path'ler için container runtime varsayılanlarını kullanan DefaultProcMount'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>boolean</em></p> | Bu **container'ın salt okunur root filesystem'e** sahip olup olmadığı. Varsayılan false'tur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için **GID**. Ayarlanmazsa runtime varsayılanını kullanır. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p> | Container'ın root olmayan bir user olarak **çalışması** gerektiğini belirtir. True ise, Kubelet image'ı çalışma anında doğrulayarak UID 0 (root) olarak çalışmadığından emin olur ve böyleyse container'ın başlatılmasını başarısız kılar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p> | Container process'inin entrypoint'ini çalıştırmak için **UID**. Belirtilmezse, image metadata'sında tanımlı user varsayılan olur. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>More info about</em> <em><strong>seLinux</strong></em></p> | Container'a uygulanacak **SELinux context'i**. Belirtilmezse, container runtime her container için rastgele bir SELinux context'i atar. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p> | Bu container tarafından kullanılacak **seccomp seçenekleri**. |
|
||||
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p> | Tüm containers'a uygulanan **Windows'a özgü ayarlar**. |
|
||||
|
||||
## Practical workload review checklist
|
||||
|
||||
Bir Pod veya workload template'i incelerken, `spec.securityContext` ile birlikte `containers`, `initContainers` ve `ephemeralContainers` altındaki her container-level `securityContext` öğesini de kontrol edin. Container-level field'lar pod-level varsayılanları geçersiz kılabilir; bu yüzden güvenli görünen bir pod default'u, her container'ın güvenli olduğu anlamına gelmez.
|
||||
Bir Pod veya workload template'i incelerken, hem `spec.securityContext` hem de `containers`, `initContainers` ve `ephemeralContainers` altındaki her container-level `securityContext` alanını inceleyin. Container-level alanlar pod-level varsayılanları geçersiz kılabilir; bu nedenle güvenli görünen bir pod varsayılanı, her container'ın da güvenli olduğunu garanti etmez.
|
||||
|
||||
Öncelik verilmesi gereken yüksek riskli kombinasyonlar:
|
||||
Öncelik verilmesi gereken yüksek riskli birleşimler:
|
||||
|
||||
- `privileged: true`, özellikle `hostPID`, `hostIPC`, `hostNetwork`, `hostPath`, host port'lar veya runtime socket mount'ları ile birlikte.
|
||||
- `SYS_ADMIN`, `NET_ADMIN`, `SYS_PTRACE`, `SYS_MODULE`, `DAC_READ_SEARCH` veya `DAC_OVERRIDE` gibi eklenen capabilities.
|
||||
- Attacker-controlled code çalıştırabilen container'larda `allowPrivilegeEscalation: true` veya unset olması.
|
||||
- `SYS_ADMIN`, `NET_ADMIN`, `SYS_PTRACE`, `SYS_MODULE`, `DAC_READ_SEARCH` veya `DAC_OVERRIDE` gibi eklenmiş capabilities.
|
||||
- Saldırgan kontrollü code çalıştırabilen container'larda `allowPrivilegeEscalation: true` veya ayarlanmamış olması.
|
||||
- Hassas workload'larda `seccompProfile: Unconfined`, `procMount: Unmasked` veya eksik runtime profile'ları.
|
||||
- Güvenilmeyen input işleyen workload'larda writable root filesystem'ler veya geniş writable volume mount'ları.
|
||||
- Güvenilmeyen input işleyen workload'larda yazılabilir root filesystem'ler veya geniş yazılabilir volume mount'ları.
|
||||
- Çok kiracılı namespace'lerde CPU, memory veya ephemeral-storage request ve limit'lerinin eksik olması.
|
||||
- Eksik veya gerçekçi olmayan pod-level `spec.resources` bütçeleri ve Pod `resize` alt kaynağı üzerinde `patch` veya `update` yetkisine sahip principal'lar; çünkü desteklenen cluster'lar, Pod'u yeniden oluşturmadan çalışan CPU ve memory desired state'i değiştirebilir.
|
||||
|
||||
Çoğu application workload'u için iyi bir başlangıç noktası, non-root UID ile çalıştırmak, `runAsNonRoot: true` ayarlamak, `allowPrivilegeEscalation: false` ayarlamak, tüm capabilities'leri kaldırıp yalnızca gerekli olanları geri eklemek, `seccompProfile: RuntimeDefault` kullanmak, read-only root filesystem'i tercih etmek ve host namespace'lerden, hostPath mount'larından ve privileged moddan kaçınmaktır.
|
||||
Resource kontrolleri `securityContext`'in parçası değildir, ancak aynı workload incelemesinde kontrol edilmelidir; çünkü kullanılabilirlik sınırını onlar tanımlar. Modern Kubernetes, container-level `resources`'a ek olarak `spec.resources` altında Pod seviyesinde CPU, memory ve hugepage bütçeleri tanımlayabilir. Sidecar içeren bir Pod, bir container'ın bireysel limitleri olmasa bile toplam bir Pod zarfı ile sınırlandırılabilir; buna karşın local ephemeral storage için ayrı `ephemeral-storage` limitleri, `emptyDir.sizeLimit`, LimitRanges ve ResourceQuotas gerekir. Ayrıca inplace resize isteğinden sonra Pod spec'indeki istenen resource'ları `status.containerStatuses[].resources` ile karşılaştırın; başarısız veya bekleyen bir resize, istenen değeri `spec` içinde bırakırken kubelet önceki runtime allocation'ını koruyup bir `PodResizePending` condition raporlayabilir.
|
||||
|
||||
Cluster seviyesinde, mümkün olduğunda Kubernetes [Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/) uygulamak için [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) namespace label'larını kullanın. Destekleyen namespace'ler için `restricted` kullanın, sıradan application namespace'leri için en az `baseline` kullanın ve privileged istisnaları dar, dokümante edilmiş ve trusted platform namespace'leri veya node pool'ları ile izole edilmiş şekilde tutun.
|
||||
Çoğu application workload için iyi bir temel, non-root UID ile çalışmak, `runAsNonRoot: true` ayarlamak, `allowPrivilegeEscalation: false` ayarlamak, tüm capabilities'i kaldırıp yalnızca gereken minimum olanları geri eklemek, `seccompProfile: RuntimeDefault` kullanmak, salt okunur root filesystem tercih etmek ve host namespaces, hostPath mount'ları ve privileged mode'dan kaçınmaktır.
|
||||
|
||||
Cluster seviyesinde, mümkün olduğunda Kubernetes [Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/) uygulamak için [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/) namespace label'larını kullanın. Destekleyebilen namespace'ler için `restricted` kullanın, sıradan application namespace'leri için en azından `baseline` kullanın ve privileged istisnaları dar, dokümante edilmiş ve trusted platform namespace'leri veya node pool'larla sınırlı tutun.
|
||||
|
||||
## References
|
||||
|
||||
- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)
|
||||
- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
||||
- [https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)
|
||||
- [https://kubernetes.io/docs/concepts/security/linux-kernel-security-constraints/](https://kubernetes.io/docs/concepts/security/linux-kernel-security-constraints/)
|
||||
- [https://kubernetes.io/docs/concepts/security/pod-security-standards/](https://kubernetes.io/docs/concepts/security/pod-security-standards/)
|
||||
- [https://kubernetes.io/docs/concepts/security/pod-security-admission/](https://kubernetes.io/docs/concepts/security/pod-security-admission/)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/assign-pod-level-resources/](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pod-level-resources/)
|
||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/](https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user