Threat Modeling — Sistemsiz Tehdit Avı Bitsin#
"Saldırgan zaten size bir threat model yapıyor. Siz yapmazsanız aradaki fark, onun pazar avantajıdır."
Threat modeling = bir sistemin neye benzediğini, nasıl saldırılabileceğini, ve hangi kontrolün hangi tehdidi azalttığını kayıtlı tutmaktır. Bir hafta süren formal egzersiz değil — 90 dakikada başlanıp PR'a iliştirilen yaşayan bir doküman.
🎯 Niye Yapılır?#
| Sorun | Threat modeling cevabı |
|---|---|
| "Bu yeni feature güvenli mi?" | Tehdit listesi + her tehdidin azaltılma yolu |
| "Hangi kontrolü ekleyelim?" | ROI listesi: yüksek-tehdit / düşük-maliyet kontroller |
| "Pen-test'te ne aratalım?" | Threat model çıktısı = pentest scope |
| "Audit'te 'risk değerlendirmesi var mı' soruluyor" | Threat model = risk register'ın temeli |
| "Yeni mühendis sistem güvenliğini öğrenmek istiyor" | Onboarding doc'u olur |
📐 Çerçeveler#
1. STRIDE (Microsoft, 2002 — hâlâ en çok kullanılan)#
Her threat type'ı tek tek değerlendir:
| Harf | Tehdit | Karşı kontrol kategorisi |
|---|---|---|
| Spoofing | Birinin kimliğini taklit etme | Authentication |
| Tampering | Veriyi değiştirme | Integrity (signing, hash) |
| Repudiation | "Ben yapmadım" diyebilme | Audit log, non-repudiation |
| Information Disclosure | Yetkisiz veri okuma | Encryption, RBAC |
| Denial of Service | Erişimi engelleme | Rate limit, quota, scaling |
| Elevation of Privilege | Yetkisini büyütme | Least privilege, RBAC |
2. LINDDUN (Privacy-focused, GDPR/KVKK uyumu için)#
| Harf | Tehdit |
|---|---|
| Linkability | Iki ayrı kayıt aynı kişide bağlanır |
| Identifiability | Anonim sanılan veri kişiye bağlanır |
| Non-repudiation | Kişi reddedemez (privacy bağlamında kötü) |
| Detectability | Kişinin sistemde olduğu tespit edilebilir |
| Disclosure | Bilgi sızıntısı |
| Unawareness | Kullanıcı veri toplamadan habersiz |
| Non-compliance | Yasal uyumsuzluk |
3. PASTA (Process for Attack Simulation and Threat Analysis)#
7-aşamalı, business risk'e bağlı, daha ağır. Düzenleme/finans için iyi.
4. Attack Trees#
Kök = saldırgan hedefi, dallar = bu hedefe ulaşma yolları.
Root: Müşteri kart numaralarını çal
├── App'e SQLi
│ ├── Input validation yok
│ └── Prepared statement yok
├── DB'ye direkt erişim
│ ├── DB internet'e açık
│ ├── Weak DB password
│ └── Compromised admin laptop
└── Backup'tan oku
├── Backup S3 public
└── Backup unencrypted
🔑 Pratik öneri: Çoğu ekip için STRIDE yeterli. Privacy/regülasyon ağırlıklı işlerde STRIDE + LINDDUN. Attack tree → kritik feature'lar için ayrıca yapılabilir.
📐 Hafif Sürüm: 90 Dakikalık Threat Model#
Yeni servis tasarımı PR'a düştüğünde:
0–10 dk: Sistem diagramı#
Data Flow Diagram (DFD) çiz. Mermaid yeter:
flowchart LR
User[(Browser)] -->|HTTPS| LB[Load Balancer]
LB -->|HTTPS| API[API Service]
API -->|TLS| DB[(PostgreSQL)]
API -->|HTTPS| Vault[Vault]
API -->|HTTPS| ExtSvc[3rd-party Payment]
Worker[Background Worker] -->|TLS| DB
Worker -->|HTTPS| Queue[(SQS)] 10–20 dk: Trust boundary'leri çiz#
[INTERNET] ←→ [DMZ: LB, WAF] ←→ [APP TIER] ←→ [DATA TIER]
↓
[3RD PARTY: Payment] (external trust boundary)
Trust boundary = "bu noktada veri güvenilmeyen taraftan güvenilen tarafa geçiyor". Her boundary için kontrol yazılır.
20–60 dk: STRIDE her kompozite#
| Komponent | S | T | R | I | D | E |
|---|---|---|---|---|---|---|
| LB | TLS termination, mTLS upstream | WAF rule | LB access log | TLS 1.3 | Rate limit | — |
| API | OAuth2/OIDC | Body schema validation | Audit log | Encryption-at-rest, RBAC | Rate limit + quota | RBAC, k8s RBAC |
| DB | DB user per service | FK constraint, transaction | DB audit (pgaudit) | TDE, column-level enc | Connection pool | Least-privilege role |
| External Payment | mTLS + signed JWT | Webhook signature verify | Webhook log | TLS only | Circuit breaker | API key in Vault |
| Background Worker | Service identity (SPIFFE) | Idempotency key | Job log | Same as API | Queue back-pressure | Worker SA |
60–80 dk: Risk skor + öncelik#
Her tehdidi: - Likelihood: Düşük / Orta / Yüksek - Impact: Düşük / Orta / Yüksek - Risk = L × I (basit 3x3 matris yeterli)
| Tehdit | L | I | Risk | Mitigasyon | Status |
|---|---|---|---|---|---|
| API'ye SQLi | M | H | High | Prepared statements + input validation | ✅ Implemented |
| Vault token'ı pod env'de | M | H | High | File mount + tmpfs | ⚠️ TODO #234 |
| Webhook replay | L | M | Med | Nonce + timestamp + signature | ✅ Implemented |
| 3rd-party payment outage | M | M | Med | Circuit breaker + queue | ⚠️ TODO #235 |
80–90 dk: Action items + owner#
Her unmitigated tehdit → JIRA/Linear ticket + sahip + due date.
📝 Threat Model Şablonu#
# Threat Model: <SERVICE_NAME>
**Date:** 2026-05-04
**Authors:** @halil, @security-team
**Status:** Draft / Review / Accepted
## 1. System Overview
<2-3 cümle: ne yapıyor, kim kullanıyor>
## 2. Data Flow Diagram
[Mermaid veya draw.io]
## 3. Assets (korunması gereken)
| Asset | Sensitivity | Notes |
|---|---|---|
| Müşteri PII | High | KVKK kapsamında |
| Kart numaraları | Critical | PCI DSS — saklanmıyor, tokenize |
| API keys | High | Vault'ta |
## 4. Trust Boundaries
- Internet ↔ DMZ (WAF, rate limit)
- DMZ ↔ App tier (mTLS)
- App ↔ DB (network policy + DB auth)
- App ↔ 3rd party (mTLS + signed JWT)
## 5. Threat Analysis (STRIDE)
[Komponent x STRIDE matrisi yukarıdaki gibi]
## 6. Risk Register
[Likelihood × Impact tablosu]
## 7. Mitigation Plan
| Tehdit | Mitigasyon | Owner | Due | Status |
|---|---|---|---|---|
## 8. Out of Scope
- DDoS at L3/L4 (CloudFlare gateway katmanında)
- Insider with full admin access (compensating: audit + vault)
## 9. Assumptions
- Cluster K8s 1.30+ ve PSS restricted enforce
- Tüm imajlar cosign ile imzalı
- mTLS service mesh ile her yerde
## 10. References
- [Kubernetes-Hardening.md](Kubernetes-Hardening.md)
- [Secrets-Management.md](Secrets-Management.md)
🎯 Hangi Sıklıkta?#
| Tetikleyici | Threat model |
|---|---|
| Yeni servis tasarımı (PR) | Tam STRIDE (90 dk) |
| Yeni feature, mevcut servis | Mini delta (30 dk, sadece değişen kısım) |
| 3rd party entegrasyonu | Tam (yeni trust boundary) |
| Mimarinin büyük revizyonu | Tam yeniden |
| Major incident sonrası | Postmortem ile birlikte (gap analizi) |
| Yıllık | Her servisin TM'i refresh |
🧰 Araçlar#
| Araç | Tip | Maliyet |
|---|---|---|
| OWASP Threat Dragon | Açık kaynak, web/desktop | Free |
| Microsoft Threat Modeling Tool | Windows desktop | Free |
| IriusRisk | Enterprise | Ticari |
| ThreatModeler | Enterprise | Ticari |
| PyTM | Python kod-as-threat-model | Free |
| Mermaid + Markdown + GitHub | Plain text | Free |
🔑 Pratik öneri: Markdown + Mermaid + GitHub repo. Tool öğrenmek için threat modeling ertelenmesin. Senin için Mermaid bilen bir dev arkadaş kâfi.
PyTM örneği (kod ile threat model)#
from pytm import TM, Server, Datastore, Dataflow, Boundary, Actor
tm = TM("API Service")
internet = Boundary("Internet")
internal = Boundary("Internal Network")
user = Actor("User")
user.inBoundary = internet
api = Server("API Service")
api.inBoundary = internal
db = Datastore("PostgreSQL")
db.inBoundary = internal
req = Dataflow(user, api, "API Request")
req.protocol = "HTTPS"
req.dstPort = 443
query = Dataflow(api, db, "DB Query")
query.protocol = "PostgreSQL"
query.dstPort = 5432
query.isEncrypted = True
tm.process() # threat raporu oluşturur
🚨 Hızlı Tehdit Kontrol Listesi (Kod Review İçin)#
PR review'da 60 saniyede sor:
Authentication#
- Yeni endpoint açıldıysa auth check var mı?
- OAuth scope/audience doğru?
- Token revocation çalışıyor mu?
Authorization#
- Yeni resource için RBAC tanımlı mı?
- Cross-tenant erişim engellendi mi?
- Admin endpoint'leri ayrı RBAC'ta mı?
Input#
- Schema validation var mı (JSON Schema, Zod, Pydantic)?
- SQL parametreli mi (prepared statement)?
- File upload size + content-type kontrolü?
- XSS escape (template engine doğru mu)?
Output#
- Sensitive data log'a düşmüyor mu (token, password, PII)?
- Error message stack trace döndürmüyor mu prod'da?
- CORS doğru kısıtlı mı?
Crypto#
- TLS 1.2+ enforce?
- Hardcoded key/secret yok?
- Hash: bcrypt/scrypt/argon2 (MD5/SHA1 değil)?
Storage#
- Encryption at rest (DB, S3)?
- PII silme prosedürü var mı (KVKK/GDPR right-to-erasure)?
- Backup encrypted?
Network#
- Yeni servis NetworkPolicy'de tanımlı mı?
- Public mi olmalıydı yoksa internal mi?
- Internet'e egress gerekiyor mu, niye?
📊 Anti-Pattern Tablosu#
| Anti-pattern | Niye kötü | Doğru |
|---|---|---|
| "Threat model security ekibinin işi" | Ekip kod yazıyor, sen mimar | TM authoring developer'ında, security review yapıyor |
| Tek seferlik dokuman, raftan tozlu | Mimari değişti, TM eski | Yaşayan dokuman, her major change'de update |
| 100 sayfa formal STRIDE her servise | Aşırı yük → kimse yapmaz | Hafif sürüm 90 dk, derinlik kritik servislerde |
| Risk listesi var, mitigasyon yok | "Görünür" güvenlik | Her tehdit → owner + due date |
| Tehditi formula uydurma | Pseudo-skor itibarsız | Likelihood × Impact 3x3 yeter |
| External services'i scope dışı bırakma | Tedarik zinciri en zayıf halka | 3rd party trust boundary, mitigation yaz |
| Ürünü kullanırken TM yapmak | Mimari kararlar geri alınamaz | Design phase, kod yazılmadan önce |
| Threat catalog yok, her TM sıfırdan | Tekrar eden tehditler atlanır | Internal threat catalog, common pattern'leri kayıt |
🇹🇷 Türkçe Özel: KVKK + LINDDUN#
KVKK kapsamında threat modeling LINDDUN kategorilerini özellikle gerektirir:
| LINDDUN tehdit | KVKK ihlal |
|---|---|
| Linkability | Pseudonymized data → kişi tespit (Madde 28) |
| Identifiability | Aggregated data fakat re-identification (Madde 4) |
| Disclosure | İzinsiz veri paylaşımı (Madde 8-9) |
| Non-compliance | DPIA yapılmamış (Madde 28) |
📌 Pratik: Yeni feature kişisel veri işliyorsa STRIDE + LINDDUN ikisini birden yap. Bkz
19-Compliance/KVKK-Practical.md(Faz 4).
📋 Threat Modeling Checklist#
[ ] Her yeni servis için TM doc var (PR template'inde zorunlu alan)
[ ] TM Git'te, kodla aynı repo'da (yaşar)
[ ] Mermaid DFD + trust boundary'ler net
[ ] STRIDE her komponent için tablolu
[ ] Risk register: L × I matris
[ ] Mitigation: owner + due date + status
[ ] Out-of-scope açıkça belirtilmiş
[ ] Assumptions yazılı (security context, mTLS, vb.)
[ ] PR review'da TM güncellemesi gerektiren değişiklik kontrol ediliyor
[ ] Yıllık tüm critical servis TM'leri refresh
[ ] Security ekibi review imzalı (sign-off)
[ ] Tehdit catalog: tekrar eden pattern'lerin internal kütüphanesi
[ ] PII varsa LINDDUN da yapıldı
📚 Referanslar#
- Threat Modeling: Designing for Security — Adam Shostack (kitap, en iyi başlangıç)
- OWASP Threat Modeling Cheat Sheet — cheatsheetseries.owasp.org
- Microsoft STRIDE — learn.microsoft.com
- LINDDUN — linddun.org
- Threat Dragon — owasp.org/www-project-threat-dragon
- PyTM — github.com/izar/pytm
Kubernetes-Hardening.md— kontrol katalog19-Compliance/KVKK-Practical.md(Faz 4)
"Threat modeling 'paranoid olmak' değil — disiplinli paranoyaktır. Hangi tehdidi gözden kaçırdığını sistematik bilirsin; nelerin endişe edilmeye değmediğini de aynı sistemle bilirsin."