CI/CD 流水线安全扫描与质量门禁

小飞兽 Python 145 次阅读 2026-07-23

一、CI/CD 安全概述

CI/CD 流水线自动化了代码从构建到部署的全过程,但如果安全措施不到位,流水线本身也会成为攻击面。常见风险包括:依赖漏洞、secrets 泄露、不安全的镜像、权限过度等。

二、依赖漏洞扫描

1. 使用 Trivy 扫描依赖

Trivy 是一款开源的容器镜像和依赖漏洞扫描工具:

name: Security Scan

on:
  push:
    branches: [main]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: 运行 Trivy 漏洞扫描
      uses: aquasecurity/trivy-action@master
      with:
        scan-type: 'fs'
        scan-ref: '.'
        format: 'sarif'
        output: 'trivy-results.sarif'

    - name: 上传扫描结果
      uses: github/codeql-action/upload-sarif@v2
      with:
        sarif_file: 'trivy-results.sarif'

2. npm 依赖安全检查

- name: 检查 npm 依赖漏洞
  run: npm audit --audit-level=high

三、SAST 静态应用安全测试

GitHub CodeQL

- name: 初始化 CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: python
    queries: security-extended

- name: 执行 CodeQL 分析
  uses: github/codeql-action/analyze@v2

四、Secrets 泄露检测

1. 使用 Gitleaks

- name: 运行 Gitleaks
  uses: gitleaks/gitleaks-action@v2
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

2. GitHub Secrets 最佳实践

  • <strong>不要在代码中硬编码 Secrets</strong>,使用环境变量或 GitHub Secrets
  • <strong>定期轮换 Secrets</strong>,尤其是长期使用的部署密钥
  • <strong>最小权限原则</strong>,只授权必要的仓库访问权限

五、容器镜像安全

1. 构建时扫描

- name: 扫描镜像漏洞
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'myapp:${{ github.sha }}'
    format: 'sarif'
    output: 'trivy-image-results.sarif'

2. 安全镜像构建最佳实践

# 使用非 root 用户
RUN useradd -m appuser
USER appuser

# 最小化基础镜像
FROM node:20-alpine

六、质量门禁(Quality Gates)

1. 定义质量门禁规则

| 检查项 | 最低标准 |
|--------|----------|
| 单元测试覆盖率 | >= 80% |
| 严重漏洞数 | 0 |
| 高危漏洞数 | <= 5 |
| SonarQube 评级 | >= B |

2. GitHub Actions 实现质量门禁

jobs:
  quality-gate:
    runs-on: ubuntu-latest
    needs: [test, security-scan]
    if: always()
    steps:
    - name: 检查测试结果
      run: |
        if [ "${{ needs.test.result }}" != "success" ]; then
          echo "测试失败,质量门禁未通过"
          exit 1
        fi

七、供应链安全

1. 验证依赖来源

# 使用 cosign 检查镜像签名
cosign verify --certificate-identity-regexp="https://github.com/" \
              --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
              myregistry/myapp:v1.0.0

2. 锁定依赖版本

确保使用 package-lock.json(Node.js)或 Pipfile.lock(Python)精确锁定依赖版本。

八、权限最小化

permissions:
  contents: read    # 只读代码
  deployments: write # 写入部署
  id-token: write   # OIDC 令牌(用于云部署)

九、常见问题

Q1: 安全扫描太慢?

使用增量扫描(只扫描变更文件),或使用缓存避免重复扫描。

Q2: 如何平衡安全和开发速度?

设置分级门禁:PR 阶段只检查关键问题,合并到 main 时执行完整扫描。

Q3: 如何处理误报?

在安全工具中配置白名单或忽略规则,并定期审查调整。

十、总结

CI/CD 安全需要贯穿整个流水线:代码提交、构建、测试、部署、运行全链路都需要安全措施。通过自动化安全扫描和质量门禁,可以在快速迭代的同时保障系统安全。