Kubernetes Güvenliği ve Mimari Tasarım: Kapsamlı Rehber
Yazar: Burak Balkı | Kategori: Security | Okuma Süresi: 10 dk
Kubernetes güvenliği ve mimari tasarımı üzerine kapsamlı teknik rehber. RBAC, Network Policies, PSA ve güvenli konteyner yapılandırmaları ile küme güvenliğin...
## Kubernetes Güvenliği: Modern Mimari Tasarım Stratejileri
**Kubernetes güvenliği**, konteyner tabanlı orkestrasyon sistemlerinin üretim ortamlarında (production) sürdürülebilirliği için en kritik bileşendir. Mimari tasarım aşamasında güvenliği bir eklenti olarak değil, sistemin temel taşı olarak ele almak, saldırı yüzeyini (attack surface) minimize etmenin tek yoludur.
Bu rehberde, bir Kubernetes kümesinin mimari olarak nasıl sertleştirileceğini, **Zero Trust** (Sıfır Güven) prensiplerinin nasıl uygulanacağını ve bileşenler arası iletişimin nasıl izole edileceğini teknik detaylarıyla inceleyeceğiz.
## 1. Kubernetes Güvenlik Katmanları (4C Modeli)
Kubernetes güvenliği bütünsel bir yaklaşım gerektirir. Mimari tasarımda genellikle "4C Güvenlik Modeli" kullanılır:
1. **Cloud (Bulut):** Altyapı, ağ ve fiziksel sunucu güvenliği.
2. **Cluster (Küme):** Kubernetes API server, etcd ve node güvenliği.
3. **Container (Konteyner):** İmaj tarama, runtime güvenliği.
4. **Code (Kod):** Uygulama seviyesindeki zafiyetler ve statik analiz.
> **Kritik Not:** Kubernetes mimarisinde en zayıf halka tüm sistemi tehlikeye atar. Bu nedenle her katmanda savunma derinliği (defense-in-depth) stratejisi uygulanmalıdır.
## 2. Kontrol Düzlemi (Control Plane) Güvenliği
Kubernetes kümesinin beyni olan Control Plane bileşenleri, en yüksek öncelikli koruma alanıdır. Özellikle **API Server** ve **etcd** veritabanının erişilebilirliği kısıtlanmalıdır.
### API Server Erişimi
API Server, dış dünyaya açık olmamalıdır. Sadece yetkili IP adreslerinden (Whitelisting) veya bir VPN/Bastion Host üzerinden erişilmelidir.
### etcd Şifreleme
Etcd, kümedeki tüm verileri (Secret'lar dahil) tutar. Varsayılan olarak veriler diskte şifrelenmez. Mimari tasarımda `EncryptionConfiguration` mutlaka etkinleştirilmelidir.
```yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret:
- identity: {}
```
## 3. RBAC (Role-Based Access Control) Yapılandırması
**RBAC**, Kubernetes mimarisinde "En Az Yetki Prensibi"ni (Principle of Least Privilege) uygulamak için kullanılır. Kullanıcılara ve ServiceAccount'lara sadece ihtiyaç duydukları kadar yetki verilmelidir.
### Örnek: Salt Okunur Rol Tanımı
Aşağıdaki örnek, belirli bir namespace içindeki pod'ları listeleme yetkisi verir ancak silme veya değiştirme yetkisi tanımaz.
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
```
Bu rolü bir kullanıcıya bağlamak için `RoleBinding` kullanılır:
```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods-binding
namespace: production
subjects:
- kind: User
name: "ahmet@kurum.com"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
```
## 4. Network Policies ile Ağ İzolasyonu
Kubernetes'te varsayılan olarak tüm pod'lar birbirleriyle konuşabilir. Bu, bir pod ele geçirildiğinde saldırganın ağda yatayda hareket etmesine (lateral movement) olanak tanır. Mimari tasarımda **Network Policies** kullanılarak "Default Deny" politikası uygulanmalıdır.
### Varsayılan Tüm Trafiği Engelleme (Default Deny)
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
```
### Belirli Bir Servise Erişim İzni Verme
Sadece `frontend` etiketli pod'ların `backend` servisine 8080 portundan erişmesine izin veren kural:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
```
## 5. Pod Security Admission (PSA) Kullanımı
PodSecurityPolicies (PSP) kullanımdan kaldırıldıktan sonra yerini **Pod Security Admission** aldı. Bu sistem, namespace seviyesinde güvenlik standartlarını (Privileged, Baseline, Restricted) zorunlu kılar.
### Namespace Seviyesinde Kısıtlama
Bir namespace'i en yüksek güvenlik seviyesine (Restricted) çekmek için:
```bash
kubectl label --overwrite ns production-apps \
pod-security.kubernetes.io/enforce=restricted
```
## 6. Güvenli Konteyner Çalıştırma Prensipleri
Konteynerlerin root yetkileriyle çalışması büyük bir güvenlik açığıdır. Mimari tasarımda `securityContext` kullanımı zorunlu tutulmalıdır.
```yaml
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
containers:
- name: app
image: my-app:1.0.0
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
```
## 7. Secrets Management ve Hassas Veri Yönetimi
Kubernetes Secret'ları varsayılan olarak sadece base64 ile kodlanır, şifrelenmez. Kurumsal mimarilerde şu yöntemler tercih edilmelidir:
| Yöntem | Açıklama | Güvenlik Seviyesi |
| :--- | :--- | :--- |
| **Sealed Secrets** | GitOps dostu, asimetrik şifreleme kullanır. | Orta-Yüksek |
| **HashiCorp Vault** | Dinamik secret üretimi ve merkezi yönetim. | Çok Yüksek |
| **CSI Secret Store** | Cloud Provider (AWS, Azure, GCP) KMS entegrasyonu. | Yüksek |
## 8. Kaynak Sınırlandırma ve DoS Koruması
Bir pod'un tüm node kaynaklarını tüketerek diğer servisleri durdurmasını (Denial of Service) engellemek için `ResourceQuotas` ve `LimitRanges` tanımlanmalıdır.
```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: development
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "10"
limits.memory: 16Gi
```
## 9. Admission Controllers ve Otomasyon
Politikaları manuel kontrol etmek yerine, **OPA Gatekeeper** veya **Kyverno** gibi Admission Controller araçları kullanılmalıdır. Örneğin; bir imajın sadece belirli bir registry'den (örn: `harbor.kurum.com`) çekilmesini zorunlu kılabilirsiniz.
```yaml
# Kyverno Örneği: Root kullanıcıyı yasakla
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-root-user
spec:
validationFailureAction: enforce
rules:
- name: check-run-as-non-root
match:
resources:
kinds:
- Pod
validate:
message: "Root kullanıcı ile çalıştırmak yasaktır."
pattern:
spec:
securityContext:
runAsNonRoot: true
```
## 10. Runtime Security ve İzleme
Statik analizler yeterli değildir; çalışma anında (runtime) meydana gelen şüpheli hareketler izlenmelidir. **Falco** gibi araçlar, sistem çağrılarını (syscalls) dinleyerek anomali tespiti yapar.
- Bir pod içinde `sh` veya `bash` çalıştırılması.
- Beklenmedik bir dosya yazma işlemi.
- Hassas dizinlere (/etc, /root) erişim.
## 11. Sık Yapılan Hatalar ve Kaçınılması Gerekenler
1. **Privileged: true Kullanımı:** Konteynerin host makinesindeki tüm yetkilere sahip olmasına neden olur. Kesinlikle kaçınılmalıdır.
2. **Default ServiceAccount Kullanımı:** Her pod'a varsayılan olarak bağlanan token, gereksiz yetki artışına yol açabilir. `automountServiceAccountToken: false` yapılmalıdır.
3. **Etiketlenmemiş İmajlar:** `latest` tag kullanımı, hangi kodun çalıştığının takibini zorlaştırır ve rollback işlemlerini imkansız kılar.
4. **Zayıf etcd Koruması:** etcd'nin API Server dışındaki her şeye açık olması tüm kümenin ele geçirilmesine neden olur.
## 12. Sık Sorulan Sorular (FAQ)
**Soru 1: Kubernetes Secret'ları gerçekten güvenli mi?**
Cevap: Hayır, varsayılan olarak sadece base64 ile kodlanırlar. Mimari tasarımda mutlaka KMS (Key Management Service) veya Vault entegrasyonu yapılmalıdır.
**Soru 2: Network Policy kullanmak performansı etkiler mi?**
Cevap: Çok düşük bir overhead (ek yük) getirir ancak sağladığı güvenlik faydası bu maliyetin çok üzerindedir. CNI eklentisine (Calico, Cilium vb.) bağlı olarak performans değişebilir.
**Soru 3: Rootless konteyner nedir?**
Cevap: Konteynerin hem host üzerinde hem de konteyner içinde root olmayan bir kullanıcı ile çalıştırılmasıdır. Bu, konteynerden kaçış (container escape) saldırılarını büyük ölçüde engeller.
**Soru 4: RBAC'ta ClusterRole ve Role arasındaki fark nedir?**
Cevap: Role belirli bir namespace ile sınırlıdır; ClusterRole ise tüm küme genelindeki kaynaklara (Nodes, Namespaces vb.) erişim sağlar.
**Soru 5: CIS Benchmarks nedir?**
Cevap: Kubernetes bileşenlerinin güvenli yapılandırılması için endüstri standardı olan bir kontrol listesidir. `kube-bench` aracı ile bu kontroller otomatikleştirilebilir.
## Özet ve Sonuç
Kubernetes güvenliği, sürekli devam eden bir süreçtir. **RBAC**, **Network Policies** ve **Pod Security Standards** gibi yerleşik mekanizmaların doğru yapılandırılması, güvenli bir mimarinin temelini oluşturur. Modern sistemlerde bu yapılandırmalar GitOps süreçlerine dahil edilmeli ve otomatik araçlarla sürekli denetlenmelidir. Güvenliği tasarımın merkezine koyarak, hem uyumluluk (compliance) gereksinimlerini karşılayabilir hem de iş kritik uygulamalarınızı koruma altına alabilirsiniz.