Gitの認証情報管理

最終更新: 2025-10-07 11:26:05 +0800 +0800
tags: Git | Security
原文は英語で書かれています。あなたは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年に、HTTPS経由のGit操作におけるパスワード認証を廃止しました。 パスワード入力プロンプトに個人アクセストークンを入力するか、認証情報ヘルパーまたは Git Credential Managerから提供されるようにします。

きめ細かいトークンでは、選択したリソースと権限にアクセスを制限できます。その リソースモデルが必要な操作に対応している場合に選択してください。きめ細かいトークン では利用できない権限を必要とする統合には、引き続きクラシックトークンが必要です。 いずれの場合も、次のようにします。

  1. リポジトリと権限のスコープを必要最小限にする。
  2. 有効期限を設定する。
  3. 値をオペレーティングシステムのキーチェーン、シークレットマネージャー、または CIのシークレットストレージに保存する。
  4. ログまたはシェル履歴に露出したトークンを失効させ、置き換える。

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 で閲覧・コメントする(投稿にはログインが必要です)