CI/CD

CI/CD 中的 Git 安全基础

了解在 CI/CD 管道中使用 Git 的安全风险与防护措施,包括凭据管理、分支保护、签名验证和审计。

适合谁看
  • 要在 CI/CD 中使用 Git 的开发者
  • 想理解管线中 Git 操作的边界和安全性
前置知识
  • 知道 branch、commit、push 的基本用法
  • 有基础 CI/CD 概念
常见风险
  • 在 CI 中误用 GITHUB_TOKEN 导致安全风险
  • 不理解 shallow clone 和 partial clone 的区别

概述

CI/CD 管道中 Git 操作的安全风险与普通开发环境不同:自动化执行、凭据注入、第三方依赖等因素都会引入新的攻击面。

核心风险

风险描述影响
凭据泄露Token 或密钥被写入日志仓库被恶意推送
分支注入攻击者通过 PR 修改 CI 配置管道执行恶意代码
依赖混淆第三方 Action/Plugin 窃取数据凭据被窃取
历史篡改Force push 覆盖共享历史代码丢失或注入

凭据管理

GitHub Actions

# 使用 Secrets 而非硬编码
jobs:
  deploy:
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Deploy
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
        run: ./deploy.sh

GitLab CI

# 使用 CI/CD Variables
deploy:
  script:
    - echo "$DEPLOY_KEY" | base64 -d > deploy_key
    - chmod 600 deploy_key
    - ssh -i deploy_key user@server "deploy"

最小权限原则

  • 每个管道使用独立的凭据
  • 凭据 scope 限定到最小仓库集合
  • 定期轮换凭据
  • 禁止在日志中输出凭据

分支保护

禁止直接推送到主干

# GitHub branch protection rules
# - Require PR before merging
# - Require status checks to pass
# - Require signed commits

限制 CI 触发条件

# GitHub Actions - 只信任的 PR 触发
on:
  pull_request:
    branches: [main]
  push:
    branches: [main]

签名验证

# 在 CI 中验证提交签名
jobs:
  verify:
    steps:
      - uses: actions/checkout@v4
      - name: Verify commits
        run: |
          git log --show-signature -1

审计与日志

  • 启用 Git 操作审计日志(GitHub/GitLab 均支持)
  • 记录所有 CI 触发的 Git 操作
  • 定期审查谁有权限修改 CI 配置

继续学习

  1. ci-cd/jenkins-integration — Jenkins Git 集成
  2. security/ssh-key-management — SSH 密钥管理
  3. security/credential-helper — Git 凭据助手