🌍
GIT_ASKPASSとは?(ArgoCDでの使われ方も)
はじめに
ArgoCD関連の学習をしていたときにGIT_ASKPASSというものが出てきて、知らなかったので記事に残そうと思います。
GIT_ASKPASSとは?
git askpassとは、認証情報を外部プログラムで提供するためのGitの仕組みです。
Gitは通常、git push
などを実行し、HTTPS認証を求める際に手動でユーザー名とパスワードを入力させられますが、GIT_ASKPASS
という環境変数を利用すると、認証情報を外部のプログラムに委ねることができます。
GIT_ASKPASSの基本的な動作
- GitはHTTPS認証が必要な場合にGIT_ASKPASSで指定されたプログラムを呼び出す
- そのプログラムはユーザー名やパスワードを標準出力 (stdout) に返す
- Gitはその出力を使って認証を行う
シンプルなaskpassスクリプトの例
例えば、以下のようなaskpass.sh
を作成し、それをGIT_ASKPASS
に設定すると、Gitが自動でパスワードを取得できます。
#!/bin/bash
echo "my-secret-password"
このスクリプトをGIT_ASKPASS
に設定すると、Gitの認証時にこのスクリプトが実行され、my-secret-passwordがGitに渡されます。
export GIT_ASKPASS=/path/to/askpass.sh
git clone https://example.com/private-repo.git
この場合、Gitはaskpass.sh
を呼び出してパスワードを取得し、リポジトリをクローンできます。
ArgoCDにおけるgit askpass
ArgoCDでは、単純なスクリプトではなく、gRPCサーバー (askpassサーバー) を使って認証情報を管理します。
そのため、ArgoCDのaskpassプログラム (argocd-git-ask-pass) は、Gitから呼ばれたときにgRPCを通じてUNIXソケット上のaskpassサーバーに認証情報を問い合わせる仕組みになっています。
ArgoCDのgit askpassの動作イメージ
- ArgoCDがGitの認証情報をaskpassサーバーに保存 (
Add(username, password)
) - Gitが認証を要求 (
GIT_ASKPASS=argocd-git-ask-pass
に設定) -
argocd-git-ask-pass
がaskpass サーバーに gRPC 経由で問い合わせ (GetCredentials(nonce)
) - askpassサーバーが認証情報を返す
- Gitが取得した認証情報を使って認証を行う
この方法により、ArgoCDは認証情報を安全に管理しつつ、Gitにシームレスにアクセスできます。
Discussion