Exploring Infinite Possibilities on FrontEnd 🚀
Burak Sağlık
Search...

Tue Sep 15 2026

SAST CI/CD Entegrasyonu: PR Güvenlik Otomasyonu Rehberi

SAST CI/CD Entegrasyonu: PR Güvenlik Otomasyonu Rehberi

🎯 Giriş: Pull Request Öncesinde Güvenlik Neden Kritik?

Selam! 👋 Hazırsan bu konuyu beraber açalım.

Pull Request (PR) açtıktan sonra gelen code review süreci genellikle "kod çalışıyor mu?", "style uygun mu?", "mantık doğru mu?" sorularıyla geçer. Ama güvenlik? Genelde son kalan — hatta bazen de unutulan — bir detay olur.

Oysa PR aşamasında güvenlik açıklarını yakalamak, ekip ve ürün için oyun değiştiren bir fark yaratır:

  • 🛡 Erken müdahale = düşük maliyet — Prod'da çıkan bir açık, PR'daki aynı açtan binlerce kat pahalıya mal olur (hotfix, incident, itibar kaybı, compliance cezaları...).
  • 🔁 Geri bildirim döngüsü kısalır — Güvenlik takibi ayrı bir Jira ticket'ı olarak gelmez; developer anında düzeltir, context hala tazedir.
  • Güvenlik kültürü alışkanlık haline gelir — Her PR'da "bunu nasıl exploit edebilirim?" diye düşünmek, zamanla ekibin DNA'sına işler.
  • Supply chain risklerini önlersin — Bağımlılıklar, secrets, yanlış konfigürasyonlar... Bunların çoğu PR'da görülebilir, prod'a gitmeden durdurulabilir.

Kısaca: PR güvenlik kapısı değil, güvenlik filtresi olmalı. 🎯

Hadi şimdi bunu nasıl pratik bir altyapıya dönüştürebileceğimize bakalım — araçlar, akışlar ve alışkanlıklar üzerinden. 🚀


❗️ Sorun: Manuel Kod İncelemesinin Getirdiği Riskler

Hazırsan başlayalım 🎯. Manuel code review, kağıt üzerinde harika kulağa gelse de gerçek hayatta sık sık şu sorunları yaratıyor:

  • Yavaşlık – Her PR için bir insan gözden geçirmek, özellikle büyük ekiplerde günler sürebilir.
  • İnsan hatası – Yorgunluk, dikkat dağınıklığı ya da “bu kadar basit bir değişiklik, bakmaya gerek yok” düşüncesiyle kritik detatlar kaçırılır.
  • Güvenlik odaklı değil – Reviewer’lar genellikle fonksiyonel doğruluka odaklanır; secret’lar, injection noktaları ya da eski bağımlılıklar ikinci planda kalır.

Günlük Hayattan Kesit 🎬

Senaryo: Akşam 18:00, الإنتاجa çıkacak bir feature branch’i merge etmek için onay bekliyorsun. Reviewer “LGTM” der, sen de merge edersin. Ertesi sabah loglarda AWS_SECRET_ACCESS_KEY=AKIA... görünüyor. Hard‑coded secret, production’a sızmış 😱.
Bu durum, manuel gözden geçirme sadece “kod çalışıyor mu?” diye baktığı için gerçekleşti.

Kaçırılan Yaygın Riskler 🚨

  • Hard‑coded secret / API key.env veya config dosyasında düz metin olarak kalıyor.
  • SQL Injection – Kullanıcı girdisi doğrudan sorguya eklenmiş, parametreli sorgu kullanılmamış.
  • Outdated dependencypackage.json/requirements.txt’ta bilinen CVE’li bir sürüm duruyor.
  • Missing authorization checks – Endpoint’te rol kontrolü yok, ama reviewer “iş mantığı doğru” demiş.
# Örnek: Yanlışlıkla commitlenmiş secret
AWS_ACCESS_KEY_ID=AKIAEXAMPLE
AWS_SECRET_ACCESS_KEY=supersecretkey123

Bu sayede ne oluyor?
Secret’lar versiyon kontrolüne girer, CI/CD loglarında görünür ve kötü niyetli birisi eline geçirirse tüm bulut hesabınız ele geçirilebilir ⛔.


Özet: Manuel review güvenlik kata eklemez, sadece fonksiyonel hataları yakalar. Otomatik statik analiz, secret scanning ve bağımlılık denetimi zorunlu birer kapı olmalı 🛠.


