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