The Problem with "Bolt-On" Security
Most organizations treat security as a gate at the end of the development process. The code is written, tested, and ready to ship — and then security reviews it. This creates two bad outcomes: security becomes a bottleneck, and developers resent it.
DevSecOps is the antidote. The goal is to integrate security checks throughout the pipeline so that vulnerabilities are caught when they're cheapest to fix — at commit time, not in production.
Here's how I architect this in practice.
The Security Pipeline Architecture
Think of your security pipeline in layers, each catching different classes of issues:
[Code Commit]
↓
[Pre-commit hooks] → Secret scanning, linting
↓
[PR Checks] → SAST, SCA, IaC scanning
↓
[Build] → Container image scanning
↓
[Staging Deploy] → DAST, API fuzzing
↓
[Production] → Runtime security, anomaly detectionLayer 1: Pre-Commit Hooks (Developer's Machine)
The fastest feedback loop is catching issues before code even reaches the repository. Use pre-commit hooks for:
- Secret detection —
detect-secretsorgitleaksto catch API keys, passwords, tokens - IaC linting —
tflint,checkovfor Terraform,kube-linterfor Kubernetes manifests - Dependency checking —
safetyfor Python,npm auditfor Node
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
- repo: https://github.com/bridgecrewio/checkov
rev: 3.1.0
hooks:
- id: checkov
args: ['--directory', '.']Layer 2: SAST in Pull Requests
Static Application Security Testing analyzes code without executing it. Key tools:
- Semgrep — Fast, rule-based, highly customizable. Write your own rules for company-specific patterns (e.g., "don't use our deprecated crypto library")
- CodeQL — GitHub's analysis engine. Excellent for finding complex vulnerability patterns
- Snyk Code — Good developer UX, actionable results
The key to making SAST not-annoying: tune aggressively. Only alert on high-confidence findings. False positives kill adoption.
Layer 3: Software Composition Analysis (SCA)
Your code is mostly other people's code — open-source dependencies. SCA scans your dependency tree for known CVEs.
- Dependabot / Renovate — Automated PRs when dependencies have CVEs
- Snyk Open Source — Deep reachability analysis (is this vulnerable code actually called?)
- OWASP Dependency-Check — Open source, good for compliance reporting
Set policy: block merges on critical CVEs with available fixes. Warn on high. Ignore info.
Layer 4: Container Image Scanning
If you're shipping containers, scan them before they go to the registry.
# GitHub Actions: scan with Trivy
- name: Scan container image
uses: aquasecurity/trivy-action@master
with:
image-ref: ${{ env.IMAGE_TAG }}
format: sarif
severity: CRITICAL,HIGH
exit-code: 1 # Fail the build on critical/highAlso: enforce a minimal base image policy. Use distroless or alpine images. Scratch images where possible. Fewer packages = smaller attack surface.
Layer 5: IaC Security Scanning
Infrastructure as Code is code. Scan it.
- Checkov — Broad coverage (Terraform, CloudFormation, ARM, Kubernetes, Dockerfile)
- tfsec — Terraform-specific, fast
- Trivy — Also scans IaC, plus misconfigurations
Integrate findings with your PR comment system so developers see security issues inline.
Layer 6: DAST Against Staging
Dynamic Application Security Testing runs against a live application. It catches issues SAST misses: auth bypasses, business logic flaws, injection in complex flows.
- OWASP ZAP — Free, solid baseline scanning
- Burp Suite Enterprise — Commercial, excellent for APIs
- Nuclei — Template-based, fast, easy to customize
Run DAST against your staging environment after each deploy, before promotion to production.
The Feedback Loop That Matters
Security tools are only useful if developers act on them. Design for developer experience:
1. Surface findings in the PR — not in a separate dashboard developers never check
2. Link to remediation guidance — not just "SQL injection detected" but "here's how to use parameterized queries"
3. Provide escape hatches — suppression mechanisms with required justification and expiry dates
4. Track metrics — Mean time to remediate by severity. Show teams their trends.
Conclusion
A good DevSecOps pipeline doesn't slow teams down — it speeds them up by catching bugs before they become incidents. The investment in tooling pays back in reduced security reviews, faster audits, and fewer 2am pages.
Start with secret scanning and SCA — highest ROI, lowest friction. Add SAST. Then containers. Then DAST. Iterate based on what your teams actually build.