🔁 SAST Nedir ve Neden CI/CD İçinde Yer Almalı?

SAST (Static Application Security Testing), kaynak kodunu derlemeden tarayarak güvenlik açıklarını erken yakalayan bir yöntemdir 🎯.
Kodunuzu bir derleyiciye vermeden önce, söz dizimi ağacı (AST) üzerinden kuralları kontrol eder — yani program çalışmadan önce analiz yapar.

Neden SAST kullanmalıyız? 🤔

  • Erken tespit: Geliştirme aşamasında hata bulmak, prod’da düzeltmekten kat kat ucuzdur.
  • Otomasyon dostu: CI/CD pipeline’ına eklendiğinde her push/pull‑request’te otomatik çalışır.
  • Geliştirici geri bildirimi: Hata satırı ve açıklaması doğrudan IDE veya PR yorumlarında görünür → hızlı fix.

SAST hangi zafiyetleri yakalar? 🛡️

  • Cross‑Site Scripting (XSS)
  • SQL Injection
  • Path Traversal
  • Hard‑coded secrets / API keys
  • Insecure deserialization
  • Unvalidated redirects
  • Use‑after‑free, buffer overflow (C/C++ dillerinde)

Kısaca: Kodunuzu “statik” olarak okur, veri akışını ve kontrol akışını analiz ederek riskli desenleri işaretler.

DevSecOps kültürüne nasıl uyar? 🔁

  1. Shift‑Left → Güvenliği en başa (kod yazma anına) taşır.
  2. Pipeline entegrasyonulint/test adımlarıyla aynı stage’de çalışır, build fail olur eğer kritik bulgu varsa.
  3. Geri bildirim döngüsü → Geliştirici PR açar → SAST raporu gelir → Hata düzeltilir → Merge olur.
  4. Metrik toplama → Zamanla bulgu sayısı, giderme süresi ve tekrar eden hatalar takip edilerek süreç iyileştirilir.

Pratik ipucu 💡

  • Küçük başlayın: Sadece kritik kuralları (XSS, SQLi, secret leakage) aktif edin, gürültüyü azaltın.
  • False‑positive yönetimi: İlk çalıştırmada baseline oluşturun, sonra kural setini daraltın.
  • IDE eklentisi: Geliştirici yazarken anlık uyarı alsın, CI beklemek zorunda kalmasın.

Özetle: SAST, kodunuzu derlemeden önce güvenlik gözlüğüyle inceler, CI/CD’nin kalp atışında yer alarak güvenli yazılım teslimatını otomatikleştirir ✅.


🛠 CI/CD Pipeline'ına SAST Entegrasyonu: Adım Adım

Hazırsan GitHub Actions üzerinden CodeQL ile SAST eklemeyi adım adım geçelim. Ben yaptım, sen de aynı mantıkla kendi projene uyarlayabilirsin 🚀

1️⃣ Repository ayarlarını kontrol et

  • Actions sekmesi açık mı? (Settings → Actions → General → Allow all actions)
  • Code scanning alerts için SecurityCode scanningSet up butonuna basıp CodeQL’ı etkinleştir.
  • Gerekli permissions ver: contents: read, security-events: write (pull_request tetikleyicisi için yeterli).

2️⃣ Secret yönetimi

  • CodeQL genellikle token gerektirmez, ama özel bir registry veya private repo kullanıyorsan CODEQL_TOKEN gibi bir secret ekle.
  • Settings → Secrets → Actions → New repository secret → CODEQL_TOKEN (veya GITHUB_TOKEN zaten varsayılan gelir).

3️⃣ Cache stratejisi (hız için)

  • CodeQL veritabanını cache’leyerek tekrar indirmeyi önle.
  • actions/cache@v4 ile key: codeql-${{ runner.os }}-${{ hashFiles('**/codeql-config.yml') }} şeklinde bir key kullan.
  • Restore key olarak codeql-${{ runner.os }}- ekle.

4️⃣ Workflow dosyasını oluştur

.github/workflows/codeql-analysis.yml adıyla şu içeriği ekle:

name: "CodeQL Analysis"

on:
  pull_request:
    branches: [ main, develop ]
  schedule:
    - cron: '0 3 * * 1'   # haftalık tam tarama (opsiyonel)

