GitはHTTP(S)認証を認証情報ヘルパーに委任します。一方、SSHリモートはSSHキーと
エージェントを使用するため、credential.helper はその秘密鍵を管理しません。
認証情報ヘルパーの選択 #
設定済みのヘルパーを、それらを設定した構成ファイルとともに一覧表示します。
git config --show-origin --get-all credential.helper
git help -a | grep credential-Gitは、設定された順序でヘルパーに問い合わせ、不足している認証情報フィールドを 埋めます。ヘルパーは応答を拒否したり、一部のデータのみを返したりできます。その後、 Gitは別のヘルパーに問い合わせるか、ユーザーに入力を求める場合があります。
| ヘルパー | 保存先 | 適した用途 |
|---|---|---|
cache | ローカルデーモンのメモリ | 短時間の開発セッション |
store | 平文の ~/.git-credentials | 平文での保存が許容されるリスクである場合のみ |
osxkeychain | macOSキーチェーン | macOSでの開発 |
| Git Credential Manager | プラットフォームの安全なストレージとブラウザーによるサインイン | 対応するデスクトッププラットフォーム |
たとえば、期限付きのメモリ内キャッシュを使用します。
git config --global credential.helper 'cache --timeout=3600'store よりもプラットフォームのキーチェーンまたはGit Credential Managerを優先して
ください。--global を省略すると、ローカルリポジトリでグローバルヘルパーを
上書きできます。
トークンとユーザー名のスコープ設定 #
パス照合が有効でない限り、Gitはプロトコルとホストによって認証情報を照合します。 アカウントまたはトークンがリポジトリごとに異なる場合は、HTTPパスを含めます。
git config --global credential.useHttpPath true認証情報セクションでは、シークレットを保存せずにユーザー名を事前設定できます。
[credential "https://github.com"]
username = octoリモートURLにトークンを埋め込まないでください。Gitの構成、プロセス引数、 ターミナル履歴、デバッグ出力、コピーされたログによって、そのようなURLが露出する 可能性があります。
GitHubトークンの安全な使用 #
GitHubは2021年に、HTTPS経由のGit操作におけるパスワード認証を廃止しました。 パスワード入力プロンプトに個人アクセストークンを入力するか、認証情報ヘルパーまたは Git Credential Managerから提供されるようにします。
きめ細かいトークンでは、選択したリソースと権限にアクセスを制限できます。その リソースモデルが必要な操作に対応している場合に選択してください。きめ細かいトークン では利用できない権限を必要とする統合には、引き続きクラシックトークンが必要です。 いずれの場合も、次のようにします。
- リポジトリと権限のスコープを必要最小限にする。
- 有効期限を設定する。
- 値をオペレーティングシステムのキーチェーン、シークレットマネージャー、または CIのシークレットストレージに保存する。
- ログまたはシェル履歴に露出したトークンを失効させ、置き換える。
SSHではHTTP認証情報ヘルパーを使用しません。外向きのポート22がブロックされている 場合、ホスティングプロバイダーがポート443でのSSHをサポートしていることがあります。 プロバイダーが公開している手順とホストキーフィンガープリントを検証した後にのみ、 そのエンドポイントを設定してください。
対話型プロンプトの制御 #
ヘルパーが認証情報を提供できない場合、Gitは GIT_ASKPASS、core.askPass、
続いて SSH_ASKPASS を確認します。選択されたプログラムはプロンプトを引数として
受け取り、標準出力に回答を書き込みます。適切なaskpassプログラムがなければ、Gitは
制御端末で入力を求めます。
自動処理では、CIのシークレットストアから短期間有効なスコープ付きトークンを
受け取るべきです。非対話型ジョブをプロンプト待ちで停止させず、失敗させる必要が
ある場合は、GIT_TERMINAL_PROMPT=0 を設定します。
GIT_TERMINAL_PROMPT=0 git fetch originトークンをリポジトリ、Dockerイメージレイヤー、テストフィクスチャ、またはプロセス 一覧で表示されるコマンドラインに含めないでください。
認証情報の確認、拒否、ローテーション #
git credential は、空行で区切られたキーと値のレコードを使用して、設定済みの
ヘルパーと通信するための低水準コマンドです。
printf 'protocol=https\nhost=example.com\n\n' | git credential fill
printf 'protocol=https\nhost=example.com\nusername=octo\n\n' |
git credential rejectfill は認証情報を要求し、approve はヘルパーに認証情報の保存を要求し、
reject は拒否された認証情報の削除を要求します。保存と削除の正確な動作は
ヘルパーによって決まります。キーチェーンアプリケーションでは、エントリーを確認して
削除するためのグラフィカルな方法も提供されます。
トークンを失効またはローテーションした後は、操作を再試行する前に、ヘルパーに残る 古いエントリーを削除してください。そうしないと、Gitが古い認証情報を送信し続け、 正常に置き換えられたことが分かりにくくなる可能性があります。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)