第二十九章:DevSecOps — 安全左移
“安全不是开发完成后的检查站,而是贯穿整个流水线的守护者。”
mindmap
root((DevSecOps))
CI/CD 安全
SAST
SCA
DAST
镜像扫描
工具链
Semgrep
Snyk
Trivy
OWASP ZAP
IaC 安全
tfsec
Checkov
kubesec
文化
Security Champion
安全培训
安全门禁
29.1 DevSecOps 理念
DevSecOps 将安全融入 DevOps 的每个阶段:
DevSecOps 流水线:
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 代码 │─▶│ SAST │─▶│ SCA │─▶│ 构建 │─▶│ 镜像 │─▶│ DAST │─▶│ 部署 │
│ │ │ │ │ │ │ │ │ 扫描 │ │ │ │ │
│ 编写 │ │ 静态 │ │ 依赖 │ │ 编译 │ │ 漏洞 │ │ 动态 │ │ 安全 │
│ 代码 │ │ 分析 │ │ 检查 │ │ 打包 │ │ 检查 │ │ 测试 │ │ 配置 │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘
│ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼
Pre-commit CI CI CI CI Staging Production
Hook 阶段 阶段 阶段 阶段 环境 环境
29.2 SAST — 静态应用安全测试
工具 |
语言支持 |
特点 |
开源 |
|---|---|---|---|
Semgrep |
多语言 |
自定义规则、快速 |
✅ |
CodeQL |
多语言 |
GitHub 集成、深度分析 |
✅ |
SonarQube |
多语言 |
全面、企业级 |
部分 |
Bandit |
Python |
Python 专用 |
✅ |
# Semgrep 扫描
semgrep scan --config auto .
# 自定义规则示例
# rules/no-hardcoded-secrets.yaml
rules:
- id: hardcoded-password
patterns:
- pattern: password = "..."
message: "Hardcoded password detected"
severity: ERROR
languages: [python]
29.3 SCA — 软件组成分析
# Snyk — 依赖漏洞扫描
snyk test
snyk monitor # 持续监控
# pip-audit — Python 依赖审计
pip-audit
# npm audit — Node.js 依赖审计
npm audit --audit-level=high
29.4 DAST — 动态应用安全测试
# OWASP ZAP — 动态扫描
docker run -t zaproxy/zap-stable zap-baseline.py \
-t https://staging.example.com \
-r report.html
# Nuclei — 快速漏洞扫描
nuclei -u https://staging.example.com -t cves/
29.5 IaC 安全
# tfsec — Terraform 安全扫描
tfsec .
# Checkov — 多 IaC 框架支持
checkov -d .
checkov --framework terraform,kubernetes
# kubesec — Kubernetes 清单安全评分
kubesec scan deployment.yaml
29.6 GitHub Actions 安全流水线
name: Security Pipeline
on: [push, pull_request]
jobs:
sast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Semgrep SAST
uses: returntocorp/semgrep-action@v1
with:
config: auto
sca:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Snyk SCA
uses: snyk/actions/python@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
container-scan:
runs-on: ubuntu-latest
needs: [sast, sca]
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Trivy scan
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
severity: HIGH,CRITICAL
exit-code: 1
secret-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: GitLeaks
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
iac-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: ./terraform
29.7 安全门禁策略
严重程度 |
CI 行为 |
说明 |
|---|---|---|
Critical |
❌ 阻断 |
必须修复才能合并 |
High |
❌ 阻断 |
必须修复或获得豁免 |
Medium |
⚠️ 警告 |
记录并计划修复 |
Low |
ℹ️ 信息 |
记录,不阻断 |
29.8 Security Champion 计划
每个团队指定 1-2 名 Security Champion:
├── 参加安全培训(每季度)
├── 审查团队的安全实践
├── 推动安全工具的采用
├── 作为安全团队和开发团队的桥梁
└── 参与威胁建模和安全设计评审
29.9 小结
DevSecOps 将安全融入 CI/CD 的每个阶段
SAST(Semgrep)在编码阶段发现漏洞
SCA(Snyk)检测依赖中的已知漏洞
DAST(ZAP)在运行时发现安全问题
IaC 扫描(Checkov)确保基础设施配置安全
安全门禁 根据严重程度决定阻断还是警告
Security Champion 是安全文化落地的关键