permissions:
  contents: read
  security-events: write

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    timeout-minutes: 30

    strategy:
      fail-fast: false
      matrix:
        language: [ javascript, typescript, python ]  # projenizdeki diller

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: ${{ matrix.language }}
          config-file: ./.github/codeql/codeql-config.yml   # opsiyonel custom config
          # cache için:
          # cache: true

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3
        with:
          category: "/language:${{ matrix.language }}"
          upload: true

      - name: Upload SARIF results
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: ${{ runner.temp }}/codeql-results.sarif
          category: "/language:${{ matrix.language }}"

Ne oluyor burada?

  • on.pull_request → her PR açıldığında/ güncellendiğinde tetiklenir.
  • matrix.language → birden fazla dil için paralel job çalıştırır.
  • permissions → sonuçları Security sekmesine yazabilmek için security-events: write zorunlu.
  • cache: true (init adımında) → veritabanı indirilmişse tekrar indirmez, pipeline süresini kısaltır.
  • upload-sarif → analiz sonuçlarını GitHub Code Scanning’e gönderir, PR üzerinde SecurityCode scanning alerts olarak görünür.

5️⃣ İlk çalıştırmayı test et

  1. Küçük bir değişiklik yap, PR aç.
  2. Actions sekmesinde CodeQL Analysis workflow’unu izle.
  3. Yeşil tick ✅ alırsan, SAST entegrasyonu hazır!
  4. Varsa uyarıları SecurityCode scanning altından incele, düzelt, tekrar push et.

6️⃣ İleri seviye ipuçları

  • Custom queries: .github/codeql/codeql-config.yml içine kendi query paketlerini ekle.
  • Severity threshold: github/codeql-action/analyze step’ine severity-threshold: high ekleyerek sadece kritik bulguları fail edebilirsin.
  • Monorepo: paths-ignore / paths ile sadece değişen servisleri tara.

Özet:
1️⃣ Repo izinlerini aç → 2️⃣ Secret/token ayarla → 3️⃣ Cache ekle → 4️⃣ Yukarıdaki YAML’ı commit et → 5️⃣ PR ile test et. Artık her PR’de kod güvenliği otomatik kontrol ediliyor 🎉


🔁 Pull Request Sürecinde Otomatik Güvenlik Taraması Akışı

Hazırsan PR açıldığında güvenlik taramasının nasıl devreye girdiğini, sonuçların nereye düştüğünü ve ekip arkadaşların nasıl anında haberdar olduğunu adım adım inceleyelim 🚀

Ne oluyor arka planda?

PR açıldığı anda (veya synchronize / reopened olayında) CI/CD pipeline’ımız SAST job’ını tetikler. Job şunları yapar:

  • Kodun klonlanması ve bağımlılıkların yüklenmesi
  • Seçtiğimiz SAST aracı (ör. CodeQL, Semgrep, SonarCloud) çalıştırılır
  • Sonuçlar SARIF formatında üretilir
  • SARIF dosyası GitHub Checks API’ye yüklenir → PR sayfasında Checks sekmesinde görünür
  • Her bulgu bir Annotation olarak ilgili dosya/satır üzerine işaretlenir
  • Job başarısız olursa (exit code != 0) PR merge engellenir (branch protection rules sayesinde)

🎯 Kısaca: Kod pushlanır → SAST çalışır → Bulgular PR üzerine "yapışır" → Geliştirici PR’i açar açmaz güvendiği satırda uyarıyı görür.


Checks vs Annotations — farkı netleştiriyoruz

Kavram Ne işe yarar? Nerede görünür?
Check Run Tek bir tarama sonucunun özeti (durum, başlık, özet markdown) PR → Checks sekmesi
Annotation Belirli bir dosya+satır aralığına bağlanmış hata/uyarı/not PR → Files changed → satırın yanında 💬 ikonu

Örnek akış:

  1. SAST jobı başlar → in_progress check run oluşturulur
  2. Tarama biter → completed + conclusion: failure (veya success)
  3. Her bulgu için annotations dizisinde birer nesne gönderilir
  4. GitHub bunları PR arayüzüne otomatik yerleştirir

PR yorumunda gördüğümüz SARIF sonucu — JSON örneği

