devsecops-radar 0.3.6__tar.gz → 0.3.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devsecops_radar-0.3.6/devsecops_radar.egg-info → devsecops_radar-0.3.9}/PKG-INFO +119 -75
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/README.md +119 -75
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/auth.py +5 -4
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/dashboard/routes.py +1 -1
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9/devsecops_radar.egg-info}/PKG-INFO +119 -75
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/pyproject.toml +1 -1
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/LICENSE +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/MANIFEST.in +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/cli/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/cli/scanner.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/analyzer.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/attack_simulation.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/database.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/models.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/parser.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/rag.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/remediation.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/reporting.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/rule_fusion.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/sbom.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/settings.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/core/valuation.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/plugins/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/adapter.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/base.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/gitleaks.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/poutine.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/semgrep.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/trivy.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/scanners/zizmor.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/app.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/attack_paths/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/attack_paths/routes.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/dashboard/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/sentry/routes.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/css/bootstrap.min.css +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/css/style.css +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/js/bootstrap.bundle.min.js +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/js/chart.umd.min.js +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/js/dashboard.js +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/summary/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/summary/routes.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/templates/index.html +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/topology/__init__.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/topology/routes.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/SOURCES.txt +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/dependency_links.txt +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/entry_points.txt +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/requires.txt +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/top_level.txt +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/setup.cfg +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_analyzer.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_api.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_cli.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_database.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_rule_fusion.py +0 -0
- {devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/tests/test_scanners.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsecops-radar
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.9
|
|
4
4
|
Summary: Unified CI/CD Security Dashboard — Pipeline Sentinel
|
|
5
5
|
Author-email: Mehrdoost <70381337+Mehrdoost@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,16 +27,16 @@ Requires-Dist: pytest>=8.0
|
|
|
27
27
|
Requires-Dist: pytest-flask>=1.3
|
|
28
28
|
Dynamic: license-file
|
|
29
29
|
|
|
30
|
-
<!-- markdownlint-disable MD033 MD041 -->
|
|
31
30
|
<div align="center">
|
|
32
31
|
|
|
33
32
|
# 🛡️ Pipeline Sentinel
|
|
33
|
+
|
|
34
34
|
**The Open‑Source DevSecOps Command Center — Unify, Analyse, Remediate.**
|
|
35
35
|
|
|
36
36
|
[](https://pypi.org/project/devsecops-radar/)
|
|
37
37
|
[](LICENSE)
|
|
38
38
|
[](https://github.com/Mehrdoost/devsecops-radar/releases)
|
|
39
|
-
[](https://github.com/Mehrdoost/devsecops-radar/actions)
|
|
40
40
|
[](https://github.com/Mehrdoost/devsecops-radar/stargazers)
|
|
41
41
|
|
|
42
42
|
</div>
|
|
@@ -46,21 +46,24 @@ Dynamic: license-file
|
|
|
46
46
|
---
|
|
47
47
|
|
|
48
48
|
## 📖 Table of Contents
|
|
49
|
+
|
|
49
50
|
1. [What Is Pipeline Sentinel? (Simple Explanation)](#-what-is-pipeline-sentinel-simple-explanation)
|
|
50
51
|
2. [Why You Need It](#-why-you-need-it)
|
|
51
52
|
3. [Where to Run It in Your Network](#-where-to-run-it-in-your-network)
|
|
52
53
|
4. [Dashboard Preview](#-dashboard-preview)
|
|
53
54
|
5. [Quick Start](#-quick-start)
|
|
54
|
-
6. [
|
|
55
|
-
7. [
|
|
56
|
-
8. [
|
|
57
|
-
9. [
|
|
58
|
-
10. [
|
|
59
|
-
11. [
|
|
60
|
-
12. [
|
|
61
|
-
13. [
|
|
62
|
-
14. [
|
|
63
|
-
15. [
|
|
55
|
+
6. [Prerequisites](#-prerequisites)
|
|
56
|
+
7. [Installation](#-installation)
|
|
57
|
+
8. [How to Use (Step‑by‑Step)](#-how-to-use-stepbystep)
|
|
58
|
+
9. [Complete Command Reference](#-complete-command-reference)
|
|
59
|
+
10. [Core Capabilities](#-core-capabilities)
|
|
60
|
+
11. [Community Rules & Online Updates](#-community-rules--online-updates)
|
|
61
|
+
12. [Architecture](#️-architecture)
|
|
62
|
+
13. [Roadmap](#️-roadmap)
|
|
63
|
+
14. [Testing & CI](#-testing--ci)
|
|
64
|
+
15. [Contributing](#-contributing)
|
|
65
|
+
16. [Author](#-author)
|
|
66
|
+
17. [License](#-license)
|
|
64
67
|
|
|
65
68
|
---
|
|
66
69
|
|
|
@@ -79,13 +82,13 @@ Think of it as a **security camera system for your entire CI/CD pipeline** — i
|
|
|
79
82
|
In 2026, **supply chain attacks** have become the #1 threat. Tools like Trivy themselves were compromised, and attackers now inject malicious code directly into build pipelines. **You can no longer just scan your code; you must scan your pipeline.**
|
|
80
83
|
|
|
81
84
|
Pipeline Sentinel gives you:
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
85
|
+
* **One screen for all scanners** – stop juggling log files.
|
|
86
|
+
* **AI that understands attack chains** – “A leaked secret + an old library = a disaster.”
|
|
87
|
+
* **Automatic fixes** – with a single flag, it patches files and opens a pull request.
|
|
88
|
+
* **Human review mode** – inspect each fix before applying.
|
|
89
|
+
* **Compliance reports** – generate a PDF for your boss or auditor.
|
|
90
|
+
* **100% offline capable** – works in air‑gapped environments where security matters most.
|
|
91
|
+
* **Interactive wizard** – one command to get everything running.
|
|
89
92
|
|
|
90
93
|
---
|
|
91
94
|
|
|
@@ -110,14 +113,15 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
|
|
|
110
113
|
[Gitleaks scan] ┘
|
|
111
114
|
```
|
|
112
115
|
|
|
113
|
-
> **📌 Diagram Placeholder:**
|
|
114
|
-
|
|
116
|
+
> **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
|
|
117
|
+
> ``
|
|
115
118
|
|
|
116
119
|
---
|
|
117
120
|
|
|
118
121
|
## 📸 Dashboard Preview
|
|
119
122
|
|
|
120
123
|

|
|
124
|
+
|
|
121
125
|
*(Severity doughnut, trend line chart, attack‑path graph (clickable nodes), topology view, executive summary — all fully offline.)*
|
|
122
126
|
|
|
123
127
|
---
|
|
@@ -144,6 +148,24 @@ devsecops-radar --wizard
|
|
|
144
148
|
|
|
145
149
|
---
|
|
146
150
|
|
|
151
|
+
## 📋 Prerequisites
|
|
152
|
+
|
|
153
|
+
Pipeline Sentinel relies on external security tools to produce the JSON reports it consumes. You must install these tools separately according to your needs.
|
|
154
|
+
|
|
155
|
+
**Required for offline scanning:**
|
|
156
|
+
* Trivy (installation)
|
|
157
|
+
* Semgrep (installation)
|
|
158
|
+
* Poutine (installation)
|
|
159
|
+
* Zizmor (installation)
|
|
160
|
+
* Gitleaks (installation)
|
|
161
|
+
|
|
162
|
+
**Optional (for AI analysis):**
|
|
163
|
+
* Ollama (installation)
|
|
164
|
+
|
|
165
|
+
> 📖 **See `PREREQUISITES.md` for more details.**
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
147
169
|
## 📦 Installation
|
|
148
170
|
|
|
149
171
|
### Option 1 — PyPI (Recommended)
|
|
@@ -199,19 +221,19 @@ gitleaks detect --source . --report-format json --report-path gitleaks.json
|
|
|
199
221
|
```bash
|
|
200
222
|
devsecops-radar --trivy trivy.json --semgrep semgrep.json --poutine poutine.json --zizmor zizmor.json --gitleaks gitleaks.json
|
|
201
223
|
```
|
|
202
|
-
This produces a single `findings.json` with all findings merged and normalised
|
|
224
|
+
*This produces a single `findings.json` with all findings merged and normalised.*
|
|
203
225
|
|
|
204
226
|
### 3. View the Dashboard
|
|
205
227
|
```bash
|
|
206
228
|
devsecops-radar-web
|
|
207
229
|
```
|
|
208
230
|
The dashboard shows:
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
231
|
+
* **Severity Breakdown** – Doughnut chart
|
|
232
|
+
* **Trend Over Time** – Line chart from scan history
|
|
233
|
+
* **Pipeline Security** – Poutine + Zizmor statistics card
|
|
234
|
+
* **Attack Path Graph** – Interactive D3.js graph (click nodes for details)
|
|
235
|
+
* **Executive Summary** – Risk score and AI‑generated summary
|
|
236
|
+
* **Findings Table** – Searchable, filterable, paginated
|
|
215
237
|
|
|
216
238
|
### 4. Enable AI Analysis (Optional)
|
|
217
239
|
```bash
|
|
@@ -220,10 +242,10 @@ devsecops-radar --trivy trivy.json --analyze
|
|
|
220
242
|
devsecops-radar-web
|
|
221
243
|
```
|
|
222
244
|
The LLM generates `findings_ai_summary.json` containing:
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
245
|
+
* `executive_summary`, `risk_score`
|
|
246
|
+
* `attack_paths` with MITRE ATT&CK tactics
|
|
247
|
+
* `top_remediations` (some with `fix_diff`)
|
|
248
|
+
* `false_positives_likely`
|
|
227
249
|
|
|
228
250
|
### 5. Auto‑Remediation (with Human Review)
|
|
229
251
|
```bash
|
|
@@ -233,7 +255,7 @@ devsecops-radar --trivy trivy.json --analyze --fix
|
|
|
233
255
|
# Review each fix before applying
|
|
234
256
|
devsecops-radar --trivy trivy.json --analyze --fix --review
|
|
235
257
|
```
|
|
236
|
-
The tool creates a new git branch `auto-fix` and pushes it for review
|
|
258
|
+
*The tool creates a new git branch `auto-fix` and pushes it for review.*
|
|
237
259
|
|
|
238
260
|
### 6. Policy Enforcement
|
|
239
261
|
Create a `policy.json` file:
|
|
@@ -247,7 +269,7 @@ Create a `policy.json` file:
|
|
|
247
269
|
```bash
|
|
248
270
|
devsecops-radar --trivy trivy.json --policy policy.json
|
|
249
271
|
```
|
|
250
|
-
If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates
|
|
272
|
+
*If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates.*
|
|
251
273
|
|
|
252
274
|
### 7. Generate Compliance Reports
|
|
253
275
|
```bash
|
|
@@ -312,18 +334,18 @@ Built‑in support for five scanners with a real plugin system. Third‑party sc
|
|
|
312
334
|
| **Gitleaks**| Secrets detection | `--gitleaks` |
|
|
313
335
|
|
|
314
336
|
### 🧩 Hybrid RuleFusion Engine
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
337
|
+
* **Offline** – Load custom JSON rules from any local directory (`--rules ~/my-rules/`)
|
|
338
|
+
* **Online** – Pull community‑curated rules from a configurable Git repository (`--update-rules`)
|
|
339
|
+
* Auto‑detects Trivy, Semgrep, Poutine, Zizmor, and plain‑list formats
|
|
340
|
+
* Policy evaluation built directly into the engine
|
|
341
|
+
* Community rules repo: `devsecops-radar-rules` (configurable via `COMMUNITY_RULES_REPO`)
|
|
320
342
|
|
|
321
343
|
### 🧠 LLM‑Powered Analysis
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
344
|
+
* Retry logic with exponential backoff for unstable endpoints
|
|
345
|
+
* Few‑shot examples covering real‑world supply chain attack chains
|
|
346
|
+
* Token‑aware selection (max items configurable via `ANALYZER_MAX_FINDINGS`)
|
|
347
|
+
* Structured JSON output: `executive_summary`, `risk_score`, `attack_paths` (MITRE ATT&CK), `top_remediations`, `false_positives_likely`
|
|
348
|
+
* Ollama (local, offline) and LiteLLM (OpenAI, Anthropic, etc.) support
|
|
327
349
|
|
|
328
350
|
### 🕸️ Multi‑Step Attack Path Visualization
|
|
329
351
|
Interactive D3.js force graph that chains findings into realistic attack scenarios. Click any node to see detailed finding information. Accepts a topology file to map findings onto your actual infrastructure, showing lateral movement across servers and subnets.
|
|
@@ -343,17 +365,17 @@ AI‑suggested fixes can be applied automatically (`--fix`) or reviewed one‑by
|
|
|
343
365
|
|
|
344
366
|
### 📊 Compliance & Executive Reports (with Redaction)
|
|
345
367
|
Generate professional PDF reports (`--report report.pdf`) with:
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
368
|
+
* Executive summary and risk score
|
|
369
|
+
* Findings table (first 50 items)
|
|
370
|
+
* Compliance mapping (CIS, PCI‑DSS, ISO 27001)
|
|
371
|
+
* Automatic redaction of passwords, tokens, JWTs
|
|
350
372
|
|
|
351
373
|
### 📈 Scan History & Trends (with Pagination)
|
|
352
374
|
SQLAlchemy‑backed database with server‑side pagination (`/api/findings?page=1&per_page=50`). Scan history is stored efficiently, enabling fast trend charts and historical comparisons.
|
|
353
375
|
|
|
354
376
|
### 🧪 SBOM & Dependency Confusion Detection
|
|
355
|
-
*
|
|
356
|
-
*
|
|
377
|
+
* Generate a CycloneDX SBOM from your project using `syft`
|
|
378
|
+
* Detect dependency confusion risks in `package.json` and `requirements.txt` — internal packages that could be impersonated by public registries
|
|
357
379
|
|
|
358
380
|
### 🔍 RAG‑Powered Security Search
|
|
359
381
|
Ask natural language questions about your scan history: *“When was the last Log4j vulnerability found?”* The built‑in RAG endpoint (`/api/rag?q=...`) searches stored findings and returns matches.
|
|
@@ -368,10 +390,34 @@ Beyond CVSS, each finding gets a dynamic risk score based on asset exposure (fro
|
|
|
368
390
|
A `--wizard` flag walks new users through installing dependencies, pulling AI models, and running their first scan — all in one go.
|
|
369
391
|
|
|
370
392
|
### 🔒 Privacy & Offline‑First
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
393
|
+
* All assets (CSS, JS) are embedded — zero CDN calls
|
|
394
|
+
* LLM analysis runs locally with Ollama; no data leaves your network
|
|
395
|
+
* Optional API key authentication for the dashboard (JWT supported)
|
|
396
|
+
* Docker image runs as non‑root user
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## 🌍 Community Rules & Online Updates
|
|
401
|
+
|
|
402
|
+
Pipeline Sentinel features a community‑driven rule marketplace housed in a separate repository: `devsecops-radar-rules`.
|
|
403
|
+
|
|
404
|
+
### How It Works
|
|
405
|
+
The repository contains curated JSON rule files for all supported scanners (Trivy, Semgrep, Poutine, Zizmor, Gitleaks) and generic compliance checks. Anyone can contribute by submitting a Pull Request with new or improved rules.
|
|
406
|
+
|
|
407
|
+
Users can pull the latest rules with a single command:
|
|
408
|
+
```bash
|
|
409
|
+
devsecops-radar --update-rules
|
|
410
|
+
```
|
|
411
|
+
Rules are stored locally in `~/.devsecops-radar/community-rules/`. To use them alongside your scanner results:
|
|
412
|
+
```bash
|
|
413
|
+
devsecops-radar --trivy scan.json --rules ~/.devsecops-radar/community-rules/
|
|
414
|
+
```
|
|
415
|
+
You can even point to your own fork or a private repository by setting the `COMMUNITY_RULES_REPO` environment variable. This turns Pipeline Sentinel into a living, community‑improved security platform — just like Nuclei Templates or Semgrep Registry.
|
|
416
|
+
|
|
417
|
+
### Contributing a Rule
|
|
418
|
+
1. Fork the `devsecops-radar-rules` repository.
|
|
419
|
+
2. Add a new JSON file to the `rules/` directory (or modify an existing one). Follow the standard Pipeline Sentinel finding format (see the repo’s README).
|
|
420
|
+
3. Open a Pull Request — our maintainers will review and merge.
|
|
375
421
|
|
|
376
422
|
---
|
|
377
423
|
|
|
@@ -421,44 +467,42 @@ devsecops_radar/
|
|
|
421
467
|
| ✅ **Phase 3** | Human review mode (`--review`) | Done |
|
|
422
468
|
| ✅ **Phase 3** | Gitleaks secret scanner | Done |
|
|
423
469
|
| ✅ **Phase 3** | Security badge endpoint | Done |
|
|
470
|
+
| ✅ **Phase 3** | Full test suite & CI pipeline | Done |
|
|
424
471
|
| 🔲 **Phase 4** | Jira / Slack integration | Planned |
|
|
425
472
|
| 🔲 **Phase 4** | SARIF & CycloneDX support | Planned |
|
|
426
|
-
| 🔲 **Phase 4** | Rule Marketplace (community YAML rules) | Planned |
|
|
427
473
|
| 🔲 **Phase 4** | Pull Request assistant (GitHub App) | Planned |
|
|
428
474
|
|
|
429
|
-
> See the [open issues](https://github.com/Mehrdoost/devsecops-radar/issues) for a full list of proposed features.
|
|
430
|
-
|
|
431
475
|
---
|
|
432
476
|
|
|
433
|
-
##
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
477
|
+
## 🧪 Testing & CI
|
|
478
|
+
|
|
479
|
+
Pipeline Sentinel is thoroughly tested to ensure reliability for production use.
|
|
480
|
+
* **Unit & Integration Tests:** 23 tests covering scanners, rule engine, database, analyzer, API, and CLI.
|
|
481
|
+
* **CI Pipeline:** Every push and pull request triggers automated testing (pytest) and linting (ruff) via GitHub Actions.
|
|
482
|
+
|
|
483
|
+
You can run the tests locally:
|
|
484
|
+
```bash
|
|
485
|
+
pip install -e .
|
|
486
|
+
pip install pytest pytest-flask ruff
|
|
487
|
+
pytest tests/ -v
|
|
488
|
+
ruff check .
|
|
444
489
|
```
|
|
445
|
-
*The action merges findings, creates a job summary, and outputs CRITICAL/HIGH counts.*
|
|
446
490
|
|
|
447
491
|
---
|
|
448
492
|
|
|
449
493
|
## 🤝 Contributing
|
|
450
494
|
|
|
451
|
-
|
|
452
|
-
If you would like to integrate a new scanner, open an issue with a sample of its JSON output.
|
|
453
|
-
For permanent scanner plugins, extend the `ScannerPlugin` class and register it via entry points.
|
|
495
|
+
We welcome contributions of all kinds! Please read our `CONTRIBUTING.md` for detailed guidelines on how to set up the project, add new scanners, or submit rule changes. For contributing community rules, see the Community Rules section above.
|
|
454
496
|
|
|
455
497
|
---
|
|
456
498
|
|
|
457
499
|
## 👨💻 Author
|
|
458
500
|
|
|
459
|
-
**
|
|
501
|
+
**ReverseForge** — ( Mehrdoost And Mi0r4 )
|
|
460
502
|
|
|
461
|
-
[](https://github.com/
|
|
503
|
+
[cite_start][](https://github.com/ReverseForge)
|
|
504
|
+
[cite_start][](https://github.com/Mehrdoost)
|
|
505
|
+
[cite_start][](https://github.com/miora-sora)
|
|
462
506
|
|
|
463
507
|
|
|
464
508
|
---
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<!-- markdownlint-disable MD033 MD041 -->
|
|
2
1
|
<div align="center">
|
|
3
2
|
|
|
4
3
|
# 🛡️ Pipeline Sentinel
|
|
4
|
+
|
|
5
5
|
**The Open‑Source DevSecOps Command Center — Unify, Analyse, Remediate.**
|
|
6
6
|
|
|
7
7
|
[](https://pypi.org/project/devsecops-radar/)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
[](https://github.com/Mehrdoost/devsecops-radar/releases)
|
|
10
|
-
[](https://github.com/Mehrdoost/devsecops-radar/actions)
|
|
11
11
|
[](https://github.com/Mehrdoost/devsecops-radar/stargazers)
|
|
12
12
|
|
|
13
13
|
</div>
|
|
@@ -17,21 +17,24 @@
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
19
|
## 📖 Table of Contents
|
|
20
|
+
|
|
20
21
|
1. [What Is Pipeline Sentinel? (Simple Explanation)](#-what-is-pipeline-sentinel-simple-explanation)
|
|
21
22
|
2. [Why You Need It](#-why-you-need-it)
|
|
22
23
|
3. [Where to Run It in Your Network](#-where-to-run-it-in-your-network)
|
|
23
24
|
4. [Dashboard Preview](#-dashboard-preview)
|
|
24
25
|
5. [Quick Start](#-quick-start)
|
|
25
|
-
6. [
|
|
26
|
-
7. [
|
|
27
|
-
8. [
|
|
28
|
-
9. [
|
|
29
|
-
10. [
|
|
30
|
-
11. [
|
|
31
|
-
12. [
|
|
32
|
-
13. [
|
|
33
|
-
14. [
|
|
34
|
-
15. [
|
|
26
|
+
6. [Prerequisites](#-prerequisites)
|
|
27
|
+
7. [Installation](#-installation)
|
|
28
|
+
8. [How to Use (Step‑by‑Step)](#-how-to-use-stepbystep)
|
|
29
|
+
9. [Complete Command Reference](#-complete-command-reference)
|
|
30
|
+
10. [Core Capabilities](#-core-capabilities)
|
|
31
|
+
11. [Community Rules & Online Updates](#-community-rules--online-updates)
|
|
32
|
+
12. [Architecture](#️-architecture)
|
|
33
|
+
13. [Roadmap](#️-roadmap)
|
|
34
|
+
14. [Testing & CI](#-testing--ci)
|
|
35
|
+
15. [Contributing](#-contributing)
|
|
36
|
+
16. [Author](#-author)
|
|
37
|
+
17. [License](#-license)
|
|
35
38
|
|
|
36
39
|
---
|
|
37
40
|
|
|
@@ -50,13 +53,13 @@ Think of it as a **security camera system for your entire CI/CD pipeline** — i
|
|
|
50
53
|
In 2026, **supply chain attacks** have become the #1 threat. Tools like Trivy themselves were compromised, and attackers now inject malicious code directly into build pipelines. **You can no longer just scan your code; you must scan your pipeline.**
|
|
51
54
|
|
|
52
55
|
Pipeline Sentinel gives you:
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
56
|
+
* **One screen for all scanners** – stop juggling log files.
|
|
57
|
+
* **AI that understands attack chains** – “A leaked secret + an old library = a disaster.”
|
|
58
|
+
* **Automatic fixes** – with a single flag, it patches files and opens a pull request.
|
|
59
|
+
* **Human review mode** – inspect each fix before applying.
|
|
60
|
+
* **Compliance reports** – generate a PDF for your boss or auditor.
|
|
61
|
+
* **100% offline capable** – works in air‑gapped environments where security matters most.
|
|
62
|
+
* **Interactive wizard** – one command to get everything running.
|
|
60
63
|
|
|
61
64
|
---
|
|
62
65
|
|
|
@@ -81,14 +84,15 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
|
|
|
81
84
|
[Gitleaks scan] ┘
|
|
82
85
|
```
|
|
83
86
|
|
|
84
|
-
> **📌 Diagram Placeholder:**
|
|
85
|
-
|
|
87
|
+
> **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
|
|
88
|
+
> ``
|
|
86
89
|
|
|
87
90
|
---
|
|
88
91
|
|
|
89
92
|
## 📸 Dashboard Preview
|
|
90
93
|
|
|
91
94
|

|
|
95
|
+
|
|
92
96
|
*(Severity doughnut, trend line chart, attack‑path graph (clickable nodes), topology view, executive summary — all fully offline.)*
|
|
93
97
|
|
|
94
98
|
---
|
|
@@ -115,6 +119,24 @@ devsecops-radar --wizard
|
|
|
115
119
|
|
|
116
120
|
---
|
|
117
121
|
|
|
122
|
+
## 📋 Prerequisites
|
|
123
|
+
|
|
124
|
+
Pipeline Sentinel relies on external security tools to produce the JSON reports it consumes. You must install these tools separately according to your needs.
|
|
125
|
+
|
|
126
|
+
**Required for offline scanning:**
|
|
127
|
+
* Trivy (installation)
|
|
128
|
+
* Semgrep (installation)
|
|
129
|
+
* Poutine (installation)
|
|
130
|
+
* Zizmor (installation)
|
|
131
|
+
* Gitleaks (installation)
|
|
132
|
+
|
|
133
|
+
**Optional (for AI analysis):**
|
|
134
|
+
* Ollama (installation)
|
|
135
|
+
|
|
136
|
+
> 📖 **See `PREREQUISITES.md` for more details.**
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
118
140
|
## 📦 Installation
|
|
119
141
|
|
|
120
142
|
### Option 1 — PyPI (Recommended)
|
|
@@ -170,19 +192,19 @@ gitleaks detect --source . --report-format json --report-path gitleaks.json
|
|
|
170
192
|
```bash
|
|
171
193
|
devsecops-radar --trivy trivy.json --semgrep semgrep.json --poutine poutine.json --zizmor zizmor.json --gitleaks gitleaks.json
|
|
172
194
|
```
|
|
173
|
-
This produces a single `findings.json` with all findings merged and normalised
|
|
195
|
+
*This produces a single `findings.json` with all findings merged and normalised.*
|
|
174
196
|
|
|
175
197
|
### 3. View the Dashboard
|
|
176
198
|
```bash
|
|
177
199
|
devsecops-radar-web
|
|
178
200
|
```
|
|
179
201
|
The dashboard shows:
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
202
|
+
* **Severity Breakdown** – Doughnut chart
|
|
203
|
+
* **Trend Over Time** – Line chart from scan history
|
|
204
|
+
* **Pipeline Security** – Poutine + Zizmor statistics card
|
|
205
|
+
* **Attack Path Graph** – Interactive D3.js graph (click nodes for details)
|
|
206
|
+
* **Executive Summary** – Risk score and AI‑generated summary
|
|
207
|
+
* **Findings Table** – Searchable, filterable, paginated
|
|
186
208
|
|
|
187
209
|
### 4. Enable AI Analysis (Optional)
|
|
188
210
|
```bash
|
|
@@ -191,10 +213,10 @@ devsecops-radar --trivy trivy.json --analyze
|
|
|
191
213
|
devsecops-radar-web
|
|
192
214
|
```
|
|
193
215
|
The LLM generates `findings_ai_summary.json` containing:
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
216
|
+
* `executive_summary`, `risk_score`
|
|
217
|
+
* `attack_paths` with MITRE ATT&CK tactics
|
|
218
|
+
* `top_remediations` (some with `fix_diff`)
|
|
219
|
+
* `false_positives_likely`
|
|
198
220
|
|
|
199
221
|
### 5. Auto‑Remediation (with Human Review)
|
|
200
222
|
```bash
|
|
@@ -204,7 +226,7 @@ devsecops-radar --trivy trivy.json --analyze --fix
|
|
|
204
226
|
# Review each fix before applying
|
|
205
227
|
devsecops-radar --trivy trivy.json --analyze --fix --review
|
|
206
228
|
```
|
|
207
|
-
The tool creates a new git branch `auto-fix` and pushes it for review
|
|
229
|
+
*The tool creates a new git branch `auto-fix` and pushes it for review.*
|
|
208
230
|
|
|
209
231
|
### 6. Policy Enforcement
|
|
210
232
|
Create a `policy.json` file:
|
|
@@ -218,7 +240,7 @@ Create a `policy.json` file:
|
|
|
218
240
|
```bash
|
|
219
241
|
devsecops-radar --trivy trivy.json --policy policy.json
|
|
220
242
|
```
|
|
221
|
-
If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates
|
|
243
|
+
*If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates.*
|
|
222
244
|
|
|
223
245
|
### 7. Generate Compliance Reports
|
|
224
246
|
```bash
|
|
@@ -283,18 +305,18 @@ Built‑in support for five scanners with a real plugin system. Third‑party sc
|
|
|
283
305
|
| **Gitleaks**| Secrets detection | `--gitleaks` |
|
|
284
306
|
|
|
285
307
|
### 🧩 Hybrid RuleFusion Engine
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
308
|
+
* **Offline** – Load custom JSON rules from any local directory (`--rules ~/my-rules/`)
|
|
309
|
+
* **Online** – Pull community‑curated rules from a configurable Git repository (`--update-rules`)
|
|
310
|
+
* Auto‑detects Trivy, Semgrep, Poutine, Zizmor, and plain‑list formats
|
|
311
|
+
* Policy evaluation built directly into the engine
|
|
312
|
+
* Community rules repo: `devsecops-radar-rules` (configurable via `COMMUNITY_RULES_REPO`)
|
|
291
313
|
|
|
292
314
|
### 🧠 LLM‑Powered Analysis
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
*
|
|
315
|
+
* Retry logic with exponential backoff for unstable endpoints
|
|
316
|
+
* Few‑shot examples covering real‑world supply chain attack chains
|
|
317
|
+
* Token‑aware selection (max items configurable via `ANALYZER_MAX_FINDINGS`)
|
|
318
|
+
* Structured JSON output: `executive_summary`, `risk_score`, `attack_paths` (MITRE ATT&CK), `top_remediations`, `false_positives_likely`
|
|
319
|
+
* Ollama (local, offline) and LiteLLM (OpenAI, Anthropic, etc.) support
|
|
298
320
|
|
|
299
321
|
### 🕸️ Multi‑Step Attack Path Visualization
|
|
300
322
|
Interactive D3.js force graph that chains findings into realistic attack scenarios. Click any node to see detailed finding information. Accepts a topology file to map findings onto your actual infrastructure, showing lateral movement across servers and subnets.
|
|
@@ -314,17 +336,17 @@ AI‑suggested fixes can be applied automatically (`--fix`) or reviewed one‑by
|
|
|
314
336
|
|
|
315
337
|
### 📊 Compliance & Executive Reports (with Redaction)
|
|
316
338
|
Generate professional PDF reports (`--report report.pdf`) with:
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
339
|
+
* Executive summary and risk score
|
|
340
|
+
* Findings table (first 50 items)
|
|
341
|
+
* Compliance mapping (CIS, PCI‑DSS, ISO 27001)
|
|
342
|
+
* Automatic redaction of passwords, tokens, JWTs
|
|
321
343
|
|
|
322
344
|
### 📈 Scan History & Trends (with Pagination)
|
|
323
345
|
SQLAlchemy‑backed database with server‑side pagination (`/api/findings?page=1&per_page=50`). Scan history is stored efficiently, enabling fast trend charts and historical comparisons.
|
|
324
346
|
|
|
325
347
|
### 🧪 SBOM & Dependency Confusion Detection
|
|
326
|
-
*
|
|
327
|
-
*
|
|
348
|
+
* Generate a CycloneDX SBOM from your project using `syft`
|
|
349
|
+
* Detect dependency confusion risks in `package.json` and `requirements.txt` — internal packages that could be impersonated by public registries
|
|
328
350
|
|
|
329
351
|
### 🔍 RAG‑Powered Security Search
|
|
330
352
|
Ask natural language questions about your scan history: *“When was the last Log4j vulnerability found?”* The built‑in RAG endpoint (`/api/rag?q=...`) searches stored findings and returns matches.
|
|
@@ -339,10 +361,34 @@ Beyond CVSS, each finding gets a dynamic risk score based on asset exposure (fro
|
|
|
339
361
|
A `--wizard` flag walks new users through installing dependencies, pulling AI models, and running their first scan — all in one go.
|
|
340
362
|
|
|
341
363
|
### 🔒 Privacy & Offline‑First
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
364
|
+
* All assets (CSS, JS) are embedded — zero CDN calls
|
|
365
|
+
* LLM analysis runs locally with Ollama; no data leaves your network
|
|
366
|
+
* Optional API key authentication for the dashboard (JWT supported)
|
|
367
|
+
* Docker image runs as non‑root user
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 🌍 Community Rules & Online Updates
|
|
372
|
+
|
|
373
|
+
Pipeline Sentinel features a community‑driven rule marketplace housed in a separate repository: `devsecops-radar-rules`.
|
|
374
|
+
|
|
375
|
+
### How It Works
|
|
376
|
+
The repository contains curated JSON rule files for all supported scanners (Trivy, Semgrep, Poutine, Zizmor, Gitleaks) and generic compliance checks. Anyone can contribute by submitting a Pull Request with new or improved rules.
|
|
377
|
+
|
|
378
|
+
Users can pull the latest rules with a single command:
|
|
379
|
+
```bash
|
|
380
|
+
devsecops-radar --update-rules
|
|
381
|
+
```
|
|
382
|
+
Rules are stored locally in `~/.devsecops-radar/community-rules/`. To use them alongside your scanner results:
|
|
383
|
+
```bash
|
|
384
|
+
devsecops-radar --trivy scan.json --rules ~/.devsecops-radar/community-rules/
|
|
385
|
+
```
|
|
386
|
+
You can even point to your own fork or a private repository by setting the `COMMUNITY_RULES_REPO` environment variable. This turns Pipeline Sentinel into a living, community‑improved security platform — just like Nuclei Templates or Semgrep Registry.
|
|
387
|
+
|
|
388
|
+
### Contributing a Rule
|
|
389
|
+
1. Fork the `devsecops-radar-rules` repository.
|
|
390
|
+
2. Add a new JSON file to the `rules/` directory (or modify an existing one). Follow the standard Pipeline Sentinel finding format (see the repo’s README).
|
|
391
|
+
3. Open a Pull Request — our maintainers will review and merge.
|
|
346
392
|
|
|
347
393
|
---
|
|
348
394
|
|
|
@@ -392,44 +438,42 @@ devsecops_radar/
|
|
|
392
438
|
| ✅ **Phase 3** | Human review mode (`--review`) | Done |
|
|
393
439
|
| ✅ **Phase 3** | Gitleaks secret scanner | Done |
|
|
394
440
|
| ✅ **Phase 3** | Security badge endpoint | Done |
|
|
441
|
+
| ✅ **Phase 3** | Full test suite & CI pipeline | Done |
|
|
395
442
|
| 🔲 **Phase 4** | Jira / Slack integration | Planned |
|
|
396
443
|
| 🔲 **Phase 4** | SARIF & CycloneDX support | Planned |
|
|
397
|
-
| 🔲 **Phase 4** | Rule Marketplace (community YAML rules) | Planned |
|
|
398
444
|
| 🔲 **Phase 4** | Pull Request assistant (GitHub App) | Planned |
|
|
399
445
|
|
|
400
|
-
> See the [open issues](https://github.com/Mehrdoost/devsecops-radar/issues) for a full list of proposed features.
|
|
401
|
-
|
|
402
446
|
---
|
|
403
447
|
|
|
404
|
-
##
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
448
|
+
## 🧪 Testing & CI
|
|
449
|
+
|
|
450
|
+
Pipeline Sentinel is thoroughly tested to ensure reliability for production use.
|
|
451
|
+
* **Unit & Integration Tests:** 23 tests covering scanners, rule engine, database, analyzer, API, and CLI.
|
|
452
|
+
* **CI Pipeline:** Every push and pull request triggers automated testing (pytest) and linting (ruff) via GitHub Actions.
|
|
453
|
+
|
|
454
|
+
You can run the tests locally:
|
|
455
|
+
```bash
|
|
456
|
+
pip install -e .
|
|
457
|
+
pip install pytest pytest-flask ruff
|
|
458
|
+
pytest tests/ -v
|
|
459
|
+
ruff check .
|
|
415
460
|
```
|
|
416
|
-
*The action merges findings, creates a job summary, and outputs CRITICAL/HIGH counts.*
|
|
417
461
|
|
|
418
462
|
---
|
|
419
463
|
|
|
420
464
|
## 🤝 Contributing
|
|
421
465
|
|
|
422
|
-
|
|
423
|
-
If you would like to integrate a new scanner, open an issue with a sample of its JSON output.
|
|
424
|
-
For permanent scanner plugins, extend the `ScannerPlugin` class and register it via entry points.
|
|
466
|
+
We welcome contributions of all kinds! Please read our `CONTRIBUTING.md` for detailed guidelines on how to set up the project, add new scanners, or submit rule changes. For contributing community rules, see the Community Rules section above.
|
|
425
467
|
|
|
426
468
|
---
|
|
427
469
|
|
|
428
470
|
## 👨💻 Author
|
|
429
471
|
|
|
430
|
-
**
|
|
472
|
+
**ReverseForge** — ( Mehrdoost And Mi0r4 )
|
|
431
473
|
|
|
432
|
-
[](https://github.com/
|
|
474
|
+
[cite_start][](https://github.com/ReverseForge)
|
|
475
|
+
[cite_start][](https://github.com/Mehrdoost)
|
|
476
|
+
[cite_start][](https://github.com/miora-sora)
|
|
433
477
|
|
|
434
478
|
|
|
435
479
|
---
|
|
@@ -440,4 +484,4 @@ MIT — see [LICENSE](LICENSE).
|
|
|
440
484
|
|
|
441
485
|
<div align="center">
|
|
442
486
|
⭐ If this project helps your team ship safer software, drop a star — it makes a real difference.
|
|
443
|
-
</div>
|
|
487
|
+
</div>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import jwt
|
|
2
3
|
import datetime
|
|
3
4
|
from functools import wraps
|
|
@@ -18,11 +19,11 @@ def verify_token(token: str) -> dict:
|
|
|
18
19
|
def login_required(f):
|
|
19
20
|
@wraps(f)
|
|
20
21
|
def decorated(*args, **kwargs):
|
|
21
|
-
#
|
|
22
|
-
|
|
22
|
+
# Read directly from os.environ to support test patching
|
|
23
|
+
api_key = os.environ.get("PIPELINE_API_KEY", "disabled")
|
|
24
|
+
if api_key != "disabled":
|
|
23
25
|
key = request.headers.get("X-API-Key")
|
|
24
|
-
if key !=
|
|
26
|
+
if key != api_key:
|
|
25
27
|
return jsonify({"error": "API key required"}), 401
|
|
26
|
-
# Without an API key, all requests are permitted (default for local use).
|
|
27
28
|
return f(*args, **kwargs)
|
|
28
29
|
return decorated
|
|
@@ -39,7 +39,7 @@ DASHBOARD_HTML = r"""
|
|
|
39
39
|
<nav class="navbar navbar-dark border-bottom border-secondary mb-4" style="background:#1e293b;">
|
|
40
40
|
<div class="container-fluid">
|
|
41
41
|
<span class="navbar-brand mb-0 h1">🛡️ Pipeline Sentinel</span>
|
|
42
|
-
<span class="text-muted">v0.3.
|
|
42
|
+
<span class="text-muted">v0.3.8</span>
|
|
43
43
|
</div>
|
|
44
44
|
</nav>
|
|
45
45
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsecops-radar
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.9
|
|
4
4
|
Summary: Unified CI/CD Security Dashboard — Pipeline Sentinel
|
|
5
5
|
Author-email: Mehrdoost <70381337+Mehrdoost@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,16 +27,16 @@ Requires-Dist: pytest>=8.0
|
|
|
27
27
|
Requires-Dist: pytest-flask>=1.3
|
|
28
28
|
Dynamic: license-file
|
|
29
29
|
|
|
30
|
-
<!-- markdownlint-disable MD033 MD041 -->
|
|
31
30
|
<div align="center">
|
|
32
31
|
|
|
33
32
|
# 🛡️ Pipeline Sentinel
|
|
33
|
+
|
|
34
34
|
**The Open‑Source DevSecOps Command Center — Unify, Analyse, Remediate.**
|
|
35
35
|
|
|
36
36
|
[](https://pypi.org/project/devsecops-radar/)
|
|
37
37
|
[](LICENSE)
|
|
38
38
|
[](https://github.com/Mehrdoost/devsecops-radar/releases)
|
|
39
|
-
[](https://github.com/Mehrdoost/devsecops-radar/actions)
|
|
40
40
|
[](https://github.com/Mehrdoost/devsecops-radar/stargazers)
|
|
41
41
|
|
|
42
42
|
</div>
|
|
@@ -46,21 +46,24 @@ Dynamic: license-file
|
|
|
46
46
|
---
|
|
47
47
|
|
|
48
48
|
## 📖 Table of Contents
|
|
49
|
+
|
|
49
50
|
1. [What Is Pipeline Sentinel? (Simple Explanation)](#-what-is-pipeline-sentinel-simple-explanation)
|
|
50
51
|
2. [Why You Need It](#-why-you-need-it)
|
|
51
52
|
3. [Where to Run It in Your Network](#-where-to-run-it-in-your-network)
|
|
52
53
|
4. [Dashboard Preview](#-dashboard-preview)
|
|
53
54
|
5. [Quick Start](#-quick-start)
|
|
54
|
-
6. [
|
|
55
|
-
7. [
|
|
56
|
-
8. [
|
|
57
|
-
9. [
|
|
58
|
-
10. [
|
|
59
|
-
11. [
|
|
60
|
-
12. [
|
|
61
|
-
13. [
|
|
62
|
-
14. [
|
|
63
|
-
15. [
|
|
55
|
+
6. [Prerequisites](#-prerequisites)
|
|
56
|
+
7. [Installation](#-installation)
|
|
57
|
+
8. [How to Use (Step‑by‑Step)](#-how-to-use-stepbystep)
|
|
58
|
+
9. [Complete Command Reference](#-complete-command-reference)
|
|
59
|
+
10. [Core Capabilities](#-core-capabilities)
|
|
60
|
+
11. [Community Rules & Online Updates](#-community-rules--online-updates)
|
|
61
|
+
12. [Architecture](#️-architecture)
|
|
62
|
+
13. [Roadmap](#️-roadmap)
|
|
63
|
+
14. [Testing & CI](#-testing--ci)
|
|
64
|
+
15. [Contributing](#-contributing)
|
|
65
|
+
16. [Author](#-author)
|
|
66
|
+
17. [License](#-license)
|
|
64
67
|
|
|
65
68
|
---
|
|
66
69
|
|
|
@@ -79,13 +82,13 @@ Think of it as a **security camera system for your entire CI/CD pipeline** — i
|
|
|
79
82
|
In 2026, **supply chain attacks** have become the #1 threat. Tools like Trivy themselves were compromised, and attackers now inject malicious code directly into build pipelines. **You can no longer just scan your code; you must scan your pipeline.**
|
|
80
83
|
|
|
81
84
|
Pipeline Sentinel gives you:
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
85
|
+
* **One screen for all scanners** – stop juggling log files.
|
|
86
|
+
* **AI that understands attack chains** – “A leaked secret + an old library = a disaster.”
|
|
87
|
+
* **Automatic fixes** – with a single flag, it patches files and opens a pull request.
|
|
88
|
+
* **Human review mode** – inspect each fix before applying.
|
|
89
|
+
* **Compliance reports** – generate a PDF for your boss or auditor.
|
|
90
|
+
* **100% offline capable** – works in air‑gapped environments where security matters most.
|
|
91
|
+
* **Interactive wizard** – one command to get everything running.
|
|
89
92
|
|
|
90
93
|
---
|
|
91
94
|
|
|
@@ -110,14 +113,15 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
|
|
|
110
113
|
[Gitleaks scan] ┘
|
|
111
114
|
```
|
|
112
115
|
|
|
113
|
-
> **📌 Diagram Placeholder:**
|
|
114
|
-
|
|
116
|
+
> **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
|
|
117
|
+
> ``
|
|
115
118
|
|
|
116
119
|
---
|
|
117
120
|
|
|
118
121
|
## 📸 Dashboard Preview
|
|
119
122
|
|
|
120
123
|

|
|
124
|
+
|
|
121
125
|
*(Severity doughnut, trend line chart, attack‑path graph (clickable nodes), topology view, executive summary — all fully offline.)*
|
|
122
126
|
|
|
123
127
|
---
|
|
@@ -144,6 +148,24 @@ devsecops-radar --wizard
|
|
|
144
148
|
|
|
145
149
|
---
|
|
146
150
|
|
|
151
|
+
## 📋 Prerequisites
|
|
152
|
+
|
|
153
|
+
Pipeline Sentinel relies on external security tools to produce the JSON reports it consumes. You must install these tools separately according to your needs.
|
|
154
|
+
|
|
155
|
+
**Required for offline scanning:**
|
|
156
|
+
* Trivy (installation)
|
|
157
|
+
* Semgrep (installation)
|
|
158
|
+
* Poutine (installation)
|
|
159
|
+
* Zizmor (installation)
|
|
160
|
+
* Gitleaks (installation)
|
|
161
|
+
|
|
162
|
+
**Optional (for AI analysis):**
|
|
163
|
+
* Ollama (installation)
|
|
164
|
+
|
|
165
|
+
> 📖 **See `PREREQUISITES.md` for more details.**
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
147
169
|
## 📦 Installation
|
|
148
170
|
|
|
149
171
|
### Option 1 — PyPI (Recommended)
|
|
@@ -199,19 +221,19 @@ gitleaks detect --source . --report-format json --report-path gitleaks.json
|
|
|
199
221
|
```bash
|
|
200
222
|
devsecops-radar --trivy trivy.json --semgrep semgrep.json --poutine poutine.json --zizmor zizmor.json --gitleaks gitleaks.json
|
|
201
223
|
```
|
|
202
|
-
This produces a single `findings.json` with all findings merged and normalised
|
|
224
|
+
*This produces a single `findings.json` with all findings merged and normalised.*
|
|
203
225
|
|
|
204
226
|
### 3. View the Dashboard
|
|
205
227
|
```bash
|
|
206
228
|
devsecops-radar-web
|
|
207
229
|
```
|
|
208
230
|
The dashboard shows:
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
231
|
+
* **Severity Breakdown** – Doughnut chart
|
|
232
|
+
* **Trend Over Time** – Line chart from scan history
|
|
233
|
+
* **Pipeline Security** – Poutine + Zizmor statistics card
|
|
234
|
+
* **Attack Path Graph** – Interactive D3.js graph (click nodes for details)
|
|
235
|
+
* **Executive Summary** – Risk score and AI‑generated summary
|
|
236
|
+
* **Findings Table** – Searchable, filterable, paginated
|
|
215
237
|
|
|
216
238
|
### 4. Enable AI Analysis (Optional)
|
|
217
239
|
```bash
|
|
@@ -220,10 +242,10 @@ devsecops-radar --trivy trivy.json --analyze
|
|
|
220
242
|
devsecops-radar-web
|
|
221
243
|
```
|
|
222
244
|
The LLM generates `findings_ai_summary.json` containing:
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
245
|
+
* `executive_summary`, `risk_score`
|
|
246
|
+
* `attack_paths` with MITRE ATT&CK tactics
|
|
247
|
+
* `top_remediations` (some with `fix_diff`)
|
|
248
|
+
* `false_positives_likely`
|
|
227
249
|
|
|
228
250
|
### 5. Auto‑Remediation (with Human Review)
|
|
229
251
|
```bash
|
|
@@ -233,7 +255,7 @@ devsecops-radar --trivy trivy.json --analyze --fix
|
|
|
233
255
|
# Review each fix before applying
|
|
234
256
|
devsecops-radar --trivy trivy.json --analyze --fix --review
|
|
235
257
|
```
|
|
236
|
-
The tool creates a new git branch `auto-fix` and pushes it for review
|
|
258
|
+
*The tool creates a new git branch `auto-fix` and pushes it for review.*
|
|
237
259
|
|
|
238
260
|
### 6. Policy Enforcement
|
|
239
261
|
Create a `policy.json` file:
|
|
@@ -247,7 +269,7 @@ Create a `policy.json` file:
|
|
|
247
269
|
```bash
|
|
248
270
|
devsecops-radar --trivy trivy.json --policy policy.json
|
|
249
271
|
```
|
|
250
|
-
If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates
|
|
272
|
+
*If critical findings exceed 5, the command exits with code 1 — perfect for CI/CD gates.*
|
|
251
273
|
|
|
252
274
|
### 7. Generate Compliance Reports
|
|
253
275
|
```bash
|
|
@@ -312,18 +334,18 @@ Built‑in support for five scanners with a real plugin system. Third‑party sc
|
|
|
312
334
|
| **Gitleaks**| Secrets detection | `--gitleaks` |
|
|
313
335
|
|
|
314
336
|
### 🧩 Hybrid RuleFusion Engine
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
337
|
+
* **Offline** – Load custom JSON rules from any local directory (`--rules ~/my-rules/`)
|
|
338
|
+
* **Online** – Pull community‑curated rules from a configurable Git repository (`--update-rules`)
|
|
339
|
+
* Auto‑detects Trivy, Semgrep, Poutine, Zizmor, and plain‑list formats
|
|
340
|
+
* Policy evaluation built directly into the engine
|
|
341
|
+
* Community rules repo: `devsecops-radar-rules` (configurable via `COMMUNITY_RULES_REPO`)
|
|
320
342
|
|
|
321
343
|
### 🧠 LLM‑Powered Analysis
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
344
|
+
* Retry logic with exponential backoff for unstable endpoints
|
|
345
|
+
* Few‑shot examples covering real‑world supply chain attack chains
|
|
346
|
+
* Token‑aware selection (max items configurable via `ANALYZER_MAX_FINDINGS`)
|
|
347
|
+
* Structured JSON output: `executive_summary`, `risk_score`, `attack_paths` (MITRE ATT&CK), `top_remediations`, `false_positives_likely`
|
|
348
|
+
* Ollama (local, offline) and LiteLLM (OpenAI, Anthropic, etc.) support
|
|
327
349
|
|
|
328
350
|
### 🕸️ Multi‑Step Attack Path Visualization
|
|
329
351
|
Interactive D3.js force graph that chains findings into realistic attack scenarios. Click any node to see detailed finding information. Accepts a topology file to map findings onto your actual infrastructure, showing lateral movement across servers and subnets.
|
|
@@ -343,17 +365,17 @@ AI‑suggested fixes can be applied automatically (`--fix`) or reviewed one‑by
|
|
|
343
365
|
|
|
344
366
|
### 📊 Compliance & Executive Reports (with Redaction)
|
|
345
367
|
Generate professional PDF reports (`--report report.pdf`) with:
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
368
|
+
* Executive summary and risk score
|
|
369
|
+
* Findings table (first 50 items)
|
|
370
|
+
* Compliance mapping (CIS, PCI‑DSS, ISO 27001)
|
|
371
|
+
* Automatic redaction of passwords, tokens, JWTs
|
|
350
372
|
|
|
351
373
|
### 📈 Scan History & Trends (with Pagination)
|
|
352
374
|
SQLAlchemy‑backed database with server‑side pagination (`/api/findings?page=1&per_page=50`). Scan history is stored efficiently, enabling fast trend charts and historical comparisons.
|
|
353
375
|
|
|
354
376
|
### 🧪 SBOM & Dependency Confusion Detection
|
|
355
|
-
*
|
|
356
|
-
*
|
|
377
|
+
* Generate a CycloneDX SBOM from your project using `syft`
|
|
378
|
+
* Detect dependency confusion risks in `package.json` and `requirements.txt` — internal packages that could be impersonated by public registries
|
|
357
379
|
|
|
358
380
|
### 🔍 RAG‑Powered Security Search
|
|
359
381
|
Ask natural language questions about your scan history: *“When was the last Log4j vulnerability found?”* The built‑in RAG endpoint (`/api/rag?q=...`) searches stored findings and returns matches.
|
|
@@ -368,10 +390,34 @@ Beyond CVSS, each finding gets a dynamic risk score based on asset exposure (fro
|
|
|
368
390
|
A `--wizard` flag walks new users through installing dependencies, pulling AI models, and running their first scan — all in one go.
|
|
369
391
|
|
|
370
392
|
### 🔒 Privacy & Offline‑First
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
393
|
+
* All assets (CSS, JS) are embedded — zero CDN calls
|
|
394
|
+
* LLM analysis runs locally with Ollama; no data leaves your network
|
|
395
|
+
* Optional API key authentication for the dashboard (JWT supported)
|
|
396
|
+
* Docker image runs as non‑root user
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## 🌍 Community Rules & Online Updates
|
|
401
|
+
|
|
402
|
+
Pipeline Sentinel features a community‑driven rule marketplace housed in a separate repository: `devsecops-radar-rules`.
|
|
403
|
+
|
|
404
|
+
### How It Works
|
|
405
|
+
The repository contains curated JSON rule files for all supported scanners (Trivy, Semgrep, Poutine, Zizmor, Gitleaks) and generic compliance checks. Anyone can contribute by submitting a Pull Request with new or improved rules.
|
|
406
|
+
|
|
407
|
+
Users can pull the latest rules with a single command:
|
|
408
|
+
```bash
|
|
409
|
+
devsecops-radar --update-rules
|
|
410
|
+
```
|
|
411
|
+
Rules are stored locally in `~/.devsecops-radar/community-rules/`. To use them alongside your scanner results:
|
|
412
|
+
```bash
|
|
413
|
+
devsecops-radar --trivy scan.json --rules ~/.devsecops-radar/community-rules/
|
|
414
|
+
```
|
|
415
|
+
You can even point to your own fork or a private repository by setting the `COMMUNITY_RULES_REPO` environment variable. This turns Pipeline Sentinel into a living, community‑improved security platform — just like Nuclei Templates or Semgrep Registry.
|
|
416
|
+
|
|
417
|
+
### Contributing a Rule
|
|
418
|
+
1. Fork the `devsecops-radar-rules` repository.
|
|
419
|
+
2. Add a new JSON file to the `rules/` directory (or modify an existing one). Follow the standard Pipeline Sentinel finding format (see the repo’s README).
|
|
420
|
+
3. Open a Pull Request — our maintainers will review and merge.
|
|
375
421
|
|
|
376
422
|
---
|
|
377
423
|
|
|
@@ -421,44 +467,42 @@ devsecops_radar/
|
|
|
421
467
|
| ✅ **Phase 3** | Human review mode (`--review`) | Done |
|
|
422
468
|
| ✅ **Phase 3** | Gitleaks secret scanner | Done |
|
|
423
469
|
| ✅ **Phase 3** | Security badge endpoint | Done |
|
|
470
|
+
| ✅ **Phase 3** | Full test suite & CI pipeline | Done |
|
|
424
471
|
| 🔲 **Phase 4** | Jira / Slack integration | Planned |
|
|
425
472
|
| 🔲 **Phase 4** | SARIF & CycloneDX support | Planned |
|
|
426
|
-
| 🔲 **Phase 4** | Rule Marketplace (community YAML rules) | Planned |
|
|
427
473
|
| 🔲 **Phase 4** | Pull Request assistant (GitHub App) | Planned |
|
|
428
474
|
|
|
429
|
-
> See the [open issues](https://github.com/Mehrdoost/devsecops-radar/issues) for a full list of proposed features.
|
|
430
|
-
|
|
431
475
|
---
|
|
432
476
|
|
|
433
|
-
##
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
477
|
+
## 🧪 Testing & CI
|
|
478
|
+
|
|
479
|
+
Pipeline Sentinel is thoroughly tested to ensure reliability for production use.
|
|
480
|
+
* **Unit & Integration Tests:** 23 tests covering scanners, rule engine, database, analyzer, API, and CLI.
|
|
481
|
+
* **CI Pipeline:** Every push and pull request triggers automated testing (pytest) and linting (ruff) via GitHub Actions.
|
|
482
|
+
|
|
483
|
+
You can run the tests locally:
|
|
484
|
+
```bash
|
|
485
|
+
pip install -e .
|
|
486
|
+
pip install pytest pytest-flask ruff
|
|
487
|
+
pytest tests/ -v
|
|
488
|
+
ruff check .
|
|
444
489
|
```
|
|
445
|
-
*The action merges findings, creates a job summary, and outputs CRITICAL/HIGH counts.*
|
|
446
490
|
|
|
447
491
|
---
|
|
448
492
|
|
|
449
493
|
## 🤝 Contributing
|
|
450
494
|
|
|
451
|
-
|
|
452
|
-
If you would like to integrate a new scanner, open an issue with a sample of its JSON output.
|
|
453
|
-
For permanent scanner plugins, extend the `ScannerPlugin` class and register it via entry points.
|
|
495
|
+
We welcome contributions of all kinds! Please read our `CONTRIBUTING.md` for detailed guidelines on how to set up the project, add new scanners, or submit rule changes. For contributing community rules, see the Community Rules section above.
|
|
454
496
|
|
|
455
497
|
---
|
|
456
498
|
|
|
457
499
|
## 👨💻 Author
|
|
458
500
|
|
|
459
|
-
**
|
|
501
|
+
**ReverseForge** — ( Mehrdoost And Mi0r4 )
|
|
460
502
|
|
|
461
|
-
[](https://github.com/
|
|
503
|
+
[cite_start][](https://github.com/ReverseForge)
|
|
504
|
+
[cite_start][](https://github.com/Mehrdoost)
|
|
505
|
+
[cite_start][](https://github.com/miora-sora)
|
|
462
506
|
|
|
463
507
|
|
|
464
508
|
---
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/attack_paths/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/css/bootstrap.min.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar/web/static/js/chart.umd.min.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devsecops_radar-0.3.6 → devsecops_radar-0.3.9}/devsecops_radar.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|