小Cの已经记不起来的博客

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 的时候也不会再突然弹个框问你要密码了。

评论

还没有评论。

发表评论

提交后评论将经过自动审核,审核通过后公开展示。

未在播放