Skip to main content

Static security auditor for CI/CD pipelines (GitLab CI today; GitHub Actions + Jenkins in development).

Project description

ciguard

CI PyPI License: Apache-2.0

Static security auditor for CI/CD pipelines. Scans pipeline configuration files for misconfigurations, supply-chain risks, and compliance gaps. Produces prioritised reports with mappings to ISO 27001, SOC 2, and NIST CSF.

Supported today: GitLab CI (.gitlab-ci.yml) In development: GitHub Actions, Jenkins (Declarative Pipeline), SARIF output

Why

CI/CD pipelines are increasingly the highest-value attack surface in software delivery. Common misconfigurations — hardcoded secrets, unpinned images, unprotected production deployments, privileged runners — are routinely exploited (SolarWinds, Codecov, 3CX). Existing SAST tools scan application code but miss pipeline-level risks. Manual review is slow and inconsistent.

ciguard runs in seconds, produces actionable reports with compliance mapping, and is auditable enough for regulated environments.

Install

pip install ciguard

Or from source:

git clone https://github.com/Jo-Jo98/ciguard.git
cd ciguard
pip install -e .

Quick start

# Scan a pipeline (terminal summary)
ciguard scan --input .gitlab-ci.yml

# HTML report
ciguard scan --input .gitlab-ci.yml --output report.html

# JSON report (CI/API consumption)
ciguard scan --input .gitlab-ci.yml --output report.json --format json

# PDF report (audits, executive review)
ciguard scan --input .gitlab-ci.yml --output report.pdf --format pdf

# Apply organisational policies
ciguard scan --input .gitlab-ci.yml --policies policies/ --output report.html

# AI-enriched executive summary (optional, requires API key)
ANTHROPIC_API_KEY=sk-ant-... ciguard scan --input .gitlab-ci.yml --llm --output report.html

Exit codes: 0 clean, 2 critical findings, 1 error.

Features

  • 19 deterministic security rules across 6 categories (Pipeline Integrity, Identity & Access, Runner Security, Artifact Handling, Deployment Governance, Supply Chain)
  • Policy engine — 7 built-in organisational policies + custom YAML policies
  • Scanner integrations — Semgrep CE, OpenSSF Scorecard, GitLab native security artifacts (all optional, graceful when unavailable)
  • AI enrichment — optional Claude / OpenAI executive summaries and remediation plans
  • Three report formats — HTML (dark, self-contained, no CDN), JSON (API-ready), PDF (8 sections, audit-grade)
  • Web UI — drag-and-drop upload, live results, downloadable reports
  • REST API — FastAPI with OpenAPI docs at /api/docs
  • Risk scoring — weighted A–F grade with per-category breakdown
  • Compliance mapping — ISO 27001, SOC 2, NIST CSF on every finding

Validated against real-world pipelines

ciguard 0.1 has been validated against 17 public GitLab CI files including the GitLab project itself, Inkscape, Wireshark, Meltano, fdroid, BuildStream, and Graphviz. PRD acceptance criteria as of v0.1:

  • Recall on labelled bad fixture: 100% (14/14 expected rules fire)
  • False positives on labelled good fixture: 0
  • Performance: 166 ms mean parse + analyse on a synthetic 500-job pipeline (5-run mean)

Regenerate locally with python scripts/validate_corpus.py and python scripts/validate_fixtures.py.

Custom policies

Create YAML files in a policies/ directory:

# policies/my_org.yml
policies:
  - id: "ORG-001"
    name: "No Critical Findings"
    description: "Zero critical findings required before merge"
    severity: critical
    condition:
      type: no_severity
      severity: Critical
    remediation: "Resolve all Critical findings before merging"
    tags: [org, gate]

Supported condition types: no_rule_findings, max_findings, min_risk_score, no_severity, min_category_score, pipeline_check. See policies/example_org_policies.yml for a full example.

Risk scoring

Weighted score across 6 categories — each contributes a percentage of the overall score:

Category Weight
Pipeline Integrity 25%
Identity & Access 20%
Deployment Governance 20%
Supply Chain 20%
Runner Security 7.5%
Artifact Handling 7.5%

Grades: A (90–100), B (80–89), C (70–79), D (60–69), F (<60).

Running with Docker

# Build
docker compose build

# Web UI on :8080
docker compose up web

# CLI scan
docker compose run --rm cli --input /pipeline/.gitlab-ci.yml --output /reports/report.html

Roadmap

  • v0.1 — GitLab CI parser, 19 rules, policy engine, scanner integrations, HTML/JSON/PDF reports, AI enrichment, web UI
  • v0.2 — GitHub Actions parser
  • v0.3 — Jenkins (Declarative Pipeline only) + SARIF output
  • v0.4 — Baseline / delta reports, GitHub Actions Marketplace listing

See PRD.md for the full reconciled scope and current task list.

Development

# Run tests
pytest tests/ -v

# Coverage
pytest tests/ --cov=src/ciguard --cov-report=html

# Validate against the public real-world corpus
python scripts/validate_corpus.py

# Validate the labelled fixtures (PRD acceptance criteria 1 & 2)
python scripts/validate_fixtures.py

Contributing

Issues and PRs welcome. Please run the full test suite and the fixture validator (python scripts/validate_fixtures.py) before submitting — both must pass.

License

Apache 2.0 — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ciguard-0.1.4.tar.gz (81.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ciguard-0.1.4-py3-none-any.whl (78.3 kB view details)

Uploaded Python 3

File details

Details for the file ciguard-0.1.4.tar.gz.

File metadata

  • Download URL: ciguard-0.1.4.tar.gz
  • Upload date:
  • Size: 81.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ciguard-0.1.4.tar.gz
Algorithm Hash digest
SHA256 49d925e73f5e869add9c3ff73e618e2d32f073cc806b880b77d1c7894724d99f
MD5 f5c3b37f8442559b55ba52e72f6c9443
BLAKE2b-256 1ad23b3f9715da004146b81810ed46a0adde6229dbd941be1c0c89808e20f97e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ciguard-0.1.4.tar.gz:

Publisher: release.yml on Jo-Jo98/ciguard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ciguard-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: ciguard-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 78.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ciguard-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8abf27c270721cc20db556c26cdaa2ab3ba9162196a9b20fa633b7e2e0b6a4f3
MD5 edcedcd6ba3ce1c2a5fcdc74bcadf2f7
BLAKE2b-256 2a095b99dca4cb403dab92f895e672b4174a5d89e4ec7e59eac08bf5f7071848

See more details on using hashes here.

Provenance

The following attestation bundles were made for ciguard-0.1.4-py3-none-any.whl:

Publisher: release.yml on Jo-Jo98/ciguard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page