用公钥认证替代密码登录是加固git仓库访问最基础关键的一步,可杜绝暴力破解与密码泄露,并为分支保护、代码审查等权限策略提供可信身份基础。

用公钥认证替代密码登录,是加固 Git 仓库访问最基础也最关键的一步。它不仅能杜绝暴力破解和密码泄露风险,还能为精细化权限控制打下可信身份基础——毕竟所有后续的权限策略(如分支保护、代码审查强制、角色分级)都依赖于“谁在提交”这个前提被准确识别。
一、生成并部署安全的 SSH 公钥
不要用默认参数生成密钥,避免弱算法或无密码保护:
- 运行 ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519(推荐 Ed25519,比 RSA 更快更安全)
- 务必设置密钥口令(passphrase),防止私钥被盗后直接滥用
- 将公钥(~/.ssh/id_ed25519.pub)内容完整复制,粘贴到 Git 托管平台(如 GitHub/GitLab/Gitee)的 SSH Keys 设置页
- 本地配置 ~/.ssh/config 显式指定主机、用户、私钥路径,避免混淆多个仓库账户
二、Git 服务器端强制公钥准入(以 Git over SSH 为例)
若自建 Git 服务(如 Gitea、Gitolite 或裸仓库 + authorized_keys),需确保不接受密码登录:
- 禁用 OpenSSH 的 PasswordAuthentication yes,设为 no;同时关闭 PermitEmptyPasswords
- 使用 ForceCommand 或专用 shell(如 git-shell)限制用户只能执行 Git 操作,禁止任意命令执行
- 在 ~/.ssh/authorized_keys 中为每条公钥添加环境变量与命令限制,例如:
environment="GIT_USER=alice",command="/usr/bin/git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-ed25519 AAAA... alice@dev
三、基于公钥身份实现细粒度权限控制
公钥本身不带角色信息,需结合平台能力或外部系统绑定身份与权限:
- GitHub/GitLab 支持按成员角色(Maintainer、Developer)控制分支推送、合并、删除等操作;确保团队成员使用唯一、实名关联的公钥,禁用共享密钥
- 对敏感分支(如 main、release/*)启用保护规则:要求 PR、指定审阅人、CI 通过、线性历史等,这些策略均基于提交者公钥所绑定的账户生效
- 企业级场景可对接 LDAP/OAuth,并将公钥上传行为与员工工号强绑定;自动化脚本定期审计 authorized_keys 中未关联工号或过期的密钥
四、运维与应急建议
再好的机制也需要可持续维护:
- 私钥统一使用密码管理器存储,禁止明文截图、邮件传输;开发机建议启用 FIDO2 安全密钥(如 YubiKey)托管私钥
- 建立密钥生命周期管理流程:入职配发、离职立即吊销、密钥定期轮换(如每年一次)、高危操作强制二次验证
- 在 CI/CD 流水线中,使用 deploy keys 或机器用户(machine user)专用密钥,权限最小化,且与个人开发者密钥严格分离










