Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,42 @@ jobs:
reports/ci/static-analysis-sample-app.json \
reports/sample-app/static-analysis.json
python -m pytest tests/test_sample_app_security_demo.py -q

dependency-scan:
name: Dependency scan
needs: test
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
cache: pip
cache-dependency-path: pyproject.toml

- name: Install development dependencies
run: python -m pip install -e ".[dev]"

- name: Run offline OSV dependency gate
run: |
python -m tools.run_ci_dependency_scan \
--requirements sample_app/requirements-vulnerable.txt \
--fixture tests/fixtures/osv/fastapi-0.109.0.json \
--output reports/ci/dependency-scan.json \
--fail-on critical

- name: Validate dependency report
run: |
cmp \
reports/ci/dependency-scan.json \
reports/sample-app/dependency-scan.json
python -m pytest \
tests/test_ci_dependency_scan.py \
tests/test_dependency_integration.py -q
78 changes: 66 additions & 12 deletions docs/ci.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# GitHub Actions CI

Bu doküman Backlog 5.1 ve 5.2 kapsamındaki test ve statik analiz pipeline'ının
gereksinimlerini, güvenlik sınırlarını ve çalışma sırasını açıklar.
Bu doküman Backlog 5.1, 5.2 ve 5.3 kapsamındaki test, statik analiz ve
bağımlılık tarama pipeline'ının gereksinimlerini, güvenlik sınırlarını ve
çalışma sırasını açıklar.

## Mevcut Durum

GitHub Actions test ve statik analiz workflow'u tamamlanmıştır:
GitHub Actions test, statik analiz ve bağımlılık tarama workflow'u
tamamlanmıştır:

```text
.github/workflows/ci.yml
Expand All @@ -14,7 +16,9 @@ GitHub Actions test ve statik analiz workflow'u tamamlanmıştır:
Workflow Pull Request değişikliklerinde ve `main` branch push olaylarında
Python 3.11 test paketini çalıştırır. Test gate'i geçtikten sonra proje
kaynaklarını ve kontrollü demo uygulamasını ayrı bir static-analysis job'unda
tarar. Sıradaki aşama dependency scanner ve report artifact job'larıdır.
tarar. Buna paralel dependency-scan job'u, checked-in OSV fixture ile kritik
güvenlik açığı gate'ini çalıştırır. Sıradaki aşama report artifact upload
job'udur.

## Trigger Sözleşmesi

Expand All @@ -35,9 +39,9 @@ permissions:
contents: read
```

Checkout sonrasında credential persistence kapalıdır. Test ve statik analiz
job'ları `ubuntu-latest` runner üzerinde en fazla 10 dakika çalışır. Aynı
workflow ve Git ref için yeni bir run başladığında önceki run iptal edilir.
Checkout sonrasında credential persistence kapalıdır. Üç job da
`ubuntu-latest` runner üzerinde en fazla 10 dakika çalışır. Aynı workflow ve
Git ref için yeni bir run başladığında önceki run iptal edilir.

Bu job'lar secret, write permission, deployment environment veya external
service credential kullanmaz.
Expand Down Expand Up @@ -102,6 +106,40 @@ Exit code veya baseline değişirse job başarısız olur.
Bu aşamada `reports/ci` yalnızca job workspace'inde tutulur. Artifact upload
Backlog 5.4 kapsamında eklenecektir.

## Bağımlılık Tarama Job Akışı

`dependency-scan` job'u test job'una bağlıdır ve statik analiz job'uyla
paralel çalışabilir. Aşağıdaki komut production dependency runner'ını yerel
OSV verisiyle çalıştırır:

```text
python -m tools.run_ci_dependency_scan
```

Workflow girdileri açıkça sabitlenmiştir:

```text
requirements: sample_app/requirements-vulnerable.txt
OSV fixture: tests/fixtures/osv/fastapi-0.109.0.json
report: reports/ci/dependency-scan.json
fail-on: critical
```

