🏁 Capstone 2 — Blok D Sonu: Orkestre + Güvenli Sistem#
"Güvenlik sonradan eklenen bir bölüm değil; bu capstone'da RBAC, NetworkPolicy ve imzalı image ilk günden içeridedir."
Kapı: Blok D sonu · Süre: ~20 saat · Ön koşul: Blok D tamamlandı (D1–D5) + Blok D sınavı geçildi
🎯 Bu capstone'da#
Capstone 1'deki uygulamayı bir K8s cluster'ında (yerel: kind/k3s) production ayarlarıyla, güvenlik ipliği içeride ve GitOps ile çalıştırırsın. Güvenlik ayrı bir teslimat değil — kabul kriterlerinin yarısıdır.
📦 Şartname#
Capstone 1'in git reposunu genişletirsin. Eklenenler:
- Deploy manifestleri (
k8s/veya Helm/Kustomize): Deployment + Service + Ingress. Uygulama dışarıdan erişiliyor. - Güvenlik ipliği (zorunlu, ayrı dosya değil — manifestlerin içinde):
- En az yetkili RBAC Role/RoleBinding (
deletegibi gereksiz fiiller yok). - Default-deny NetworkPolicy + yalnız gereken trafiği açan kurallar.
automountServiceAccountToken: false(Pod token'a ihtiyaç duymuyorsa).- Production ayarları: request/limit, readiness + liveness probe, PDB, HPA.
- Supply chain (C2 pipeline'ının devamı): pipeline'da
trivytaraması — HIGH/CRITICAL eşiği aşılınca kırılıyor; imagecosignile imzalı ve doğrulanıyor. - Secret: repo dışından (Secret referansı / harici store); repoda düz metin sır yok.
- GitOps: tek uygulama ArgoCD ile Git'ten yönetiliyor,
Synced/Healthy. SECURITY.md: hangi kontrol nerede — RBAC, NetworkPolicy, tarama kapısı, imzalama, secret akışı. Bir denetçinin tek bakışta göreceği tablo.
✅ Kabul kriterleri#
Hepsi doğrulanmadan capstone tamamlanmadı: - [ ] Uygulama Deployment + Service + Ingress ile çalışıyor — kubectl get / curl kanıtı - [ ] kubectl auth can-i delete pods --as=system:serviceaccount:<NS>:<SA> → no - [ ] Default-deny NetworkPolicy uygulanmışken izinsiz bir Pod hedefe erişemiyor — kanıt - [ ] request/limit + iki probe + HPA + PDB uygulanmış — kubectl describe kanıtı - [ ] Pipeline'da tarama kapısı HIGH/CRITICAL'da kırılıyor; cosign verify geçiyor - [ ] Repoda düz metin sır yok — gitleaks / trivy fs çıktısı temiz - [ ] Uygulama ArgoCD'de Synced/Healthy; elle bir drift OutOfSync gösterilip düzeltiliyor
📊 Rubrik#
Her eksen 0–2. Geçme ≥ 10/12 ve güvenlik eksenlerinin hiçbiri 0/1 değil.
| Eksen | 0 | 1 | 2 |
|---|---|---|---|
| RBAC (en az yetki) | Yok / cluster-admin | Role var, fazla geniş | En az yetki + can-i reddi kanıtlı |
| NetworkPolicy | Yok | Var, default-deny değil | Default-deny + gerekçeli izinler |
| Production hazırlığı | request/limit/probe eksik | Bir kısmı var | request/limit + probe + HPA + PDB tam |
| Supply chain | Tarama/imza yok | Tarama var, kapı kırmıyor | Kapı kırıyor + cosign verify geçiyor |
| Secret disiplini | Manifest'te düz metin | Referans var, repo taranmamış | Referans + repo taraması temiz |
| GitOps | Elle kubectl apply | ArgoCD var, drift denenmemiş | Synced/Healthy + drift gösterildi |
💼 Portfolyo çıktısı#
CV'de "K8s + güvenlik ipliği" satırının kanıtı. SECURITY.md, mülakatta "güvenliği nasıl entegre ettin?" sorusunun somut cevabıdır. Repo README şablonu; CV satırına eşlemesi PORTFOLIO.md'de:
# <PROJE_ADI> — K8s'te Güvenli Deploy
**Ne:** Bir uygulamayı K8s'te production ayarları ve güvenlik ipliği
(RBAC, NetworkPolicy, imzalı image) ile GitOps üzerinden çalıştırır.
(DevSecOps Handbook · Capstone 2)
## Güvenlik kontrolleri (bkz. SECURITY.md)
- En az yetkili RBAC + default-deny NetworkPolicy
- Pipeline'da tarama kapısı (HIGH/CRITICAL kırar) + cosign imza doğrulama
- Secret repo dışından; repo gitleaks ile temiz
## Production ayarları
- request/limit, readiness+liveness probe, HPA, PDB
## Teslimat modeli
- Tek uygulama ArgoCD ile Git'ten (Synced/Healthy)
## Hangi kararı niçin verdim
- <örn. default-deny niçin, delete fiili niçin yok, imzasız image niçin reddedilir>
⏭️ Sırada#
"Bir cluster'ın 'çalışıyor' olması yetmez; kimin ne yapabildiği ve neyin çalıştığı da tanımlı olmalı."