# 第二十九章:DevSecOps — 安全左移 > "安全不是开发完成后的检查站,而是贯穿整个流水线的守护者。" ```{mermaid} 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 专用 | ✅ | ```bash # 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 — 软件组成分析 ```bash # Snyk — 依赖漏洞扫描 snyk test snyk monitor # 持续监控 # pip-audit — Python 依赖审计 pip-audit # npm audit — Node.js 依赖审计 npm audit --audit-level=high ``` ## 29.4 DAST — 动态应用安全测试 ```bash # 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 安全 ```bash # tfsec — Terraform 安全扫描 tfsec . # Checkov — 多 IaC 框架支持 checkov -d . checkov --framework terraform,kubernetes # kubesec — Kubernetes 清单安全评分 kubesec scan deployment.yaml ``` ## 29.6 GitHub Actions 安全流水线 ```yaml 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** 是安全文化落地的关键