Appearance
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仓库的安全性,保护代码和敏感信息不被未授权访问或泄露。