Git Credential Manager (GCM) でGithubへの認証をセキュアに実現する (Windows, WSL2, Linux)

Githubのリポジトリへ接続する際の認証方法としては、パスワード認証、パーソナルアクセストークンよる認証、SSH認証等がありますが、パスワード認証はすでに廃止されており、アクセストークンは用途別にパスワードを管理する必要がありますし、あまりセキュアな認証方法とは言えません。SSHはセキュアで良いのですが、秘密鍵の管理を行う必要があります。

こういった課題に対応するのがGit Credential Manager (GCM)です。gitコマンドを実行する際、初回は以下のようなUIが表示され、ブラウザに遷移して(OAuthで)Github.comにログインすると、その資格情報がPC内に保存され、以降は自動的に認証されるようになります。個別にアクセストークンやSSH鍵を管理する必要がなく、セキュアなアクセスが可能です。

GCMの利用はGithubのドキュメントでも利用が推奨されている方法なのですが、Windows, WSL2, Linux それぞれで設定方法の違いや、ドキュメントに記載がない注意ポイントがあったのでメモを残します。

Windows(ネイティブクライアント)の場合

Windowsのネイティブクライアントを使う場合は最も簡単です。Git for Windowsが標準でGCMのモジュールを含んでおり、インストール時に(あえて選択を解除しなければ)自動的に設定されます。

Gitの最低限の設定だけしてしまえば、以下のようにプライベートリポジトリへのアクセスを(HTTPSで)実行した時点で前述のGUIが表示され、認証が完了します。

git config --global user.name "ユーザー名"
git config --global user.email メールアドレス
git clone https://github.com/yourid/project.git

ここで取得したクレデンシャルは、Windows資格情報に保存されます。

コントロール パネル -> ユーザー アカウント -> 資格情報マネージャー -> Windows資格情報

Windwows資格情報を確認すると、git:https://github.comと、git:https://yourid@github.com の2つのエントリが追加されることが確認できるはずです。もしなんらかの理由で、クレデンシャルを削除しないといけなくなった場合はこの2エントリーを削除します。

gitコマンド+GCM以外の方法としては、OAuthでGithubへのサインインに対応している他のアプリケーションを使う方法もあります。Visual Studio Codeはリモートリポジトリの登録時にGithubへのOAuth認証に対応していますし、WindowsであればGithub Desktopも利用できます。

Windows Subsysem for Linux 2 (WSL2)の場合

WSL2の場合、gitconfigで credential hepler を設定してWindowsホスト側のGCMを呼び出すことでネイティブWindowsクライアント同様に認証が可能です。そのため事前にGit for Windowsの導入が必要です。

このcredential helperに設定すべきGCMのバイナリへのパスや実行ファイルの名前がGit for Windowsのバージョンによって2回ほど変わってきているようで、現在(Git for Windows 2.40.1)では、以下のように設定することで動作しました。(パスが変わった際のIssueはこちら、実行ファイルの名前が変わった件はこちら、本家の資料はこちら)

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"

上記を実行すると~/.gitconfigには以下のように設定されます。

[credential]
        helper = /mnt/c/Program\\ Files/Git/mingw64/bin/git-credential-manager.exe

他の方法としては、Visual Studio Codeも有効です。こちらのWSL Extension、もしくはWSL Extensionを含むRemote Development Extension Packを導入すると簡単にWSL2内のファイルを操作でき、Visual Studio CodeのOAuthで認証が可能です。

Linux(ネイティブクライアント)の場合

Linuxネイティブの環境の場合、GCMのLinux版を導入することで同様の環境を実現できます。こちらのインストールドキュメントには各ディストリビューション毎の方法が詳しく解説されています。(私は試していないですが、macOSの場合はbrewで簡単に導入できるようです。)

私の使っているUbuntu 22.04の場合の手順は以下のようになります。こちらに記載があるように、前提として.NET SDK 6.0が必要ですので、先に.NET SDKを導入し、その後にdotnetコマンドでGCMを導入します。

sudo apt-get update
sudo apt-get install -y dotnet-sdk-6.0
dotnet tool install -g git-credential-manager

.NETアプリケーションの実行ファイルは~/.dotnet/tools/以下に保存されるので、.bashrc等に以下のように追記してPATHを通します。

export PATH="$PATH:/home/your-name/.dotnet/tools"

パスを通したら以下のように実行して初期設定を行います。

git-credential-manager configure

次に認証情報をどのように保存するか(Credential Store)という設定を行います。こちらのドキュメントにあるように、色々な保存先が選択できますが、手軽なのはgitコマンド内蔵のキャッシュ(メモリ)を利用する方法です。

以下のように設定するとクレデンシャルをキャッシュに保存するようになります。2行目でキャッシュが有効な秒数を指定しています(以下は1時間の例)。必要に応じて調整してください。キャッシュが消えてもGUI上でクリックするだけで再認証されるため、極端に長くする必要はないでしょう。また、他の保存方法についてはドキュメントを参照してください。

git config --global credential.credentialStore cache
git config --global credential.cacheOptions "--timeout 3600"

これで準備ができたのですが、git clone等を実行すると以下のようなエラーが出る場合があります。

fatal: Default font family name can't be null or empty

これは主に日本語や中国語等の環境で実行した場合に発生しうるエラーで、日本語でUIを表示しようとしているが該当するフォントがOS内に見当たらないために発生しています。(こちらのIssueを参照)

これを回避するには、ロケールをCにしてgitを実行するというのが簡単な方法です。

LC_ALL=C git clone https://github.com/...

他には必要となるフォントをOSに導入して解決したという情報もあり、Ubuntuではttf-mscorefonts-installerを含むubuntu-restricted-extrasパッケージを導入して解決したという情報もあったのですが、私の環境ではうまく解消できませんでした。

gitコマンド+GCM以外の方法としてはLinux環境上でもVisual Studio CodeによるOAuth認証は利用可能です。Visual Studio Codeでの認証時にはGCMと同じUIが表示されるのですが、こちらでは日本語ロケールにも関わらず利用できました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です