`tools/osv_fixture.py`, fixture metadata'sındaki package, ecosystem ve version
değerlerini doğrular ve yalnızca aynı query için cevap verir. Canlı HTTP
client oluşturulmaz. Fixture bulunamazsa, geçersizse, query eşleşmezse veya
scan error üretirse komut fail-closed davranarak exit code `2` döndürür.

Checked-in gerçek OSV kaydı `PYSEC-2024-38` / `CVE-2024-24762` için `HIGH`
severity üretir. CI eşiği `CRITICAL` olduğundan bu kontrollü bulgu raporlanır
ancak job'u başarısız yapmaz. Aynı veri `--fail-on high` ile exit code `1`
üretir; bu davranış testlerle korunur.

Üretilen JSON, `reports/sample-app/dependency-scan.json` baseline'ı ile byte
düzeyinde karşılaştırılır. Ardından offline CI ve production-layer dependency
entegrasyon testleri çalıştırılır. Böylece ağ erişilebilirliği pipeline
sonucunu etkilemez ve fixture drift'i sessizce kabul edilmez.

## Yerel Eşdeğer

CI test adımını yerelde doğrulamak için:
Expand All @@ -128,6 +166,19 @@ python -m pytest tests/test_sample_app_security_demo.py -q
Demo komutunun beklenen exit code değeri `1` olmalıdır. Üretilen demo JSON'u
checked-in baseline ile birebir aynı olmalıdır.

Offline dependency gate'ini yerelde çalıştırmak için:

```powershell
python -m tools.run_ci_dependency_scan `
--requirements sample_app/requirements-vulnerable.txt `
--fixture tests/fixtures/osv/fastapi-0.109.0.json `
--output reports/ci/dependency-scan.json `
--fail-on critical
```

Başarılı kontrollü tarama exit code `0` üretir. Report, gerçek `HIGH` bulguyu
korur; `--fail-on high` kullanıldığında aynı komut exit code `1` döndürür.

Workflow sözleşmesi de normal test paketi içindedir:

```powershell
Expand Down Expand Up @@ -156,6 +207,9 @@ python -m pytest tests/test_python_compatibility.py -q
- Test job'una bağlı statik analiz job'u
- `src`, `tools` ve `sample_app` JSON rapor yolları
- Kontrollü demo exit code ve baseline doğrulaması
- Test job'una bağlı offline dependency-scan job'u
- Açık requirements, fixture, output ve `critical` eşik değerleri
- Dependency baseline ve entegrasyon testi doğrulaması

`tests/test_python_compatibility.py`, `src`, `sample_app`, `tools` ve `tests`
altındaki bütün Python dosyalarını desteklenen en düşük sürüm olan Python
Expand All @@ -165,18 +219,18 @@ geçen Python 3.12+ söz dizimi değişiklikleri CI'a ulaşmadan tespit edilir.
Doğrulanan mevcut sonuç:

```text
CI workflow contract tests: 10 passed
CI workflow contract tests: 13 passed
Offline dependency CI tests: 6 passed
Python 3.11 compatibility tests: 1 passed
Complete test suite: 988 passed
Complete test suite: 997 passed
Workflow YAML parse check: passed
```

## Sonraki Güvenlik Job'ları

Backlog 5.1 ve 5.2 tamamlanmıştır. Sonraki aşamalar:
Backlog 5.1, 5.2 ve 5.3 tamamlanmıştır. Sonraki aşama:

1. Offline OSV fixture-backed dependency scan gate'i
2. Static ve dependency JSON raporlarını workflow artifact olarak yükleme
1. Static ve dependency JSON raporlarını workflow artifact olarak yükleme

Bu ayrım her güvenlik gate'inin davranışını bağımsız olarak incelemeyi sağlar.

Expand Down
41 changes: 41 additions & 0 deletions docs/components/dependency-scanner/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1732,6 +1732,47 @@ Self-analysis: No findings found.
Exit code: 0
```

## Offline CI Dependency Gate

Backlog 5.3 kapsamında dependency scanner production runner'ı deterministik
bir CI komutuna bağlanmıştır:

```powershell
python -m tools.run_ci_dependency_scan `
--requirements sample_app/requirements-vulnerable.txt `
--fixture tests/fixtures/osv/fastapi-0.109.0.json `
--output reports/ci/dependency-scan.json `
--fail-on critical
```