Aşağıda CodeQL / Semgrep çıktısından kesit bir SARIF parçası var. Bu dosya github/codeql-action/upload-sarif action’ına verildiğinde GitHub otomatik annotation’lara dönüştürür 🛠

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Semgrep",
          "version": "1.45.0",
          "informationUri": "https://semgrep.dev"
        }
      },
      "results": [
        {
          "ruleId": "javascript.lang.security.audit.xss.react-dangerously-set-inner-html",
          "level": "error",
          "message": {
            "text": "dangerouslySetInnerHTML XSS riski — kullanıcı girdisi doğrudan render ediliyor"
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "src/components/CommentBox.jsx"
                },
                "region": {
                  "startLine": 23,
                  "startColumn": 12,
                  "endLine": 23,
                  "endColumn": 45
                }
              }
            }
          ],
          "properties": {
            "severity": "HIGH",
            "tags": ["security", "xss", "react"]
          }
        }
      ]
    }
  ]
}

Ne oluyor burada?

  • ruleId → Hangi kural ihlal edildi (Semgrep rule registry’den)
  • level: "error" → GitHub bunu kırmızı annotation (❌) olarak render eder
  • locations[].physicalLocation → Tam dosya yolu + satır/kolon aralığı
  • properties.severity → Ekip filtrelemesi için (CI’da fail-on: high gibi)

Bu JSON results.sarif olarak kaydedip upload edersen, PR → Files changedCommentBox.jsx satır 23’ün yanında kırmızı uyarı simgesi belirir. Üzerine gelince yukarıdaki mesaj tooltip olarak çıkar ✨


Checks API ile kendimiz annotation eklemek istersek — curl örneği

Bazen özel bir linter / script çıktısını manuel Checks API’ye göndermek isteyebiliriz. İşte minimal bir bash snippet’i 👇

#!/usr/bin/env bash
# PR #42 için check run oluşturup annotation ekleme örneği
# GITHUB_TOKEN: repo scope'lu classic token veya GITHUB_ACTIONS runtime token

PR_NUMBER=42
REPO="my-org/my-repo"
HEAD_SHA=$(gh pr view "$PR_NUMBER" --json headRefOid -q .headRefOid)

# 1️⃣ Check run oluştur (in_progress)
CHECK_RUN_ID=$(curl -s -X POST \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "Accept: application/vnd.github+json" \
  "https://api.github.com/repos/$REPO/check-runs" \
  -d "{
    \"name\": \"Custom SAST Scan\",
    \"head_sha\": \"$HEAD_SHA\",
    \"status\": \"in_progress\",
    \"started_at\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
  }" | jq -r .id)

echo "Check run oluşturuldu: $CHECK_RUN_ID"

# 2️⃣ Tarama bitti → annotation'larla completed yap
curl -s -X PATCH \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "Accept: application/vnd.github+json" \
  "https://api.github.com/repos/$REPO/check-runs/$CHECK_RUN_ID" \
  -d "{
    \"status\": \"completed\",
    \"conclusion\": \"failure\",
    \"completed_at\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
    \"output\": {
      \"title\": \"Özel SAST Sonuçları\",
      \"summary\": \"3 HIGH, 5 MEDIUM bulgu bulundu.\",
      \"annotations\": [
        {
          \"path\": \"src/utils/auth.js\",
          \"start_line\": 14,
          \"end_line\": 14,
          \"annotation_level\": \"failure\",
          \"message\": \"Hardcoded JWT secret — env variable kullanılmalı\",
          \"title\": \"Secret Leakage\"
        },
        {
          \"path\": \"src/api/users.js\",
          \"start_line\": 87,
          \"end_line\": 90,
          \"annotation_level\": \"warning\",
          \"message\": \"SQL injection riski — parameterized query kullanın\",
          \"title\": \"SQLi Potential\"
        }
      ]
    }
  }"

Nasıl çalışıyor?

  1. gh pr view ile PR’in head_sha’sını alıyoruz (check run’lar commit’e bağlanır, PR numarasına değil)
  2. İlk POSTin_progress check run yaratır, ID’sini jq ile çekeriz
  3. Tarama bitince PATCHcompleted + conclusion: failure + annotations[] göndeririz
  4. Her annotation: path, start_line/end_line, annotation_level (failure/warning/notice), message

İpucu: annotation_level: "failure" → PR merge’i bloklar (branch protection “Require status checks to pass” açıksa). warning sadece sarı uyarı gösterir, bloklamaz.


Ekip üyeleri nasıl hızlıca feedback alır? 📬

