1
0

More than 1 year has passed since last update.

githubのデプロイキーの指定の仕方

Last updated at Posted at 2022-03-08

失敗したやり方

同じサーバ内で複数のリポジトリを扱っていたので~/.ssh/configに以下のような設定を書いて

~/.ssh/config
Host repo-A
    HostName github.com
    User git
    IdentityFile ~/.ssh/repoAkey
Host repo-B
    HostName github.com
    User git
    IdentityFile ~/.ssh/repoBkey

gitリポジトリのoriginをそれぞれrepo-A:<github_user_name>/repoA.gitrepo-B:<github_user_name>/repoB.gitとしていた
これでうまくいっていたのだが、デプロイキーを入れ替えたら全く機能しなくなってしまってハマった

原因

原因はconfigの設定にIdentityFileを指定しても必ずしもそれが使われるわけではないことだった
sshは使える鍵をいろいろ試してみて適合したらログインするという方法をとっているがその試してみる順番が必ずしもIdentityFileが一番ではない(!)ので、repoAにアクセスしようとしているときにrepoBkeyを先に試されるとrepoBkeyを使ってgithub.comに接続してしまい(repoBkeyもgithubのリポジトリに登録されているのでgithub.comとのアクセスに使えてしまう!)repoAをいじる権限がないよ!と怒られてしまうのだ
指定した鍵より先にssh-agentに登録されている鍵が使われてしまうようだ
ssh-agentにどの鍵が登録されているかはssh-add -Lで確認できる
ssh -T repo-Aしてみると

Hi xxxxx/xxxxx! You've successfully authenticated, but GitHub does not provide shell access.

というメッセージが出るが、このxxxxの部分がrepoAならrepoAkeyが正しく使われていて、repoBならrepoBkeyが使われてしまっているということがわかる

対策

なので、正しくは

~/.ssh/config
Host repo-A
    HostName github.com
    User git
    IdentityFile ~/.ssh/repoAkey
    IdentitiesOnly yes
Host repo-B
    HostName github.com
    User git
    IdentityFile ~/.ssh/repoBkey
    IdentitiesOnly yes

と、IdentitiesOnlyをつけてあげると良い
そうするとそこに指定された鍵しかトライしないので想定した動作が得られる

ただしこれはそのサーバに鍵が実在するときのパターンで、鍵をAgentForwardで持ってきてる場合は鍵を使う順番を明示的に指定する方法がない(?)ため、事前にssh-addコマンドを使ってForwardする鍵を絞っておくくらいしか方法がなさそう
リポジトリごとのデプロイキーを使わないでユーザーに紐付けた鍵を使えばこのような問題は起きないのでAgentForwardで使うならそうした方がいいかもしれない

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0