Komut aşağıdaki production katmanlarını değiştirmeden kullanır:

```text
dependency CLI runner
-> DependencyScanner
-> OsvVulnerabilitySource
-> metadata-validated fixture query client
-> dependency JSON formatter
```

Fixture query client yalnızca metadata'da kayıtlı `fastapi==0.109.0` PyPI
query değerini kabul eder ve HTTP çağrısı yapmaz. Eksik veya geçersiz fixture
operational exit code `2` ile gate'i kapalı tutar.

CI eşiği `CRITICAL` olarak belirlenmiştir. Fixture'daki gerçek `HIGH`
`PYSEC-2024-38` bulgusu JSON raporunda korunur ve exit code `0` üretir. Aynı
scan `--fail-on high` seçeneğiyle exit code `1` döndürür. Üretilen report,
checked-in dependency baseline ile byte düzeyinde karşılaştırılır.

Güncel doğrulama:

```text
Offline dependency CI tests: 6 passed
CI workflow contract tests: 13 passed
Complete test suite: 997 passed
Live HTTP requests: disabled
```

## Navigation

- [Tüm bileşenlere dön](../README.md)
Expand Down
15 changes: 8 additions & 7 deletions docs/components/sample-web-app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ Mevcut özellikler:
* Ayrı ve runtime dışı vulnerable dependency fixture'ı
* Portable static-analysis ve dependency-scan JSON baseline'ları
* Offline report generator ve drift check
* Pull Request ve `main` push için pytest ve statik analiz CI job'ları
* Pull Request ve `main` push için test, static ve dependency CI job'ları

Sıradaki aşama dependency scanner ve report artifact CI job'larıdır.
Sıradaki aşama security report artifact upload job'udur.

## Kurulum

Expand Down Expand Up @@ -386,13 +386,13 @@ reports/sample-app/dependency-scan.json
İki raporu production analyzer/scanner katmanlarından yeniden üretmek için:

```powershell
python tools/generate_sample_app_reports.py
python -m tools.generate_sample_app_reports
```

Checked-in artifact'ların güncel olduğunu dosya yazmadan doğrulamak için:

```powershell
python tools/generate_sample_app_reports.py --check
python -m tools.generate_sample_app_reports --check
```

Generator static analyzer'ı doğrudan çalıştırır. Dependency baseline için
Expand Down Expand Up @@ -439,7 +439,7 @@ repository-relative `/` biçimindedir.

```powershell
Get-Content reports/sample-app/dependency-scan.json
python tools/generate_sample_app_reports.py --check
python -m tools.generate_sample_app_reports --check
```

Demo sonunda Flask runtime requirements dosyasının yalnızca `Flask==3.1.3`
Expand Down Expand Up @@ -547,10 +547,11 @@ New update/delete test cases: 54 passed
New frontend test cases: 18 passed
New security demo test cases: 4 passed
New integration report test cases: 6 passed
New CI workflow test cases: 10 passed
New CI workflow test cases: 13 passed
New offline dependency CI test cases: 6 passed
New Python 3.11 compatibility test cases: 1 passed
Sample app targeted suite: 149 passed
Complete test suite: 988 passed
Complete test suite: 997 passed
Compile check: passed
Sample app analysis: 5 expected findings
Analyzer source self-analysis: no findings
Expand Down
4 changes: 2 additions & 2 deletions docs/components/sample-web-app/analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -697,14 +697,14 @@ veri checked-in baseline'ın deterministikliğini değiştirmemelidir.
Tek repository aracı iki raporu birlikte üretmelidir:

```powershell
python tools/generate_sample_app_reports.py
python -m tools.generate_sample_app_reports
```

`--check` modu dosya yazmadan güncellik kontrolü yapmalı ve missing veya stale
artifact için exit code `1` döndürmelidir:

```powershell
python tools/generate_sample_app_reports.py --check
python -m tools.generate_sample_app_reports --check
```

### Demo Sırası
Expand Down
Loading