Git 凭据管理

最后更新: 2025-10-07 11:26:05 +0800 +0800
tags: Git | 安全
原文以英文撰写。您正在阅读AI翻译版本。

Git 将 HTTP(S) 身份验证委托给凭据助手。SSH 远程仓库改用 SSH 密钥和代理,因此 credential.helper 不会管理它们的私钥。

选择凭据助手 #

列出已配置的助手以及设置它们的配置文件:

sh
git config --show-origin --get-all credential.helper
git help -a | grep credential-

Git 按配置顺序请求助手填充缺失的凭据字段。助手可以拒绝请求或返回部分数据,之后 Git 可能查询另一个助手或提示用户。

助手存储适用场景
cache本地守护进程中的内存短期开发会话
store明文 ~/.git-credentials仅在接受明文存储风险时使用
osxkeychainmacOS 钥匙串macOS 开发
Git Credential Manager平台安全存储和浏览器登录受支持的桌面平台

例如,使用有时限的内存缓存:

sh
git config --global credential.helper 'cache --timeout=3600'

相较于 store,优先使用平台钥匙串或 Git Credential Manager。本地仓库可以通过省略 --global 覆盖全局助手。

作用域令牌和用户名 #

除非启用路径匹配,否则 Git 会根据协议和主机匹配凭据。当不同仓库使用不同账户或令牌时,应包含 HTTP 路径:

sh
git config --global credential.useHttpPath true

凭据段可以预填用户名而不存储秘密:

ini
[credential "https://github.com"]
    username = octo

不要将令牌嵌入远程 URL。Git 配置、进程参数、终端历史记录、调试输出和复制的日志都可能暴露此类 URL。

安全使用 GitHub 令牌 #

GitHub 在 2021 年移除了 Git 通过 HTTPS 进行的密码身份验证。请在密码提示中输入个人访问令牌,或允许凭据助手或 Git Credential Manager 提供令牌。

细粒度令牌将访问限制到选定资源和权限。当其资源模型涵盖所需操作时,应选择细粒度令牌。对于需要细粒度令牌不具备的权限的集成,仍然需要经典令牌。无论使用哪种令牌:

  1. 授予最小的仓库和权限作用域;
  2. 设置过期日期;
  3. 将值保存在操作系统钥匙串、秘密管理器或 CI 秘密存储中;
  4. 如果令牌暴露在日志或 shell 历史记录中,立即撤销并替换它。

SSH 不使用 HTTP 凭据助手。如果出站端口 22 被阻止,托管服务商可能支持通过 443 端口使用 SSH;只有在核实服务商发布的说明和主机密钥指纹后,才配置该端点。

控制交互式提示 #

当助手无法提供凭据时,Git 会依次检查 GIT_ASKPASS、core.askPass 和 SSH_ASKPASS。选定的程序接收提示作为参数,并将答案写入标准输出。没有合适的 askpass 程序时,Git 会在控制终端上提示。

自动化应从 CI 秘密存储接收短期、有作用域限制的令牌。当非交互式任务必须失败而不是因等待提示而挂起时,设置 GIT_TERMINAL_PROMPT=0:

sh
GIT_TERMINAL_PROMPT=0 git fetch origin

绝不要将令牌放入仓库、Docker 镜像层、测试夹具,或放入进程列表可以显示的命令行中。

检查、拒绝和轮换凭据 #

git credential 是与已配置助手通信的底层命令,使用由空行分隔的键值记录:

sh
printf 'protocol=https\nhost=example.com\n\n' | git credential fill
printf 'protocol=https\nhost=example.com\nusername=octo\n\n' |
  git credential reject

fill 请求凭据,approve 要求助手保存凭据,reject 要求助手删除被拒绝的凭据。助手控制具体的存储和删除行为。钥匙串应用还提供了检查和删除条目的图形方式。

撤销或轮换令牌后,在重试操作前删除旧的助手条目。否则 Git 可能继续提交过时凭据,从而掩盖成功的替换。

评论

在 GitHub 上阅读或评论(发表评论需要登录)