第二十九章: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 是安全文化落地的关键