Implementation Roadmap¶
You can't harden everything at once. Prioritize controls by risk and audit value.
Phased Rollout
Follow the 12-week timeline to avoid disrupting existing workflows. Skip phases at your own risk.
Three-month plan from foundation to full enforcement.
Month 1: Foundation¶
Goal: Core enforcement in place. Evidence collection begins.
Week 1: Branch Protection¶
Tasks:
- Enable branch protection on
mainand production branches - Require 1+ approving reviews
- Enable
enforce_admins - Require linear history
Validation:
gh api repos/org/repo/branches/main/protection \
| jq '{reviews: .required_pull_request_reviews, admins: .enforce_admins}'
Documentation: Update CONTRIBUTING.md with review requirements.
Week 2: CI/CD Status Checks¶
Tasks:
- Create
required-checks.ymlworkflow (tests, lint) - Configure branch protection to require checks
- Test on non-critical repository first
Workflow:
name: Required Checks
on: [pull_request]
jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: make test
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: make lint
Validation: Open PR, verify checks block merge until passing.
Week 3: GitHub App Setup¶
Tasks:
- Create GitHub App for automation (see Setup Guide)
- Configure permissions (releases, PRs, contents)
- Generate and store private key in secrets
- Replace first PAT usage in workflows
Validation:
- name: Test app token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
Migration tracking: Document remaining PAT usages for month 2.
Week 4: Evidence Archive¶
Tasks:
- Set up GCS bucket with lifecycle policy (3 year retention)
- Create monthly evidence collection workflow
- Archive first month's data (branch protection config, merged PRs)
Workflow:
name: Monthly Evidence
on:
schedule:
- cron: '0 0 1 * *'
jobs:
archive:
runs-on: ubuntu-latest
steps:
- run: gh api repos/org/repo/branches/main/protection > config.json
- run: gsutil cp *.json gs://audit-evidence/
Validation: Verify files appear in GCS bucket.
Month 2: Hardening¶
Goal: Add secrets detection, commit signing, and SBOM generation.
Week 5: Secrets Detection¶
Tasks:
- Add TruffleHog to
.pre-commit-config.yaml - Deploy pre-commit config to all repositories
- Add secrets scan to CI workflow
- Document bypass procedure (
--no-verifytracking)
Pre-commit hook:
repos:
- repo: https://github.com/trufflesecurity/trufflehog
rev: v3.63.0
hooks:
- id: trufflehog
entry: trufflehog filesystem --fail --no-update
Validation: Attempt to commit AWS key, verify block.
See Pre-commit Security Gates for full implementation.
Week 6: Signed Commits¶
Tasks:
- Generate GPG keys for core team
- Add public keys to GitHub
- Configure Git to sign commits automatically
- Enable
required_signatureson protected branches
Configuration:
Validation:
See Commit Signing for setup guide.
Week 7: SBOM Generation¶
Tasks:
- Add Syft/Trivy to build pipelines
- Generate SBOM for each container build
- Upload SBOMs to artifact storage
- Verify license compliance (no GPL in proprietary code)
Workflow:
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: app:${{ github.sha }}
format: cyclonedx-json
output-file: sbom.json
- name: Upload SBOM
uses: actions/upload-artifact@v4
with:
name: sbom
path: sbom.json
Validation: Download artifact, verify SBOM contains expected dependencies.
See SBOM Generation for full implementation.
Week 8: Complete PAT Migration¶
Tasks:
- Audit all remaining PAT usages (
grep -r GITHUB_TOKEN .github/) - Create additional GitHub Apps for specific use cases
- Replace all PATs with app tokens
- Revoke old PATs
Validation: No PATs referenced in active workflows.
Month 3: Validation & Policy-as-Code¶
Goal: Simulate audit, fix gaps, add runtime enforcement.
Week 9: Vulnerability Scanning¶
Tasks:
- Add Trivy/Grype container scanning to CI
- Set severity threshold (HIGH/CRITICAL block merge)
- Configure vulnerability database auto-update
Workflow:
- name: Scan container
run: |
trivy image --severity HIGH,CRITICAL --exit-code 1 \
gcr.io/project/app:${{ github.sha }}
Validation: Introduce test vulnerability, verify build fails.
See Zero-Vulnerability Pipelines.
Week 10: Policy-as-Code (Kyverno)¶
Tasks:
- Deploy Kyverno to Kubernetes clusters
- Install Policy Reporter for observability
- Implement core policies (resource limits, image sources, labels)
- Configure audit mode first, then enforcement mode
Core policy:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-limits
spec:
validationFailureAction: Enforce
rules:
- name: check-limits
match:
resources:
kinds: [Pod]
validate:
message: "CPU and memory limits required"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
Validation: Deploy pod without limits, verify rejection.
See Policy-as-Code with Kyverno for end-to-end implementation.
Week 11: Audit Simulation¶
Tasks:
- Pull evidence like an auditor would (API queries for March data)
- Generate summary report (PR reviews, check results, signed commits)
- Identify gaps in evidence or controls
- Document findings and remediation plan
Simulation script:
# Verify branch protection
gh api repos/org/repo/branches/main/protection
# Sample March PRs
gh api 'repos/org/repo/pulls?state=closed&base=main' \
--jq '.[] | select(.merged_at | startswith("2025-03"))'
# Check signature coverage
./scripts/signature-coverage.sh 2025-03-01 2025-04-01
Validation: Evidence collection succeeds for sampled period.
Week 12: Remediation & Runbook¶
Tasks:
- Fix gaps identified in simulation
- Create runbook for responding to audit requests
- Train team on SDLC controls (why they exist, how to use them)
- Document exception processes (emergency bypass, post-review)
Runbook sections:
- How to retrieve branch protection evidence
- How to query PR review history
- How to generate compliance reports
- Exception request template
- Bypass logging procedure
Validation: Team can retrieve evidence without assistance.
Next Steps¶
- Execution Guide - Progress tracking, audit readiness criteria, rollback planning, cost estimation, success metrics
Week 1: Protection enabled. Week 4: Evidence collected. Week 12: Audit simulation passed. Controls enforced. System hardened.