Git 認證資料管理

最後更新: 2025-10-07 11:26:05 +0800 +0800
tags: Git | Security
原文以英文撰寫。您正在閱讀AI翻譯版本。

Git 將 HTTP(S) 驗證委派給認證資料輔助程式。SSH 遠端則改用 SSH 金鑰與 agent,因此 credential.helper 不會管理它們的私密金鑰。

選取認證資料輔助程式 #

列出已設定的輔助程式,以及設定它們的設定檔:

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

Git 會依設定順序要求輔助程式填入缺少的認證資料欄位。輔助程式可以拒絕或傳回部分資料,之後 Git 可能查詢另一個輔助程式,或提示使用者。

輔助程式儲存方式適用用途
cache本機 daemon 中的記憶體短期開發工作階段
store純文字 ~/.git-credentials僅在可接受純文字儲存風險時
osxkeychainmacOS KeychainmacOS 開發
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 是用來與已設定輔助程式通訊的 plumbing,使用以空白行分隔的鍵值記錄:

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 上閱讀或評論(發表評論需要登入)