Skip to content
On this page

Git 安全最佳实践

Git安全是保护代码仓库和开发流程的重要环节。本章详细介绍Git安全最佳实践,包括认证、授权、数据保护和安全配置。

Git安全基础

安全威胁类型

Git仓库面临的安全威胁包括:

  • 未授权访问
  • 敏感信息泄露
  • 恶意代码注入
  • 供应链攻击
  • 提交历史篡改

安全原则

  • 最小权限原则
  • 深度防御
  • 零信任模型
  • 安全开发生命周期

身份认证

SSH认证

bash
# 生成SSH密钥
ssh-keygen -t ed25519 -C "your-email@example.com"
# 或使用RSA(推荐4096位)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

# 设置SSH密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

# 启动SSH代理
eval "$(ssh-agent -s)"

# 添加SSH密钥到代理
ssh-add ~/.ssh/id_ed25519

# 测试SSH连接
ssh -T git@github.com
ssh -T git@gitlab.com
ssh -T git@bitbucket.org

配置SSH安全选项

bash
# 配置SSH客户端 (~/.ssh/config)
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    PreferredAuthentications publickey
    AddKeysToAgent yes
    UseKeychain yes

Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

# 启用连接复用
Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

个人访问令牌

bash
# 配置凭证助手
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'  # 1小时

# 或使用存储(谨慎使用)
git config --global credential.helper store

# Windows使用Credential Manager
git config --global credential.helper manager

# macOS使用钥匙串
git config --global credential.helper osxkeychain

GPG签名验证

生成GPG密钥

bash
# 生成GPG密钥
gpg --full-generate-key

# 选择RSA密钥,4096位,设置过期时间
# 输入用户ID和邮箱

# 列出GPG密钥
gpg --list-secret-keys --keyid-format LONG

# 获取密钥ID
# sec   rsa4096/ABC1234567890DEF 2023-01-01 [SC]
#       ABC1234567890DEF

配置GPG签名

bash
# 配置Git使用GPG签名
git config --global user.signingkey ABC1234567890DEF

# 启用自动签名
git config --global commit.gpgsign true

# 或为特定仓库启用
git config commit.gpgsign true

# 签名标签
git tag -s v1.0.0 -m "Signed version"

# 签名提交
git commit -S -m "Signed commit"

添加GPG公钥到平台

bash
# 导出GPG公钥
gpg --armor --export ABC1234567890DEF

# 添加到GitHub/GitLab账户
# 复制输出内容到账户设置中的GPG密钥部分

仓库访问控制

远程仓库安全

bash
# 使用SSH而非HTTPS(更安全)
git remote set-url origin git@github.com:username/repo.git

# 验证远程仓库URL
git remote -v

# 配置安全的HTTP设置
git config --global http.sslverify true
git config --global http.postBuffer 1048576000  # 1GB for large pushes

分支保护

bash
# 配置本地分支保护
git config --global push.default simple

# 在平台配置分支保护规则(GitHub/GitLab)
# - 需要拉取请求审查
# - 需要状态检查
# - 禁止强制推送
# - 禁止删除

敏感信息保护

避免提交敏感信息

bash
# 配置.gitignore防止敏感文件被提交
cat >> .gitignore << EOF
# 环境变量
.env
.env.local
.env.*.local

# 认证信息
*.key
*.pem
*.crt
*.cer
config/secrets.yml

# 日志
*.log
logs/

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db
EOF

使用Git Hooks防止敏感信息

bash
# .git/hooks/pre-commit
#!/bin/sh
# 检查敏感信息

# 检查常见敏感模式
git diff --cached --name-only | xargs grep -l "password\|secret\|token\|key\|pwd" && echo "Found potential secrets!" && exit 1

# 检查AWS密钥
git diff --cached --name-only | xargs grep -l "AKIA[A-Z0-9]\{16\}" && echo "Found potential AWS key!" && exit 1

exit 0

使用专用工具检查敏感信息

bash
# 使用git-secrets
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets
sudo make install

# 安装到仓库
git secrets --install
git secrets --register-aws

# 添加自定义模式
git secrets --add 'password\s*=\s*["\'][^"\']*["\']'

代码审查安全

启用强制代码审查

bash
# 在GitHub/GitLab上配置:
# - 要求Pull Request审查
# - 要求特定人员审查
# - 要求状态检查通过
# - 禁止直接推送到main分支

