複数PCから同一GitHubレポジトリにSSH接続する際に調べたこと

技術

プライベート用の

  • Macbook
  • Githubアカウント

仕事用の

  • Macbook
  • GitHubアカウント

とそれぞれ分けて持っていると、

「仕事用のMacbookで、プライベート用のGitHubアカウントのrepositoryのコードをclone/pushしたい」

というケースもある。

ここら辺がごちゃごちゃしてくると、

「プライベート用のMacbookで、プライベート用のGitHubアカウントのrepositoryのコードをclone/pushしたい」

という操作をするとき、よくgitのエラーに引っかかって、その度にQiitaで解決方法を調べたりしていた。

でも、何度調べてその場で解決しても、また再度同じ問題に出くわした時、また調べないといけなかったりして、ちゃんと原因を理解できていないなと感じていたので、今回改めて SSH接続 について調べてみた。

エラー内容

今回、プライベート用のGitHubアカウントのあるrepositoryを、プライベート用のMacbookに git clone した時、以下のようなエラーになった。

$ git clone git@github.com:masafumi330/sandbox.git Cloning into 'sandbox'... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is <<< SECRET !! >>>. Please contact your system administrator. Add correct host key in ~/.ssh/known_hosts to get rid of this message. Offending RSA key in ~/.ssh/known_hosts:1 Host key for github.com has changed and you have requested strict checking. Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rightscopy

内容としては、

  • ホスト側(GitHub)のホストキーが更新されているから、新しいホストキーをあなたのマシンに登録してね
  • もしかしたら、Man-In-The-Middle攻撃かも知れないから注意してね

という内容。

「Man-In-The-Middle攻撃」については、こちらを参照。

https://jprs.jp/glossary/index.php?ID=0229

新しいホストキーの登録は、

  1. 現在自分のマシンに登録しているホストキーの削除
  2. 再度SSHでgit clone して、新しいホストキーの登録

の手順で行うことができる。

SSHとは?

「SSH」= 「プロトコル」である。

「プロトコル」とは、「約束事」である。

つまり、SSHとは「コンピュータ間の通信を安全に行うための約束事」であり、その方法である。

  • クライアントは、公開鍵を渡したサーバーと通信できる
  • サーバーは、公開鍵から暗号を作成し、その暗号を解読できる秘密鍵を持つクライアントのみ、通信ができる

というメリットがある。

今回行った対応策

SSH鍵の生成とGitHubへの設定を以下の手順で行った。

  1. SSH鍵の生成

// -t rsaは鍵のタイプ、-b 4096は鍵の長さ、-Cはコメントを指定します。 $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"copy

実行すると、特に保存先を指定しない場合は、

  • 秘密鍵 ~/.ssh/id_rsa
  • 公開鍵 ~/.ssh/id_rsa.pub

に鍵が保存される。

2.GitHubに公開鍵を登録

// 公開鍵をクリップボードにコピー $ cat ~/.ssh/id_rsa.pub | pbcopy # Macの場合copy

GitHubのSSHキー登録画面 https://github.com/settings/ssh/new に行き、コピーした公開鍵を登録する。

SSHキー登録画面

3.SSH接続のテスト

$ ssh -T git@github.comcopy

実行すると、SSHで接続したリモートサーバーのホスト情報(ホストキー)が~/.ssh/known_hostsに保存される。次回接続時以降は、ホストキーを確認し、同じであれば「信頼できる」と判断して接続が確立される。

同一リモートサーバーに対して複数クライアントからSSH接続したい場合

それぞれのクライアントで作成した公開鍵を、SSH接続したい同一リモートサーバーに配布すれば良い。

今回のケースだと、2台別々のMacbookから同一のGitHubアカウントに対して、SSH接続でcloneやpushを行いたい場合、2台それぞれのMacbookで作成した公開鍵をGitHubに登録すれば良い。GitHubアカウントには、2つの公開鍵が登録されることになる。

まとめ

SSHについて理解することができた。これで次回以降のGitHubのSSH接続の設定手順はスムーズに行えるだろう。

また、業務でもSSHで本番サーバーやテスト環境のサーバーに接続していたし、それを行うために担当者に「本番サーバーにSSH接続したいので、こちらの公開鍵の登録をお願いします」と言っていたが、裏で何をやっていたのか理解することができた。