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 配置
继续学习
ci-cd/jenkins-integration— Jenkins Git 集成security/ssh-key-management— SSH 密钥管理security/credential-helper— Git 凭据助手
上下篇
上一篇Jenkins 与 Git 集成命令专题
下一篇当前方向没有更多内容