安全代码审查清单

bash
# 安全审查检查清单
# - 没有硬编码的敏感信息
# - 没有不安全的依赖
# - 没有危险的函数调用
# - 适当的输入验证
# - 适当的错误处理
# - 适当的权限控制

依赖安全

依赖扫描

bash
# 使用npm审计
npm audit
npm audit --audit-level high

# 使用yarn审计
yarn audit

# 使用GitHub Dependabot
# 在.github/dependabot.yml配置:
# version: 2
# updates:
#   - package-ecosystem: "npm"
#     directory: "/"
#     schedule:
#       interval: "weekly"

依赖验证

bash
# 验证依赖完整性
npm audit signatures
yarn npm audit

# 使用Snyk扫描
npm install -g snyk
snyk test
snyk monitor

供应链安全

依赖锁定

bash
# 使用锁定文件确保依赖版本固定
# package-lock.json (npm)
# yarn.lock (yarn)
# Pipfile.lock (pipenv)
# Gemfile.lock (bundler)

依赖来源验证

bash
# 配置可信的包管理器源
npm config set registry https://registry.npmjs.org/
npm config set @scope:registry https://custom-registry.com/

# 验证包签名
npm config set @scope:always-auth true

Git配置安全

安全配置检查

bash
# 检查全局配置
git config --global --list

# 检查仓库配置
git config --list

# 安全相关配置
git config --global core.precomposeunicode true  # 防止Unicode欺骗
git config --global core.safecrlf true           # 防止CRLF问题
git config --global core.protectHFS true         # 保护HFS+文件系统
git config --global core.protectNTFS true        # 保护NTFS文件系统

钩子安全

bash
# 验证钩子脚本权限
find .git/hooks -type f -executable

# 确保钩子脚本安全
chmod 755 .git/hooks/*

安全监控

提交历史监控

bash
# 监控敏感信息提交
git log --all --full-history -- "*password*" "*secret*" "*token*"

# 使用工具扫描历史
# git-secrets扫描历史
git secrets --scan-history

# TruffleHog扫描
docker run --rm -v $(pwd):/repo trufflesecurity/truffleHog:latest /repo

访问日志

bash
# 配置Git操作日志
git config --global log.showSignature true

# 使用平台提供的访问日志
# GitHub: Security log
# GitLab: Audit log
# Bitbucket: Event log

安全工具

安全扫描工具

bash
# GitLeaks
go install github.com/gitleaks/gitleaks/v8/cmd/gitleaks@latest
gitleaks detect --source . --verbose

# TruffleHog
docker run --rm -v $(pwd):/repo trufflesecurity/truffleHog:latest /repo

# Gitrob
go install github.com/michenriksen/gitrob@latest
gitrob <github_access_token> <target_organization>

集成安全工具

bash
# 在CI/CD中集成安全扫描
# GitHub Actions示例
name: Security Scan
on: [push, pull_request]
jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: GitLeaks
        uses: gitleaks/gitleaks-action@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}

应急响应

安全事件处理

bash
# 发现敏感信息泄露时的应急步骤
# 1. 立即撤回访问权限
# 2. 旋转泄露的密钥
# 3. 重写历史移除敏感信息
# 4. 通知相关方
# 5. 调查泄露范围
# 6. 防止再次发生

历史重写安全

bash
# 安全地从历史中移除敏感信息
git filter-repo --path path/to/sensitive-file --invert-paths

# 或使用BFG Repo-Cleaner
java -jar bfg.jar --delete-files id_rsa repo.git

安全培训和意识

安全最佳实践

bash
# 开发者安全培训要点
# - 不要在代码中硬编码敏感信息
# - 使用环境变量管理密钥
# - 定期旋转密钥
# - 最小权限原则
# - 定期安全审计
# - 代码审查流程

安全检查清单

bash
# 提交前安全检查清单
# [ ] 没有硬编码的密码或密钥
# [ ] .gitignore配置正确
# [ ] 没有敏感的配置文件
# [ ] 依赖版本安全
# [ ] 代码经过安全审查
# [ ] 提交信息不包含敏感信息

通过实施这些安全最佳实践,可以显著提高Git仓库的安全性,保护代码和敏感信息不被未授权访问或泄露。