見出し画像

(恥)GitHubのユーザIDとssh-key の関係を誤解していた。

今回は小ネタで、最近の失敗話である。

私は複数のGitHubアカウントと複数の開発マシンを使い分けている。一つの開発マシンの中から、プロジェクトに応じて、異なるアカウントでGitHubにアクセスすることもある。

最近、とある開発マシンのディレクトリを整理していたら、なぜかそのマシンだけ、特定のGitHubアカウントに限ってリポジトリから clone できなくなってしまった。'repository not found' などとエラーが出てしまうのだ。別のマシンではOKなのに。

例によって ssh-key の設定の問題だろう、と思って確認したが(この時点での私の理解では)問題はない。念のため、GitHub側に登録していた ssh-key を削除して、再度登録しなおしてみたりしたがだめだった。

結論としては、私のGitHubの認証に対する理解が間違っていることがわかった。(誤解に気づいたのは、`$ssh -T git@github.com` で認証テストしていたときだ。私の想定とは違うID名で `Hi <user-id>, ….` というメッセージが出たのである。)

わりと同じような誤解をしている人がいそうな気がするので、恥ずかしいけど、ここに書いておこうと思う。

私の間違っていた認識

以下のように誤解していた。

(誤)GittHubのユーザ認証は、以下のように行われているはず:

  1. クライアント側の git config 設定の user.email 値に基づいて認証しようとするIDを決める。

  2. 上記IDに対して、GitHub側に登録されている ssh-key をクライアント側の ssh-key と順次鍵の照合を行い、合致したら認証OKとする。

つまり私は、「ユーザIDが先、sshは後」だと誤解していた。

上記のように誤解していたので、GitHubにアクセスしたいクライアントマシン毎に ssh キーを生成し、それをすべて GitHub に登録していた。

正しい認識(実際のGitHubの挙動)

(正)以下のようにGitHubの認証は動いているようだ:

  1. まず、ローカル側にある ssh-key(一つまたは複数。普通は ~/.ssh 配下にある)を候補として、ユーザIDに関係なく、GitHub側に登録されている全ての ssh-key からマッチするのものがあるかどうか調べる。

  2. 少なくとも1つマッチする ssh-key が見つかって鍵の照合に成功したら、その key に紐づいているユーザIDが認証成功したものとなる。2つ以上の key がマッチする場合、2つ目以降は無視される。

  3. もし、一つの ssh-key が複数のユーザIDに紐づいている場合、どれか一つのユーザIDがGitHubによって選ばれ、それが認証成功したものとなる。このとき、どのユーザIDが選ばれるのかの規則は不明。どのIDについて認証させたいかを指定することはできない。

つまり、正しい挙動は「ssh先で、ユーザIDが後」なのである。分かってみれば当たり前で、ssh が先であれば、 ssh が git 側の設定に依存することはありえない。git の user.email の設定が*無視*されるのも道理だ。

なお、私のトラブルは上記の「3.」によって起こっていた。マシン毎に ssh-key を作っていたので、同じキーを複数のユーザID内に置いていたのだ。

GitHub複数アカウントにおける、正しい ssh-key 運用

以下のようにするのが正しい方法の一つ。(他にもあれば教えてください。)

  • GitHub ID一つにつき、ssh-key を一つだけ作る。(複数作ることも可能だが、混乱の元なのでオススメしない。)

  • 複数の開発マシンを使う場合、上記の ssh-key をコピーして使う。

  • 一つの開発マシンから、複数のGitHub IDにアクセスしたい場合は、.ssh/config ファイルにホスト名エリアスを設定して対応する。(以下に例を示す。)

例:.ssh/config の設定例。2つの GitHub アカウントを使う場合。user1とかuser2 というのはダミーのユーザIDである。実際には自分が使うIDに置換すること。

Host github_user1
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_github_user1

Host github_user2
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_github_user2

この設定により、1つ目のアカウントでGitHubにアクセスしたい場合は以下のようにホストアドレスを指定する。

$git clone git@github_user1:<path_to_repository>

2つ目のアカウントなら:

$git clone git@github_user2:<path_to_repository>

である。

少々面倒だが、複数アカウントを使い分けるには仕方がない。

今回の話は以上である。
お読みいただきありがとうございました。


この記事が参加している募集

仕事のコツ

with 日本経済新聞

この記事が気に入ったらサポートをしてみませんか?