Güvenlik
Giriş — Kale Kapısını Açık Bırakmayın
Ortaçağda bir kale düşünün. Kalede kıymetli hazineler var — altınlar, mücevherler, belgeler. Kalenin duvarları kalın, hendekleri derin. Ama bir gece, bir hizmetkâr arka kapıyı kilitlemeyi unutuyor. Sabah kalktıklarında hazinenin yarısı gitmiş.
Yazılım güvenliğinde de tehdit çoğu zaman "büyük saldırı" değil, "küçük ihmal"dir. Bir API anahtarını GitHub'a yanlışlıkla push etmek. Bilinen bir güvenlik açığı olan bir kütüphaneyi güncellemeden kullanmaya devam etmek. Bir dependency'nin supply chain saldırısına uğradığını fark etmemek.
GitHub, bu tehditleri tespit etmek ve önlemek için güçlü güvenlik araçları sunar. Bu derste Dependabot, secret scanning, code scanning ve SBOM'u detaylıca inceleyeceğiz.
Dependabot — Otomatik Bağımlılık Güncelleme
Problem: Güncel Olmayan Bağımlılıklar
Bir Node.js projesinde 50+ bağımlılık olabilir. Her birinin güvenlik yamaları, bug fix'leri ve yeni versiyonları çıkar. Bunları manuel takip etmek imkânsıza yakındır.
Tipik bir projenin bağımlılık ağacı:
your-app
├── express@4.18.2
│ ├── body-parser@1.20.1
│ │ └── raw-body@2.5.1
│ ├── cookie@0.5.0
│ └── ... 30+ bağımlılık
├── jsonwebtoken@9.0.0
│ ├── jws@3.2.2
│ └── ... 10+ bağımlılık
└── ... 48 paket daha
└── ... yüzlerce transitive bağımlılık
Toplam: 500+ paket!
Her biri potansiyel güvenlik açığı kaynağı.Dependabot Nasıl Çalışır?
Dependabot üç temel iş yapar:
Dependabot Alerts — Bilinen güvenlik açıklarını tespit eder
Dependabot Security Updates — Güvenlik yamaları için otomatik PR açar
Dependabot Version Updates — Tüm bağımlılıkları güncel tutar
Dependabot Alerts
GitHub, projenizin bağımlılıklarını sürekli olarak GitHub Advisory Database ile karşılaştırır. Bilinen bir CVE (Common Vulnerabilities and Exposures) bulunduğunda alert oluşturur.
Repository → Security → Dependabot alerts
Alert Örneği:
──────────────────────────────────────────
🔴 Critical: Prototype Pollution in lodash
Package: lodash
Vulnerable: < 4.17.21
Installed: 4.17.19
Patched: 4.17.21
CVE: CVE-2021-23337
CVSS: 9.8 (Critical)
──────────────────────────────────────────Severity (Önem) seviyeleri:
🔴 Critical (CVSS 9.0-10.0) → Hemen düzelt!
🟠 High (CVSS 7.0-8.9) → En kısa sürede
🟡 Medium (CVSS 4.0-6.9) → Planlı güncelleme
⚪ Low (CVSS 0.1-3.9) → Fırsat buldukçaDependabot Security Updates (Otomatik PR)
Dependabot, güvenlik açığı olan bağımlılık için otomatik olarak PR açabilir:
Repository → Settings → Code security and analysis
☑ Dependabot alerts: Enabled
☑ Dependabot security updates: EnabledOtomatik PR örneği:
PR #127: Bump lodash from 4.17.19 to 4.17.21
Author: dependabot[bot]
Labels: dependencies, security
Bumps lodash from 4.17.19 to 4.17.21.
Release notes:
- 4.17.21: Fix prototype pollution vulnerability
Compatibility score: 98% (based on similar updates)Dependabot Version Updates
Güvenlik yamaları dışında, tüm bağımlılıkları güncel tutmak için version updates kullanılır:
# .github/dependabot.yml
version: 2
updates:
# npm bağımlılıkları
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "09:00"
timezone: "Europe/Istanbul"
# PR limiti
open-pull-requests-limit: 10
# Reviewer atama
reviewers:
- "tech-lead"
# Label ekleme
labels:
- "dependencies"
- "automated"
# Major versiyonları gruplayarak tek PR'da aç
groups:
dev-dependencies:
dependency-type: "development"
update-types:
- "minor"
- "patch"
production-deps:
dependency-type: "production"
update-types:
- "patch"
# Bazı paketleri hariç tut
ignore:
- dependency-name: "aws-sdk"
update-types: ["version-update:semver-major"]
# GitHub Actions versiyonları
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
labels:
- "ci"
- "dependencies"
# Docker base image'ları
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
# Python bağımlılıkları (varsa)
- package-ecosystem: "pip"
directory: "/backend"
schedule:
interval: "weekly"💡 İpucu: Dependabot'un açtığı PR'ları otomatik merge etmek için GitHub Actions kullanabilirsiniz:
# .github/workflows/auto-merge-dependabot.yml
name: Auto-merge Dependabot PRs
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
auto-merge:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- name: Fetch Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
# Sadece patch ve minor güncelllemeleri otomatik merge et
- name: Auto-merge safe updates
if: >
steps.metadata.outputs.update-type == 'version-update:semver-patch' ||
steps.metadata.outputs.update-type == 'version-update:semver-minor'
run: gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Secret Scanning — Sızan Sırları Yakalama
Problem: Yanlışlıkla Push Edilen Sırlar
Her yıl binlerce API anahtarı, veritabanı şifresi ve özel token GitHub'a yanlışlıkla push edilir. Bunların çoğu botlar tarafından dakikalar içinde tespit edilip kötüye kullanılır.
# Tipik kazalar:
git add . # Tüm dosyaları ekleme → .env de dahil!
git commit -m "update config"
git push
# .env dosyasında:
DATABASE_URL=postgres://admin:SuperSecret123@db.acme.com:5432/prod
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
STRIPE_SECRET_KEY=sk_live_abc123xyz456⚠️ Dikkat: Bir secret GitHub'a push edildiği anda, geçmişten silseniz bile tehlike devam eder. Git geçmişi ve GitHub'ın cache'leri nedeniyle secret hâlâ erişilebilir olabilir. Push edilmiş bir secret'ı derhal rotate (yenile) edin.
Secret Scanning Nasıl Çalışır?
GitHub, push edilen her commit'i bilinen secret pattern'leri ile tarar:
Taranan Secret Türleri (200+):
──────────────────────────────────
• AWS Access Keys
• Azure Storage Keys
• Google Cloud API Keys
• GitHub Personal Access Tokens
• Stripe API Keys
• Slack Webhooks
• Database connection strings
• SSH Private Keys
• JWT Secret Keys
• SendGrid API Keys
• Twilio Auth Tokens
• ... ve çok daha fazlasıSecret Scanning Akışı:
git push
│
▼
GitHub tarar ──► Secret bulundu!
│ │
│ ▼
│ Alert oluşturulur
│ │
│ ▼
│ (Push protection aktifse)
│ Push ENGELLE 🚫
│
▼
Secret sağlayıcıya bildirilir
(ör: AWS, Stripe → token otomatik iptal)Aktifleştirme
Repository → Settings → Code security and analysis
☑ Secret scanning: Enabled
☑ Push protection: Enabled (ÖNEMLİ!)Push Protection — Secret'ı Committe Bile Almayın
Push protection, secret içeren commit'lerin push edilmesini engeller:
$ git push origin main
remote: ──── GitHub push protection ────────────────────────
remote: — Push blocked: secret detected
remote:
remote: Secret type: AWS Access Key
remote: Location: config/settings.py:15
remote:
remote: To push, remove the secret and try again.
remote: If this is a false positive, you can bypass:
remote: https://github.com/acme/app/security/secret-scanning/...
remote: ───────────────────────────────────────────────────────
! [remote rejected] main -> main (push declined due to secret scanning)Yanlışlıkla Push Ettiyseniz
# 1. HEMEN secret'ı revoke/rotate edin
# AWS Console → IAM → Rotate key
# GitHub → Settings → Developer settings → Revoke token
# Stripe Dashboard → Roll API keys
# 2. Git geçmişinden temizleyin
# (ama rotate etmek daha önemli!)
git filter-repo --path-glob '*.env' --invert-paths
# 3. .gitignore'a ekleyin
echo ".env" >> .gitignore
echo ".env.local" >> .gitignore
echo ".env.production" >> .gitignoreCustom Secret Patterns
Şirketinize özel secret formatlarınız varsa, custom pattern tanımlayabilirsiniz:
Organization → Settings → Code security → Secret scanning
→ Custom patterns → New pattern
Pattern adı: Acme Internal API Key
Secret format regex: acme_key_[a-zA-Z0-9]{32}
Test string: acme_key_abc123def456ghi789jkl012mno345Code Scanning — Kodda Güvenlik Açığı Arama
CodeQL Nedir?
CodeQL, GitHub'ın statik analiz motorudur. Kodunuzu derleme aşamasında analiz ederek güvenlik açıklarını, bug'ları ve anti-pattern'leri tespit eder.
CodeQL'in Tespit Ettiği Sorunlar:
──────────────────────────────────
• SQL Injection
• Cross-Site Scripting (XSS)
• Path Traversal
• Command Injection
• Insecure Deserialization
• Hardcoded Credentials
• Buffer Overflow
• Race Conditions
• ... yüzlerce kuralCodeQL Kurulumu
# .github/workflows/codeql.yml
name: "CodeQL Analysis"
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1' # Her Pazartesi sabah
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['javascript-typescript']
# Desteklenen: javascript-typescript, python, java-kotlin,
# csharp, cpp, go, ruby, swift
steps:
- uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# Ek query paketleri
queries: +security-extended,security-and-quality
- name: Build (gerekiyorsa)
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"Code Scanning Sonuçları
Repository → Security → Code scanning alerts
Alert Örneği:
──────────────────────────────────────────
🔴 SQL Injection vulnerability
File: src/api/users.js:42
const query = `SELECT * FROM users WHERE id = ${req.params.id}`;
^^^^^^^^^^^^
User-controlled data flows into SQL query without sanitization.
Recommendation: Use parameterized queries
const query = 'SELECT * FROM users WHERE id = $1';
const result = await db.query(query, [req.params.id]);
──────────────────────────────────────────PR'da Code Scanning
CodeQL, PR'larda otomatik yorum bırakır:
PR Check: CodeQL Analysis
❌ 1 new alert found
🔴 src/api/auth.js:28
Cross-site scripting (XSS)
User input is rendered without encoding.
Suggested fix:
- res.send(`<h1>${req.query.name}</h1>`);
+ res.send(`<h1>${escapeHtml(req.query.name)}</h1>`);SBOM — Yazılım Malzeme Listesi
SBOM Nedir?
SBOM (Software Bill of Materials), yazılımınızda kullanılan tüm bileşenlerin listesidir. Bir binanın malzeme listesi gibi düşünün: hangi marka çimento, hangi kalınlıkta demir, hangi tip kablo kullanıldığı... Sorun çıkınca hangi bileşenin etkilendiğini hemen tespit edersiniz.
SBOM Örneği (basitleştirilmiş):
Your Application v1.0.0
├── express@4.18.2 (MIT License)
├── jsonwebtoken@9.0.0 (MIT License)
├── bcrypt@5.1.0 (MIT License)
├── pg@8.11.3 (MIT License)
├── lodash@4.17.21 (MIT License)
└── ... 95 paket daha
Toplam: 100 doğrudan bağımlılık
485 transitive bağımlılık
3 farklı lisans türü
0 bilinen güvenlik açığı ✅SBOM Oluşturma
# GitHub'da SBOM dışa aktarma
# Repository → Insights → Dependency graph → Export SBOM
# Formatlar:
# SPDX (ISO/IEC 5962:2021 standardı)
# CycloneDX
# GitHub CLI ile:
gh api repos/{owner}/{repo}/dependency-graph/sbom \
--jq '.sbom' > sbom.spdx.jsonDependency Graph
GitHub, her repository için otomatik dependency graph oluşturur:
Repository → Insights → Dependency graph
Sekmeler:
• Dependencies — sizin kullandığınız paketler
• Dependents — sizin paketinizi kullananlar
• Dependabot — güncelleme durumuSupply Chain Security
Tedarik Zinciri (Supply Chain) Saldırı Türleri:
1. Dependency Confusion
→ Özel paket adıyla aynı isimde public paket yayınlama
Önlem: Scope kullanın (@company/package)
2. Typosquatting
→ "lodash" yerine "lodassh" gibi benzer isimli kötü paket
Önlem: Lockfile kullanın, paket isimlerini kontrol edin
3. Maintainer Hesap Ele Geçirme
→ Popüler paketin maintainer'ının hesabı çalınıyor
Önlem: npm provenance, sigstore
4. Build Pipeline Saldırısı
→ CI/CD pipeline'ına kötü kod enjekte etme
Önlem: Actions'ları SHA ile pin'leyin# Actions'ları SHA ile pin'lemek (güvenli)
# ❌ Tag ile (değiştirilebilir)
- uses: actions/checkout@v4
# ✅ SHA ile (değiştirilemez)
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1💡 İpucu: StepSecurity'nin
harden-runneraction'ı, CI pipeline'ınızda beklenmeyen ağ erişimlerini tespit eder:
- uses: step-security/harden-runner@v2
with:
egress-policy: audit # veya 'block'Security Policy ve Advisories
SECURITY.md Dosyası
Her projede güvenlik açığı raporlama prosedürünü açıklayan bir dosya olmalıdır:
<!-- SECURITY.md -->
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 2.x.x | ✅ Active support |
| 1.x.x | ⚠️ Security only |
| < 1.0 | ❌ End of life |
## Reporting a Vulnerability
**Please DO NOT open a public issue for security vulnerabilities.**
Instead, use GitHub's private vulnerability reporting:
1. Go to Security → Advisories → New draft advisory
2. Describe the vulnerability
3. We will respond within 48 hours
Or email: security@acme.com (PGP key available)
## Bug Bounty
We offer rewards for responsibly disclosed vulnerabilities:
- Critical: $500-$2000
- High: $200-$500
- Medium: $50-$200Private Vulnerability Reporting
Repository → Settings → Code security and analysis
☑ Private vulnerability reporting: Enabled
Bu sayede:
1. Araştırmacı gizli olarak güvenlik açığı bildirebilir
2. Siz düzeltme yaparsınız
3. CVE numarası alırsınız (opsiyonel)
4. Düzeltme yayınlandıktan SONRA açıklama yapılırGüvenlik Dashboard'u
Organization → Security → Overview
Dashboard gösterir:
• Kaç repo'da secret scanning aktif
• Kaç open Dependabot alert var
• Kaç code scanning alert var
• En riskli repository'ler
• Trend grafikleri
Severity dağılımı:
🔴 Critical: 2 alerts
🟠 High: 5 alerts
🟡 Medium: 12 alerts
⚪ Low: 8 alertsGüvenlik Checklist'i
## 🛡️ Proje Güvenlik Checklist'i
### Bağımlılık Güvenliği
- [ ] Dependabot alerts aktif
- [ ] Dependabot security updates aktif
- [ ] Dependabot version updates yapılandırıldı
- [ ] Lock dosyası repo'da (package-lock.json / pnpm-lock.yaml)
- [ ] npm audit clean (0 vulnerability)
### Secret Yönetimi
- [ ] Secret scanning aktif
- [ ] Push protection aktif
- [ ] .gitignore'da: .env, .env.*, credentials
- [ ] Secrets → GitHub Secrets / Vault / Parameter Store
- [ ] Hiçbir secret repo'da değil
### Kod Güvenliği
- [ ] CodeQL aktif (PR ve schedule)
- [ ] Security-extended query suite kullanılıyor
- [ ] 0 critical/high code scanning alert
### Genel
- [ ] SECURITY.md mevcut
- [ ] Private vulnerability reporting aktif
- [ ] Branch protection aktif
- [ ] 2FA zorunlu (organization)
- [ ] Third-party Actions SHA ile pin'lenmiş
- [ ] SBOM oluşturulabiliyorYaygın Hatalar
1. .env Dosyasını Commit Etmek
# ❌ En klasik hata
git add .
git commit -m "initial commit"
# .env de dahil oldu!
# ✅ Proje başında .gitignore ayarla
echo ".env*" >> .gitignore
# .env.example dosyası oluştur (değerler placeholder)
cp .env .env.example
# Gerçek değerleri placeholder ile değiştir
sed -i 's/=.*/=your_value_here/' .env.example
git add .gitignore .env.example2. Dependabot PR'larını İhmal Etmek
# ❌ 30 açık Dependabot PR'ı birikmiş
# "Sonra bakarız" → asla bakılmaz → güvenlik açıkları büyür
# ✅ Haftalık Dependabot review rutini
# Patch updates → Otomatik merge (CI geçiyorsa)
# Minor updates → Hızlı review
# Major updates → Dikkatli review + test3. Actions'ları Tag ile Kullanmak
# ❌ Tag değiştirilebilir (supply chain risk)
- uses: actions/checkout@v4
# ✅ SHA ile pin'le
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11Özet
Bu derste GitHub'ın güvenlik ekosistemini baştan sona inceledik:
🔄 Dependabot — bağımlılık güncelleme, güvenlik yamaları, otomatik PR
🔑 Secret Scanning — push edilen secret'ları tespit, push protection ile engel
🔍 CodeQL — statik analiz ile SQL injection, XSS gibi açıkları bulma
📋 SBOM — yazılım bileşen listesi, supply chain görünürlüğü
🏗️ Supply Chain Security — dependency confusion, typosquatting, pin SHA
📝 SECURITY.md — güvenlik açığı raporlama prosedürü
🛡️ Güvenlik Dashboard — organization-wide güvenlik durumu izleme
Bir sonraki bölümde ileri Git tekniklerine geçiyoruz: history rewriting, LFS, reflog kurtarma ve performans optimizasyonu.
AI Asistan
Sorularını yanıtlamaya hazır