Kanal Ne zaman tetiklenir? Nasıl ayarlarız?
PR Checks sekmesi Her push / rebase Otomatik — herhangi bir ayar gerekmez
Satır içi annotation Check run completed oldunda SARIF upload ya da Checks API annotation
GitHub Actions e-posta / Slack Job failure oldunda Repo → Settings → Notifications / Slack app
CODEOWNERS + required reviewers PR açıldığında .github/CODEOWNERS dosyası + branch protection
Dependabot / CodeQL alert Yeni CVE / pattern eşleştiğinde Security tab → Alert settings

Pratik taktik: Repo ayarlarından "Require status checks to pass before merging" aç, ardından SAST job’ının adını (örn. SAST / Semgrep) required checks listesine ekle. Artık yeşil ✅ gelmeden merge butonu pasif kalır ⛔


Özetle

✅ PR açılır açılmaz SAST koşar
✅ Sonuçlar Checks sekmesinde özet, Files changed’de satır bazında annotation olarak görünür
failure conclusion → PR bloklanır (branch protection sayesinde)
✅ Geliştirici PR’i inceleyip satır üstüne tıklayarak hatayı, öneri fix’i ve kural referansını görür
✅ Ekip Slack/e-posta bildirimiyle anında haberdar olur

Hadi şimdi bu akışı kendi repo’unda deneyelim — bir sonraki bölümde CI/CD pipeline’ına SAST job’ını nasıl ekleyeceğimizi (GitHub Actions / GitLab CI / Azure Pipelines örnekleriyle) göreceğiz 🛠


🛠 Pratik Kontrol Listesi: PR Onayı Öncesi Kontrol Edilmesi Gerekenler

Hazırsan başlayalım ve kontrol listesini birlikte hazırlayalım. Her noktanın neden önemli olduğunu kısa bir şekilde not ettik; böylece ekipte herkes kontrol listesini anlayabilir ve kullanabilir.

Kontrol Açıklama Durum
SAST geçti mi? 🎯 Güvenlik açıklarını erken tespit eder, kod kalitesini artırır ve daha sonra ortaya çıkabilecek kritik riskleri önler.
Dependency scan geçti mi? 🔁 Bağımlılıklardaki zayıf noktaları tespit eder, projeyi bilinen güvenlik açıklarına karşı korur.
Secret scan geçti mi? Yanlışlıkla commit edilen API anahtarlarını, tokenları, kredi kartı bilgilerini tespit eder; veri sızıntılarını önler.
Kod standartları (lint) sağlandı mı? 🛠 Kodun tutarlı ve okunabilir olmasını sağlar, takımın hızla uyum sağlamasını ve refactoring süreçlerini kolaylaştırır.
Test coverage %80+ mi? Testlerin uygulamanın büyük bir bölümünü kapsadığını doğrular, regresyon riskini azaltır ve istatistiksel güvenilirlik sağlar.

Şimdi bu tabloyu PR durum sayfasına ekleyebilir, her maddeyi işaretleyebilir ve onaydan önce ilgili testlerimizi çalıştırabiliriz. Bu sayede ne oluyor? 🎉 Hep birlikte daha güvenilir ve bakımı kolay bir kod tabanına sahip oluyoruz.


🔁 Sık Karşılaşılan Hatalar ve Çözüm İpuçları

Hazırsan bu başlık altına, benim de başımı ağrıtan ve muhtemelen senin de karşına çıkacak "klasik" CodeQL sorunlarını ve nasıl aştığımızı yazayım 🎯


1️⃣ Yanlış Pozitif (False Positive) Çilesi

Ne oluyor burada? Kodun güvenli olduğunu biliyorsun ama CodeQL "SQL Injection riski var!" diye bağırıyor. Örn: test dosyalarında hardcoded şifreler, mock data hazırlayan yardımcı fonksiyonlar, veya framework'ün kendi escape mekanizmasını kullandığın yerler.

Benim yaşadığım bir anekdot: 📖 Bir projede, test klasörü altındaki UserRepositoryTest.java dosyası her tarama da "Hardcoded Credentials" uyarısı veriyordu. Sebep? Test verisi olarak password = "test123" yazmıştım. CodeQL bunu gerçek bir secret sanıyordu. İki hafta boyunca her PR'da bu uyarıyı gördüm, "daha sonra hallederim" diyip geçtim. Sonunda bir sabah kahvem soğuken codeql-config.yml ile exclude ettim — hayat kurtarıcı oldu ✅

