Skip to content

Commit 5b9fbba

Browse files
Ibraheem OlasupoIbraheem Olasupo
authored andcommitted
Implement milestone 10 consolidated security evidence and reporting
1 parent 8795601 commit 5b9fbba

101 files changed

Lines changed: 5833 additions & 282 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Security Evidence
2+
3+
on:
4+
pull_request:
5+
branches: ["main"]
6+
push:
7+
branches: ["main"]
8+
9+
permissions:
10+
contents: read
11+
12+
concurrency:
13+
group: security-evidence-${{ github.workflow }}-${{ github.ref }}
14+
cancel-in-progress: true
15+
16+
jobs:
17+
evidence:
18+
runs-on: ubuntu-24.04
19+
timeout-minutes: 15
20+
steps:
21+
# actions/checkout v4.2.2
22+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
23+
24+
# actions/setup-python v5.6.0
25+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
26+
with:
27+
python-version: "3.11"
28+
cache: "pip"
29+
30+
- name: Install dependencies
31+
run: |
32+
python -m pip install --upgrade pip==25.1.1
33+
python -m pip install -e ".[dev]"
34+
35+
- name: Evidence tests
36+
run: pytest tests/security/test_consolidated_evidence.py -q
37+
38+
- name: Source evidence verifiers
39+
run: make verify-threat-model-evidence verify-api-security-evidence verify-infrastructure-evidence verify-appsec-evidence verify-dynamic-evidence verify-findings-evidence verify-release-evidence verify-lifecycle-evidence
40+
41+
- name: Consolidated evidence
42+
run: make evidence-full
43+
44+
- name: Upload evidence artefacts
45+
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
46+
with:
47+
name: security-evidence
48+
path: |
49+
outputs/security/evidence/
50+
reports/security/*security*.md
51+
reports/security/*assurance*.md
52+
reports/security/*integrity*.md
53+
retention-days: 14

CONTRIBUTING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ make dynamic-fast
1313
make findings-full
1414
make release-full
1515
make lifecycle-full
16+
make evidence-full
1617
```
1718

1819
Use deterministic synthetic data only. Do not add real patient, NHS, genomic, credential, or cloud account data.
@@ -29,3 +30,4 @@ Use deterministic synthetic data only. Do not add real patient, NHS, genomic, cr
2930
- Keep findings IDs deterministic and avoid absolute local paths, raw JWTs, private keys or real data in canonical findings outputs.
3031
- Keep release-gate evidence deterministic. Use `make release-gate-enforce` only when you intentionally want enforcement exit codes; evidence-mode release targets must still run for block and conditional decisions.
3132
- Keep lifecycle evidence deterministic. Scanner suppressions may inform lifecycle records, but only security exceptions under `config/lifecycle/` and `outputs/security/lifecycle/` may support risk acceptance or deferral.
33+
- Keep consolidated evidence deterministic. Update `config/evidence/source-registry.yaml` when adding a source domain, and do not add reports with manually maintained counts.

Makefile

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: setup install format format-check lint type-check test test-coverage auth-test api-security-test terraform-fmt terraform-fmt-check terraform-init terraform-validate terraform-test infrastructure-test infrastructure-evidence verify-infrastructure-evidence infrastructure-report security-tools secrets-scan sast sast-semgrep sast-bandit semgrep-test sca dependency-audit sbom verify-sbom iac-scan checkov-scan container-build-security container-scan appsec-fast appsec-full appsec-evidence verify-appsec-evidence appsec-report dynamic-tools dynamic-server-start dynamic-server-wait dynamic-server-stop schemathesis-test api-schema-security-test zap-baseline zap-api-scan auth-boundary-test authorisation-boundary-test object-access-test input-mutation-test security-header-test cors-test resource-consumption-test audit-dynamic-test dast dynamic-evidence verify-dynamic-evidence dynamic-report dynamic-fast dynamic-full findings-normalise findings-deduplicate findings-enrich findings-validate findings-evidence verify-findings-evidence findings-report findings-full release-policy-validate release-gate-evaluate release-gate-enforce release-evidence verify-release-evidence release-report release-full lifecycle-policy-validate lifecycle-initialise lifecycle-validate lifecycle-expiry lifecycle-evidence verify-lifecycle-evidence lifecycle-report lifecycle-full pre-commit-install pre-commit-run quality run docker-build docker-run threat-model-validate threat-model-evidence verify-threat-model-evidence threat-model-report api-security-evidence verify-api-security-evidence api-security-report dev-token-researcher dev-token-approver dev-token-auditor clean
1+
.PHONY: setup install format format-check lint type-check test test-coverage auth-test api-security-test terraform-fmt terraform-fmt-check terraform-init terraform-validate terraform-test infrastructure-test infrastructure-evidence verify-infrastructure-evidence infrastructure-report security-tools secrets-scan sast sast-semgrep sast-bandit semgrep-test sca dependency-audit sbom verify-sbom iac-scan checkov-scan container-build-security container-scan appsec-fast appsec-full appsec-evidence verify-appsec-evidence appsec-report dynamic-tools dynamic-server-start dynamic-server-wait dynamic-server-stop schemathesis-test api-schema-security-test zap-baseline zap-api-scan auth-boundary-test authorisation-boundary-test object-access-test input-mutation-test security-header-test cors-test resource-consumption-test audit-dynamic-test dast dynamic-evidence verify-dynamic-evidence dynamic-report dynamic-fast dynamic-full findings-normalise findings-deduplicate findings-enrich findings-validate findings-evidence verify-findings-evidence findings-report findings-full release-policy-validate release-gate-evaluate release-gate-enforce release-evidence verify-release-evidence release-report release-full lifecycle-policy-validate lifecycle-initialise lifecycle-validate lifecycle-expiry lifecycle-evidence verify-lifecycle-evidence lifecycle-report lifecycle-full evidence-source-validate evidence-aggregate evidence-generate verify-consolidated-evidence evidence-report evidence-full security-assurance-full pre-commit-install pre-commit-run quality run docker-build docker-run threat-model-validate threat-model-evidence verify-threat-model-evidence threat-model-report api-security-evidence verify-api-security-evidence api-security-report dev-token-researcher dev-token-approver dev-token-auditor clean
22

33
PYTHON ?= python3
44
VENV ?= .venv
@@ -251,6 +251,25 @@ lifecycle-report:
251251

252252
lifecycle-full: verify-findings-evidence verify-release-evidence lifecycle-policy-validate lifecycle-initialise lifecycle-expiry lifecycle-validate lifecycle-evidence verify-lifecycle-evidence lifecycle-report
253253

254+
evidence-source-validate:
255+
PYTHONPATH=src $(PYTHON) -m genomic_research_access_api.security.evidence validate-sources
256+
257+
evidence-aggregate:
258+
PYTHONPATH=src $(PYTHON) -m genomic_research_access_api.security.evidence aggregate --timestamp 2026-01-01T00:00:00Z --as-of-date 2026-01-01
259+
260+
evidence-generate:
261+
PYTHONPATH=src $(PYTHON) -m genomic_research_access_api.security.evidence generate --timestamp 2026-01-01T00:00:00Z --as-of-date 2026-01-01
262+
263+
verify-consolidated-evidence:
264+
PYTHONPATH=src $(PYTHON) -m genomic_research_access_api.security.evidence verify
265+
266+
evidence-report:
267+
PYTHONPATH=src $(PYTHON) -m genomic_research_access_api.security.evidence report
268+
269+
evidence-full: verify-threat-model-evidence verify-api-security-evidence verify-infrastructure-evidence verify-appsec-evidence verify-dynamic-evidence verify-findings-evidence verify-release-evidence verify-lifecycle-evidence evidence-source-validate evidence-generate verify-consolidated-evidence evidence-report
270+
271+
security-assurance-full: quality verify-threat-model-evidence verify-api-security-evidence verify-infrastructure-evidence verify-appsec-evidence verify-dynamic-evidence findings-full release-full lifecycle-full evidence-full
272+
254273
pre-commit-install:
255274
$(PYTHON) -m pip install pre-commit==3.8.0
256275
$(VENV)/bin/pre-commit install

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Milestone 8 adds risk-based release gates over the Milestone 7 canonical finding
3434

3535
Milestone 9 adds deterministic vulnerability lifecycle and exception governance over canonical findings and release outputs. It produces a vulnerability register, lifecycle history, security exception register, expiry reports, verification evidence, audit reports and a pinned lifecycle workflow. It does not start Security Champions, deploy, push containers, create AWS resources, commit or push.
3636

37+
Milestone 10 adds consolidated security evidence and reporting across Milestones 1-9. It produces a deterministic evidence bundle, source lineage, control coverage, security metrics, integrity summaries and audience-oriented reports. It does not start Milestone 11 developer enablement, Security Champions, dashboards, ticketing, external reporting, deployment or AWS resource creation.
38+
3739
## Milestone 1 Scope
3840

3941
Implemented:
@@ -143,6 +145,19 @@ Implemented as local governance, evidence and reports:
143145

144146
Not implemented in Milestone 9: Security Champions, production ticketing integration, deployment approvals, artefact signing/provenance, AWS deployment, container push or production vulnerability-management operations.
145147

148+
## Milestone 10 Scope
149+
150+
Implemented as local evidence aggregation and reports:
151+
152+
- Explicit source registry for threat model, API security, infrastructure, AppSec, dynamic security, findings, release assurance and lifecycle evidence.
153+
- Deterministic consolidated evidence bundle and manifest.
154+
- Evidence lineage, control coverage, metrics and integrity summaries.
155+
- Executive, product-security, engineering and audit reports.
156+
- Sensitive-content validation for consolidated outputs.
157+
- A security-evidence CI workflow with minimal permissions and no AWS credentials.
158+
159+
Not implemented in Milestone 10: Milestone 11 developer enablement, Security Champions, dashboards, ticketing, external reporting systems, regulatory certification, AWS deployment or production monitoring.
160+
146161
## API Capabilities
147162

148163
- `GET /health`
@@ -230,6 +245,13 @@ Open `http://127.0.0.1:8000/docs` for FastAPI's local OpenAPI UI.
230245
- `make verify-lifecycle-evidence`: verify lifecycle evidence checksums and determinism.
231246
- `make lifecycle-report`: generate lifecycle governance reports.
232247
- `make lifecycle-full`: verify findings and release evidence, then run the full lifecycle workflow.
248+
- `make evidence-source-validate`: validate all consolidated evidence source manifests.
249+
- `make evidence-aggregate`: aggregate source evidence into a deterministic bundle preview.
250+
- `make evidence-generate`: write consolidated evidence outputs.
251+
- `make verify-consolidated-evidence`: verify consolidated evidence checksums and content safety.
252+
- `make evidence-report`: generate consolidated reports.
253+
- `make evidence-full`: verify source evidence, generate consolidated evidence, verify it and write reports.
254+
- `make security-assurance-full`: run quality, source evidence, findings, release, lifecycle and consolidated evidence workflows.
233255
- `make secrets-scan`: run Gitleaks via local binary or pinned container.
234256
- `make semgrep-test`: run Semgrep custom rule tests.
235257
- `make sast`: run Semgrep and Bandit.

SECURITY.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ If you identify a vulnerability or unsafe pattern in this demonstration code, op
66

77
Do not submit real patient data, NHS data, genomic data, credentials, cloud account identifiers, or sensitive operational details in reports.
88

9-
Current implemented security controls include local JWT authentication, role-based and object-level authorisation, threat-model validation, non-deployed Terraform reference controls, a Milestone 5 AppSec pipeline, Milestone 6 local dynamic API security validation, Milestone 7 canonical findings normalisation, Milestone 8 local release-assurance gates, and Milestone 9 vulnerability lifecycle and exception governance.
9+
Current implemented security controls include local JWT authentication, role-based and object-level authorisation, threat-model validation, non-deployed Terraform reference controls, a Milestone 5 AppSec pipeline, Milestone 6 local dynamic API security validation, Milestone 7 canonical findings normalisation, Milestone 8 local release-assurance gates, Milestone 9 vulnerability lifecycle and exception governance, and Milestone 10 consolidated security evidence reporting.
1010

1111
Run local security checks with:
1212

@@ -17,6 +17,7 @@ make dynamic-fast
1717
make findings-full
1818
make release-full
1919
make lifecycle-full
20+
make evidence-full
2021
```
2122

22-
Docker-backed Gitleaks, Trivy, Schemathesis and ZAP scans require a running Docker daemon when native binaries or scanner containers are used. Dynamic scan targets must remain local-only. Do not treat local scanner, findings, release or lifecycle evidence as a production vulnerability-management programme, penetration test, deployment approval system or Security Champions programme.
23+
Docker-backed Gitleaks, Trivy, Schemathesis and ZAP scans require a running Docker daemon when native binaries or scanner containers are used. Dynamic scan targets must remain local-only. Do not treat local scanner, findings, release, lifecycle or consolidated evidence as a production vulnerability-management programme, penetration test, deployment approval system, regulatory certification or Security Champions programme.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"schema_version": "1.0",
3+
"control_mapping_version": "1.0",
4+
"domains": {
5+
"api_security": ["api_security", "authentication", "authorisation"],
6+
"appsec": ["supply_chain", "secrets", "container_security", "infrastructure_security"],
7+
"dynamic_security": ["api_security", "authentication", "authorisation", "configuration"],
8+
"findings": ["governance", "supply_chain"],
9+
"infrastructure": ["infrastructure_security", "iam", "data_protection", "audit_logging"],
10+
"lifecycle": ["vulnerability_management", "governance", "audit"],
11+
"release_assurance": ["release_assurance"],
12+
"threat_model": ["secure_design"]
13+
}
14+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"schema_version": "1.0",
3+
"policy_version": "1.0",
4+
"controlled_timestamp": "2026-01-01T00:00:00Z",
5+
"as_of_date": "2026-01-01",
6+
"deployment_status": "not_deployed",
7+
"required_domain_policy": "all_required_domains_must_verify",
8+
"integrity_rules": [
9+
"source_manifest_exists",
10+
"source_manifest_schema_supported",
11+
"required_outputs_exist",
12+
"output_checksums_match",
13+
"input_checksums_match",
14+
"controlled_timestamp_consistent",
15+
"deployment_status_consistent",
16+
"no_absolute_local_paths_in_consolidated_outputs",
17+
"no_secret_bearing_content"
18+
],
19+
"limitations": [
20+
"Local portfolio evidence, not regulatory certification.",
21+
"Deployment status is not_deployed.",
22+
"Milestone 10 does not implement dashboards, external reporting, ticketing or Security Champions."
23+
]
24+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"path": "/Users/example/local/path"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"authorization": "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJkZW1vIn0.signaturevalue"
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"schema_version": "9.9",
3+
"output_files": {}
4+
}

0 commit comments

Comments
 (0)