Install Semgrep and run the local static scan:
python -m pip install semgrep
make scan-sastRun the combined local security checks when Docker is available:
make scan-securityRun dependency, license, and filesystem checks with Trivy:
make scan-dependencies
make scan-licensesRun a baseline DAST scan against a running service:
make dev-up
make scan-dast TARGET=http://localhost:8000/healthPull requests and pushes to main run:
- Semgrep SAST
- Gitleaks secret detection
- Trivy filesystem vulnerability, license, and misconfiguration scanning
- ZAP baseline DAST against the local geocoding health endpoint
- Semgrep, Trivy, Gitleaks, and ZAP provide the free security-analysis stack; SonarQube/SonarCloud is intentionally deferred
A scan with a High or Critical vulnerability, a detected secret, a restricted license, or a failed quality gate blocks the security job.
- Reproduce the finding locally with the command shown in the workflow or Makefile.
- Fix the source, dependency, configuration, or secret exposure rather than suppressing the rule.
- Add a focused regression test where behavior changes.
- Document an unavoidable finding with its rule ID, rationale, owner, expiry date, and compensating control before adding a narrow suppression.
- Never commit credentials, tokens, private keys,
.envfiles, scan reports containing secrets, or generated local data.
Report suspected vulnerabilities privately through the repository's GitHub security advisory process. Do not open a public issue containing an exploitable secret or vulnerability details.