Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-basics.

This commit is contained in:
Translator
2026-07-04 17:43:17 +00:00
parent c72ae6a857
commit a98122a0b0
3 changed files with 167 additions and 137 deletions
@@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}}
Kubernetes içinde servicesleri expose etmenin **farklı yolları** vardır; böylece hem **internal** endpointler hem de **external** endpointler bunlara erişebilir. Bu Kubernetes configuration oldukça kritiktir çünkü administrator, **attackers**a erişmemesi gereken serviceslere 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
K8sin servicesleri publice expose etmek için sunduğu yöntemleri enumerate etmeye başlamadan önce, eğer namespaces, services ve ingresses listesini alabiliyorsan, publice exposed olan her şeyi şununla bulabileceğini bil:
K8snin servisleri publice expose etmek için sunduğu yolları enumerate etmeye başlamadan önce, namespaces, services ve ingresses listeleyebiliyorsan publice 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, Kubernetesin **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 Machinesi 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 Nodelarda (Virtual Machinesi temsil eden) belirlenmiş bir port erişime açılır. Bu belirli porta yönlendirilen **traffic**, daha sonra sistematik olarak **servicee yönlendirilir**. Genellikle, dezavantajları nedeniyle bu yöntem önerilmez.
Tüm NodePortları listele:
```bash
@@ -81,30 +81,41 @@ targetPort: 80
nodePort: 30036
protocol: TCP
```
yaml içinde **nodePort** belirtmezseniz (açılacak port budur), **3000032767 aralığındaki** bir port kullanılacaktır.
Eğer yaml içinde **nodePort** belirtmezseniz (açılacak port budur), **3000032767 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 nodeların ve backendlerin 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 IPsini NodePort/LoadBalancer trafiği için korur ve trafiği diğer nodelar üzerindeki endpointse yönlendirmekten kaçınır. Local hazır bir endpoint olmayan bir node, Servicein başka yerlerde endpointsi 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 IPlerini görebilir.
- `internalTrafficPolicy: Local` cluster içi Service trafiğini source node üzerindeki local endpoints ile sınırlar. Bu locality routingdir, authorization boundary değildir.
- `sessionAffinity: ClientIP` bir clienttan yapılan tekrarlı testlerin aynı backende düşmesini sağlayabilir ve manuel kontroller sırasında diğer hazır endpointsi gizleyebilir.
- `trafficDistribution` ve EndpointSlice topology hints, yeni clusters üzerinde aynı-zone veya aynı-node endpointsi 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.
Servicei harici olarak **cloud provider'ın load balancer'ını kullanarak** açar. GKE üzerinde bu, tüm trafiği serviceinize forward edecek tek bir IP address sağlayan bir [Network Load Balancer](https://cloud.google.com/compute/docs/load-balancing/network/) başlatır. AWSde 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 LoadBalancersları 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 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 Servicei bir DNS adına **eşler**, `my-service` veya `cassandra` gibi tipik bir selectora değil. Bu Servicesi `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` namespaceindeki `my-service` Serviceini `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 Servicein şu anda yönlendirdiği gerçek backend adreslerini ve portlarını gösterir. Bir Servicein selector’ı olmadığında, labellar trafik yolunu açıklamadığında veya yalnızca bazı backendler hazır olduğunda özellikle faydalıdır.
EndpointSlices, bir Servicein şu anda yönlendirme yaptığı somut backend adreslerini ve portlarını gösterir. Özellikle bir Servicein selector’ı yoksa, labels trafik yolunu açıklamıyorsa veya yalnızca bazı backendler hazırsa faydalıdır.
Servicelerle ilişkili EndpointSlices listesini çıkarın:
Servicelerle ilişkili EndpointSlicesları 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'
```
Exposureu incelerken, Service selector ile EndpointSlice `targetRef`, endpoint addresses, readiness conditions ve portsu karşılaştırın. Selectorsız bir Service, elle yönetilen EndpointSlices ile eşleştirilebilir ve trafiği non-Pod veya beklenmeyen hedeflere yönlendirebilir.
Exposureu 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 EndpointSlicelarla 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 servicein **ö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 servicein ö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 serviceine, yourdomain.com/bar/ pathi altındaki her şeyi de bar serviceine 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ı routingi backend servicese yapmanıza olanak tanır. Örneğin, foo.yourdomain.com altındaki her şeyi foo serviceine, yourdomain.com/bar/ pathi altındaki her şeyi bar serviceine 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 ingressleri listeleyin:
Tüm ingressleri 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, Servicesi expose etmek için daha yeni Kubernetes APIsidir. Infrastructure-owned Gateway objectlerini HTTPRoute gibi application-owned Route objectlerinden ayırır. Bu, delegation için faydalıdır, ancak exposure’ın namespaceler arasında bölünebilmesi anlamına da gelir.
Gateway API, Servicesi dışa açmak için kullanılan daha yeni Kubernetes APIsidir. Infrastructure-owned Gateway nesnelerini, HTTPRoute gibi application-owned Route nesnelerinden ayırır. Bu, delegation için faydalıdır; ancak exposure’ın namespaceler arasında bölünebilmesi anlamına da gelir.
Gateway API exposure objectlerini listele:
Gateway API exposure objectsları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 backendi 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, containerların görevini verimli şekilde planlamayı sağlar.
- Containerları canlı tutar.
- Container iletişimine izin verir.
- container engine içinde container/s çalıştırmaya izin verir.
- Schedule, containerların görevini verimli şekilde yapmasını sağlar.
- containerları canlı tutar.
- container iletişimine izin verir.
- deployment tekniklerine izin verir.
- Bilgi hacimlerini yönetir.
- bilgi hacimlerini yönetir.
### Architecture
![Kubernetes architecture diagram showing control plane components, API server, kubelet, kube-proxy, pods, and worker nodes](https://sickrov.github.io/media/Screenshot-68.jpg)
- **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, kubernetesin çalışan container technologysini soyutlama yoludur.
- **Service**: Her pod, nodeun internal aralığından 1 internal **IP address** alır. Ancak bir service üzerinden de exposed edilebilir. **Servicein ayrıca bir IP addressi vardır** ve amacı podlar arasındaki iletişimi sürdürmektir; böylece biri ölürse **yeni replacement** (farklı bir internal IP ile) **aynı service IPsi üzerinden erişilebilir** olur. Internal veya external olarak yapılandırılabilir. Service, **2 pod aynı servicee bağlandığında load balancer** gibi de davranır.\
Bir **service** **oluşturulduğunda** çalışan her servicein endpointlerini `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ış containerları yönetmez.
- **Kube-proxy**: apiserver ile node arasındaki communications (services) ile ilgilenen servicetir. Temeli nodelar için IPtablestır. Deneyimli kullanıcılar başka vendorların başka kube-proxylerini kurabilir.
- **Sidecar container**: Sidecar containerlar, pod içindeki ana container ile birlikte çalışması gereken containerlardır. Bu sidecar pattern, mevcut containerları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 dependenciesi sarmalamak amacıyla container technology kullandığımızı biliyoruz. Bir container yalnızca bir şey yapar ve onu çok iyi yapar.
- **Node**: pod veya podlar 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, kubernetesin çalışan container teknolojisini soyutlama yöntemidir.
- **Service**: Her pod, nodeun internal aralığından 1 internal **IP address** alır. Ancak bir service üzerinden de expose edilebilir. **Servicein de bir IP addressi vardır** ve amacı podlar arasındaki iletişimi sürdürmektir; böylece biri ölürse, **yeni replacement** (farklı bir internal IP ile) **aynı service IPsi** üzerinden erişilebilir olur. Internal veya external olarak yapılandırılabilir. Service ayrıca **2 pod aynı servicee bağlı olduğunda load balancer** gibi davranır.\
Bir **service** **oluşturulduğunda** çalışan her servicein endpointlerini `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ış containerları yönetmez.
- **Kube-proxy**: apiserver ile node arasındaki iletişimden (services) sorumlu hizmettir. Temeli nodelar için bir IPtablestır. Deneyimli kullanıcılar diğer vendorların başka kube-proxylerini kurabilir.
- **Sidecar container**: Sidecar containerlar, pod içindeki main container ile birlikte çalışması gereken containerlardır. Bu sidecar pattern, mevcut containerları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 dependenciesi 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 podların master process ile iletişim kurmak için kullandığı yoldur. Yalnızca authenticated requestlere izin verilmelidir.
- **Scheduler**: Scheduling, Podların Kubeletin onları çalıştırabilmesi için Nodes ile eşleştirilmesini sağlama sürecidir. Yeni podu hangi nodeun daha fazla available resourcea sahip olduğuna karar verecek kadar akıllıdır ve ona atar. Unutma, scheduler yeni podları başlatmaz; yalnızca node içinde çalışan Kubelet processi ile iletişim kurar, bu process yeni podu başlatır.
- **Kube Controller manager**: Replica setler veya deployments gibi resourcesları 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, tokenlar ve account servicesi APIye karşı kontrol eder.
- **etcd**: Data storage, persistent, consistent ve distributed. Kubernetesin databasei ve clusterların tam durumunu tuttuğu key-value storagetı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 datee bağlıdır (nodeların available resourcedları, çalışan pod sayısı...)
- **Cloud controller manager**: AWS veya OpenStackte clusterların olması gibi flow controls ve applications için özel controllerdır.
- **Api Server:** Kullanıcıların ve podların master process ile iletişim kurmak için kullandığı yoldur. Sadece authenticated requestlere izin verilmelidir.
- **Scheduler**: Scheduling, Podların Kubeletin onları çalıştırabilmesi için Nodelarla eşleştirilmesini sağlama sürecidir. Yeni podu hangi nodeun daha fazla kullanılabilir resourcea sahip olduğuna karar verecek kadar zekidir. Scheduler’ın yeni podları başlatmadığını, sadece node içinde çalışan Kubelet processi ile iletişim kurduğunu, ve onun yeni podu başlatacağını unutmayın.
- **Kube Controller manager**: Örneğin doğru sayıda pod veya nodeun çalışıp çalışmadığını kontrol etmek için replica sets veya deployments gibi resourcesu denetler. Bir pod eksikse, yeni bir tane başlatmak için scheduler ile iletişim kurar. Replication, tokenlar ve account servicesi APIye karşı kontrol eder.
- **etcd**: Data storage, persistent, consistent ve distributed. Kubernetesin databaseidir ve clusterların tam durumunu tuttuğu key-value storagedı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 datee bağlıdır (nodeların available resourcedları, çalışan pod sayısı...)
- **Cloud controller manager**: Flow controls ve applications için özel controllerdır; örneğin AWS veya OpenStack üzerinde clusterlarınız varsa.
Birden fazla node (birden fazla pod çalıştıran) olabileceği gibi, Api servera erişimleri load balanced ve etcdleri synchronized olan birden fazla master process de olabilir.
Birden fazla node (birden fazla pod çalıştıran) olabileceği gibi, Api servera load balanced erişimi olan ve etcdsi synchronized birçok master process de olabilir.
**Volumes:**
Bir pod, kaybolduğunda kaybolmaması gereken data oluşturduğunda, bunun fiziksel bir volumeda saklanması gerekir. **Kubernetes, datayı kalıcı tutmak için bir volumeun poda attach edilmesine izin verir**. Volume local makinede veya bir **remote storage** üzerinde olabilir. Farklı fiziksel nodelarda çalışan podlar 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 volumeda saklanması gerekir. **Kubernetes, datayı kalıcı tutmak için bir volumeu poda attach etmeye izin verir**. Volume yerel makinede veya bir **remote storage** üzerinde olabilir. Farklı physical nodelarda podlar ç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 artifacti 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 imageları için kullanılan aynı credential kaynaklarıyla artifacti çeker; buna node credentials, Pod `imagePullSecrets` ve ServiceAccount `imagePullSecrets` dahildir. Bir security review sırasında image volumese 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 directoryyi 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 dataya erişebilir.
- **Deployments**: kubernetes tarafından çalıştırılacak components burada belirtilir. Bir user genelde doğrudan podlarla çalışmaz; podlar, deployments üzerinden çalıştırılan **ReplicaSets** (aynı podlardan çoğaltılmış sayı) içinde soyutlanır. Deploymentsin **stateless** applications için olduğunu unutma. Bir deployment için minimum configuration, name ve çalıştırılacak imagedır.
- **StatefulSet**: Bu component özellikle **databases** gibi **aynı storagea erişmesi** gereken applicationlar 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, requestleri alacak ve kontrol edip onları servicese load balance edecek **bir pod**dur. ingress controller, requesti **yapılandırılmış ingress rulesa göre gönderir**. Ingress rulesun farklı pathse veya hatta subdomainlere farklı internal kubernetes servicese 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.
- Hbir ingress rule ile eşleşmeyen bir request alındığında, ingress controller onu "**Default backend**"e yönlendirir. Bu parametrenin addressini almak için ingress controller’ı `describe` edebilirsin.
- **ConfigMap**: servicese 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 dataya erişebilir.
- **Deployments**: kubernetes tarafından çalıştırılacak bileşenlerin belirtildiği yerdir. Bir kullanıcı genelde doğrudan podlarla çalışmaz; podlar **ReplicaSets** içinde soyutlanır (aynı podların replike edilmiş sayısı), ve bunlar deployments aracılığıyla çalıştırılır. Deploymentsin **stateless** applicationlar için olduğunu unutmayın. Bir deployment için minimum yapılandırma name ve çalıştırılacak imagedır.
- **StatefulSet**: Bu bileşen özellikle **databases** gibi **aynı storagea erişmesi** gereken applicationlar 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, requestleri alacak ve kontrol edecek endpoint olan bir **pod**dur ve onları servicese load balance eder. ingress controller, **configure edilmiş ingress rulesa göre requesti gönderecektir**. ingress rulesun farklı internal kubernetes serviceslere 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 addressini 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
![Kubernetes CA and PKI diagram showing API server certificates between clients, scheduler, controller manager, kubelet, and etcd](https://sickrov.github.io/media/Screenshot-66.jpg)
- CA, cluster içindeki tüm certificates için trusted roottur.
- Bileşenlerin birbirini validate etmesine izin verir.
- Bileşenlerin birbirini doğrulamasına izin verir.
- Tüm cluster certificates CA tarafından imzalanır.
- ETCdnin kendi certificatei 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 processlerini tek bir makinede** çalıştırır. Minikube, nodeu ç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 processlerini tek bir makinede** çalıştırır. Minikube, nodeu ç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 clusterları için command line aracıdır. kubernetes içinde işlemler gerçekleştirmek veya veri istemek için master processin 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 URLsini ş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 imagei tanımlayan yeni bir configuration structure ile tanımlanmış templatei 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**, podlara 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 podun adresi olduğunu bilecektir (bu pod bir mongodb çalıştıracaktır):
Bir **ConfigMap**, podlara verilen yapılandırmadır; böylece diğer servicesleri nasıl bulup erişeceklerini bilirler. Bu durumda, her pod `mongodb-service` adının, iletişim kurabilecekleri bir podun 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 podun 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 nodeun 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 namespacei 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 repositorylerde 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 enginedir:
Helm ayrıca değişkenlerle config dosyaları oluşturmayı sağlayan bir template enginedir:
## Kubernetes secrets
Bir **Secret**, bir password, bir token veya bir key gibi **hassas data** içeren bir objecttir. 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 objectin 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 typeları vardır
Kubernetes içinde farklı secret türleri vardır
| Builtin Type | Usage |
| ----------------------------------- | ----------------------------------------- |
@@ -364,13 +366,13 @@ Kubernetes içinde farklı secret typeları 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:**
![Kubernetes secrets diagram showing secret data reaching the API server and being consumed by a pod](https://sickrov.github.io/media/Screenshot-164.jpg)
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` pathine `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` pathine `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**, Kubernetesin 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 secretslara 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 secretse erişelim:
```bash
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
```
FS içinde sertifikaları, anahtarları ve URLleri göreceksiniz. Onları ele geçirdiğinizde, etcdye bağlanabileceksiniz.
FS'de sertifikalar, keys ve urllerin 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, secretsları 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ı etcdden okuyun:
2. etcdctl commandline kullanarak, bu secret'ı etcd'den okuyun:
`ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C`
burada `[...]`, etcd servera 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 prefixli olduğunu verify edin; bu, `aescbc` providerın resulting datayı 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}}
@@ -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}}