Git 工作流中的 鉴权体系 最佳实践
前几天帮同事排查问题,他重装系统过后代码拉不下来了,push 一路报 Authentication failed。我瞄了一眼他的 remote 地址,好家伙,token 直接拼在 URL 里,还是两年前生成的,早过期了...说白了就是当年图省事埋的雷。趁着这个机会,把我这几年在 Git 鉴权上踩过的坑和最后固定下来的一套做法整理一下,都是实测可用的。
HTTPS + Token:先把最基本的这条路走通
GitHub 从 2021 年 8 月开始就不接受账号密码做 git 操作了,GitLab、Gitee 也陆续跟进,所以 HTTPS 方式现在唯一的正确姿势就是 Personal Access Token。去 GitHub 的 Settings → Developer settings 里生成一个,建议直接用 fine-grained token,权限只勾你真正需要的仓库,过期时间设个 90 天,别选永久——没准儿哪天泄露了,命短的 token 能帮你少挨一顿毒打。
生成完之后,千万别干这种事:
git remote set-url origin https://用户名:ghp_xxxxxxxx@github.com/xxx/xxx.git
这样 token 会明文躺在 .git/config 里,还会进 shell history,换电脑、换 token 都是坑。正确做法是交给 credential helper 存着:
# Windows 装 Git for Windows 自带 Git Credential Manager,一般不用动
git config --global credential.helper manager
# macOS 走钥匙串
git config --global credential.helper osxkeychain
# Linux 桌面环境可以试 libsecret,实在没有再用 store
git config --global credential.helper store
注意 store 是明文存在 ~/.git-credentials 里的,服务器上迫不得已再用,心里得有数。懒人也可以直接装 GitHub CLI 跑一下 gh auth login,它会顺手把 credential helper 都配好。
SSH:一次配置,长期省心
我日常开发基本都走 SSH,配一次就不用管了。首先生成密钥:
ssh-keygen -t ed25519 -C "你的邮箱"
没什么特殊理由就别再用 RSA 了,ed25519 又短又快。passphrase 建议设一个,然后让 ssh-agent 帮你记住,不然每次 push 都输一遍你会疯的。
然后 cat ~/.ssh/id_ed25519.pub,把内容贴到 GitHub 的 SSH Keys 里,接着 ssh -T git@github.com 测一下,看到 Hi xxx 就成了。最后把已有仓库的 remote 换过去即可:
git remote set-url origin git@github.com:xxx/xxx.git
一台机器多个账号怎么办
公司一个号,个人一个号,直接配肯定串。用 ~/.ssh/config 给不同账号起别名:
# 公司账号
Host company
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_company
# 个人账号
Host personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
之后 clone 的时候把域名换成别名就行,比如 git clone git@personal:me/repo.git。别名随便起,自己记得住就行。
服务器和 CI:用 Deploy Key,别拿自己的私钥顶上去
服务器上拉代码,很多人图省事直接把自己日常用的私钥拷过去,这是大忌——私钥一旦进了服务器,泄露面就从一台开发机扩大到整个机房了。正确做法是在仓库的 Settings → Deploy keys 里加一把专用公钥,默认只读,真要在服务器上 push 再勾读写。一个仓库一把 key,私钥丢了 revoke 掉重新生成,完全不心疼。
CI 也同理,token 放在平台的 Secrets 里,跑的时候以环境变量注入,别硬编码在 yaml 里提交进仓库。仓库要是再开放一点,这跟直接把 token 贴到公开场合没区别。
最后说两句安全上的事
token 和私钥最怕的就是进仓库。哪怕你事后把文件删了,历史里也还在,GitHub 的 secret scanning 扫到了会直接给你发邮件,严重的当场自动 revoke 你的 token,然后某天 push 突然全挂,别问我是怎么知道的。真泄露了,第一时间去 revoke,光删文件没有任何用。
另外建议团队里统一约定:token 全部设过期时间,到期就续。平时觉得麻烦,总比哪天翻车了排查半天强。
不出问题的话,把上面这套配完,你后面几年基本不用再碰鉴权这摊子事了,push 的时候也不会再突然弹个框问你要密码了。
评论
还没有评论。
发表评论
提交后评论将经过自动审核,审核通过后公开展示。