Çözüm yolları:

  • Exclude path ile test/mock dosyalarını tarama dışı bırak
  • Severity threshold ayarlayarak sadece error/critical seviyelerini fail et
  • Allowlist / suppression dosyası ile bilinen güvenli pattern'leri bastır

2️⃣ Tarama Süresi Uzarak Gidiyor ⏳

Repo büyüdükçe (özellikle monorepo'larda) tarama 30-40 dakika buluyor. CI/CD pipeline'ın en yavaş adımı CodeQL oluyor.

Pratik ipuçları:

  • Incremental scan kullan → Sadece değişen dosyaları ve etkiledikleri yolları tara
  • actions/cache ile CodeQL veritabanını önbellekle
  • Matrix strategy ile dilleri paralel çalıştır (Java + JS + Python aynı anda)
  • paths-ignore / paths ile unrelated dosya değişikliklerinde tarama tetikleme

Küçük bir hatırlatma: Incremental scan CodeQL CLI 2.12+ ve GitHub Actions codeql-action v2+ ile geldi. Eski action sürümündeysen upgrade et 🛠


3️⃣ Çok Büyük Repolar İçin Incremental Scan

Monorepo yaşıyorsan frontend/, backend/, shared/ ayrı klasörlerde duruyor. Her PR'da hepsini taramak saçma.

Yaklaşımım:

  • codeql-config.yml ile include path belirle → Sadece ilgili modülü tara
  • paths filter ile GitHub Actions workflow tetikleyicisini daralt
  • languages matrix'ini dynamic yap → Değişen dosyanın diline göre tarama çalıştır

4️⃣ False Positive Bastırma: Allowlist & Severity Threshold

İki ana silahın var:

Yöntem Ne Zaman Kullanılır? Nasıl?
Allowlist (suppression) Belirli bir kural, belirli dosyalarda yanlış alarm veriyorsa .github/codeql/codeql-allowlist.yml veya codeql-config.yml içinde query-filters ile
Severity threshold Sadece kritik bulgular pipeline'ı kırsın, warning/info görüntülensin github/codeql-action/analyze step'inde fail-on-severity: error

Benim tercihim: Önce severity threshold ile pipeline'ı yumuşak tut, sonra tek tek false positive'ları allowlist'e ekle. Böylece güvenlik ekibi "neden bu kapalı?" diye sormaz 😄


🛠 Pratik Örnek: codeql-config.yml ile Include/Exclude

Şimdi hadi gerçek bir konfigurasyon yazalım. Bu dosyayı repo köküne .github/codeql/codeql-config.yml olarak koyarsın:

name: "CodeQL Config for Monorepo"
disable-default-queries: false

# Sadece backend ve shared kütüphaneleri tara, frontend'i atla
paths:
  - backend/
  - shared/
paths-ignore:
  - backend/tests/
  - shared/tests/
  - frontend/
  - "**/*Test*.java"
  - "**/*Mock*.java"

# Dil bazlı query pack'leri (isteğe bağlı)
queries:
  - uses: security-and-quality
    language: java
  - uses: security-extended
    language: javascript

# Bilinen false positive'ları bastır
query-filters:
  - exclude:
      id: "java/hardcoded-credentials"
      reason: "Test verileri mock data içeriyor, gerçek secret yok"
    path: "backend/tests/**"
  - exclude:
      id: "js/xss"
      reason: "React'in kendi escape mekanizması kullanılıyor"
    path: "shared/ui-components/**"

# Sadece error ve critical severity pipeline'ı fail etsin
# (Bu ayar workflow dosyasında da yapılabilir, burada dokümantasyon için)
# fail-on-severity: error

Bu sayede ne oluyor?

  • frontend/ tamamen ignore edilir → tarama süresi %40-50 düşer 🚀
  • Test dosyalarındaki hardcoded password'ler artık gürültü yapmaz
  • React component'lerindeki XSS uyarıları bastırılır (çünkü dangerouslySetInnerHTML kullanmıyorsun, React escape ediyor)
  • Pipeline sadece gerçek error/critical bulgularda kırılır

⚡ Küçük Bir Hatırlatma Daha

codeql-config.yml dosyasını workflow'da şöyle çağırırsın:

- name: Initialize CodeQL
  uses: github/codeql-action/init@v3
  with:
    config-file: .github/codeql/codeql-config.yml
    languages: java, javascript

Önemli: config-file parametresi init step'inde verilmeli, analyze step'inde değil. Yanlış yerde verirsen config işlemez ❗️


🎒 Özetle

Sorun Çözüm
False positive gürültüsü Exclude path + allowlist + severity threshold
Tarama çok uzunca sürüyor Incremental scan + cache + matrix + paths-ignore
Monorepo'da her PR'da her şey taranıyor Include path + paths filter + dynamic language matrix
Pipeline her uyarıda kırılıyor fail-on-severity: error ile sadece kritikler fail etsin

Bu yöntemlerle benim pipeline'ım 35 dakikadan 8-10 dakikaya düştü ve gürültü neredeyse sıfırlandı. Sen de denerken takıldığın yer olursa, yorumlarda buluşuruz 🤝


🎯 Sonuç: Güvenliği Kültüre Dönüştürmek

Hazırsanız özetleyelim: SAST + CI/CD + PR otomasyonu = sürekli güvenlik 🚀

  • Ekip alışkanlıklarını değiştirin

    • Her commit’te güvenlik taraması çalıştırın, manuel adım kalmasın.
    • PR şablonuna “Güvenlik kontrolü geçti mi?” checkbox’ı ekleyin.
    • Kod inceleme sırasında güvenlik bulgularını ilk sınıf vatandaş gibi ele alın.
  • Metrikleri takip edin 📊

    • Ortalama tespit süresi (MTTD): Bulgu açıklığından düzeltmeye geçen süre.
    • Ortalama düzeltme süresi (MTTR): PR’da güvenlik hatasının kapatılma hızı.
    • Tarama kapsamı: Kod tabanının yüzde kaçı her pipeline’da taranıyor?
  • Sürekli iyileştirme döngüsü 🔁

    1. Ölç → Metrikleri haftalık toplayın.
    2. Analiz et → Hangi kural en çok false positive üretiyor?
    3. Ayarlay → Kural setini, baseline’i güncelleyin.
    4. Paylaş → Ekipte “Bu hafta ne öğrendik?” kısa bir retro yapın.
  • Bugün başlayın

    • Mevcut CI/CD’nize bir SAST adımı ekleyin (5 dk).
    • PR şablonuna güvenlik checkbox’ını koyun.
    • İlk hafta sonunda MTTD ve MTTR’ı not edin, hedef koyun.

Güvenlik bir “ekstra” değil, günlük rutininizin bir parçası olmalı. Küçük adımlarla başlayın, ölçün, iyileştirin — güvenlik kültürü kendiliğinden büyür. 🌱


🛠 Bonus Tavsiye: Gelişmiş Güvenlik Otomasyonu İçin Araçlar ve Kaynaklar

Hazırsan bu aşamada ekstra değer katan araçları ve faydalı linkleri hızlıca göz atalım 🚀

🎯 Kullanabileceğin araçlar

  • Dependabot – Bağımlılık güncellemelerini otomatik açar, güvenlik yamalarını kaçırmazsın
  • Renovate – Daha esnek kural setleriyle bağımlılık yönetimi, mono‑repo desteği de var
  • Trivy – Container imajları, dosya sistemleri ve Git repo’ları için hızlı SAST/SCA taraması
  • OWASP ZAP – Dinamik uygulama güvenlik testi (DAST) için açık kaynak, CI/CD’ye kolay entegre olur

🔗 Faydalı kaynaklar

  • OWASP SAST Cheat Sheet – Statik analiz kontrolleri için hızlı referans
  • GitHub Docs – Security Features – Dependabot, CodeQL, secret scanning vb. resmi kılavuzlar

📋 Sonraki adım planı (4 basit adım)

  1. Pilot repo seç – Küçük, düşük riskli bir projeyle başla
  2. Pipeline ekle – Yukarıdaki araçlardan en az birini CI/CD’ye entegre et
  3. Checklist’i takımla paylaş – Herkes hangi kontrollerin çalıştığını bilsin
  4. Metrikleri takip et – Bulunan açık sayısı, düzeltme süresi, false‑positive oranı…

Son söz: Güvenlik otomasyonu bir marathon, sprint değil — küçük adımlarla başla, ölç ve iyileştir. Bol güvenli kodlar! 🎉


Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.

Burak Sağlık

Burak Saglik

©2024 Desing and Developed by @Burak Sağlık

All rights reserved