GitHubへの接続や、レンタルサーバへの接続など、環境同士の通信の際にSSH接続が使われます。
この記事は、SSH接続と鍵をまだ使ったことがない方と、SSH接続をする際に使われる公開鍵と秘密鍵について理解しないままコマンドをコピペすることで使ってきた方を対象に解説します。
SSH接続とは
SSH接続は、公開鍵と秘密鍵によって認証が確認できたら接続を確立する接続方法です。
公開鍵は認証先に渡し、接続の際に利用されます。
公開鍵と秘密鍵の関係性
公開鍵と秘密鍵は“RSA”や“ECDSA”などのアルゴリズムによって生成されます。生成された公開鍵と秘密鍵は数学的に関連づけられたペアになっています。
秘密鍵は任意の文字列をデジタル署名をするために使います。
公開鍵は、ペアの秘密鍵によって署名されたデジタル署名を元の任意の文字列に復元するために使います。
公開鍵から秘密鍵を解析することは非常に困難であるという特徴と、秘密鍵から作成したデジタル署名は、ペアである公開鍵からでしか復元できないという特徴から安全な通信を確立することができます。
SSH接続の流れ
- サーバにユーザ名とともに接続する
- サーバがユーザ名に紐づけられた公開鍵を探す
- 公開鍵が紐づいていた場合は、クライアントにランダムな文字列を返す
- 文字列と秘密鍵を使って、デジタル署名と呼ばれる文字列を作成する
- デジタル署名をサーバに送信する
- サーバに保存されている公開鍵で、デジタル署名を復元して最初に生成した文字列を等しいか検証する
- 検証に成功したら接続を確立する
この流れによってSSH接続が完了します。
公開鍵の特定はサービスによって異なります。
公開鍵と秘密鍵の生成方法
鍵はssh-keygen
コマンドを使うことで生成することができます。
ssh-keygen
-t
や-b
などのオプションをつけることで鍵の生成アルゴリズムやビット数を指定することができます。
オプションつけずにssh-keygen
を実行すると、~/.sshディレクトリに公開鍵id_rsa.pub
と秘密鍵id_rsa
が生成されます。
実際にssh-keygen
を実行すると、以下の流れで鍵を生成できます。
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
ここでファイル名を入力します。指定しなければid_rsa
になります。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
ここでパスワードを設定します。このパスワードを設定すると鍵の使用時にこのパスワードを入力することになります。未入力も可能です。
Your identification has been saved in id_rsa_test
Your public key has been saved in id_rsa_test.pub
The key fingerprint is:
SHA256:GIVoy20oOYHSh5VyNAaC2fp1f063wqKTzR015UBi4kM user@xxx.local
The key's randomart image is:
+---[RSA 3072]----+
|o=.==o .E o.. |
|=.*.*..+ o .. . |
|.. O +. o + |
|. + = +o . o . |
| . + o..S . . |
| . . + . |
| + * o . |
| o + = . |
| .o . . |
+----[SHA256]-----+
これで公開鍵と秘密鍵を作成できます。これはこの記事用にid_rsa_testという名前で公開鍵と秘密鍵を生成したとき表示されるものです。
fingerprintは公開鍵を短くわかりやすくした文字列です。randomark imageはfingerprintを視覚的な特徴にした文字列です。
具体的な使用例
それでは実際に秘密鍵と公開鍵を使用してSSH接続をする具体的な例を解説します。
Xserver
Xserverは、SSH接続することができるレンタルサーバです。サーバーパネルのSSH設定の項目から公開鍵を設定し、SSH接続ができるようになります。
Xserverでは、SSHの鍵を生成してくれる機能がありますが、上述したssh-keygen
を利用した方法でもSSH接続ができるようになります。
まずは、Xserver用の鍵ペアを生成します。
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_xserver -N ""
このコマンドは、ssh-keygen
だけで実行した際に行われる問答をあらかじめオプションで設定しています。
具体的には、-t
で鍵のタイプ、-b
でビット数、-f
で鍵を生成するパスと鍵名、-N
で使用する際のパスワードを設定します。ここではパスワードを設定していませんが、セキュリティ上必ずパスワードは設定しましょう。(具体的には、仮に秘密鍵が流出してしまっても簡単には使用できなくなるというセキュリティ効果が見込めます。)
次に、SSHを使用するため、サーバーパネルのSSH設定から、SSHの設定を状態をONにしてください。
次に公開鍵を設定します。
先ほど生成した公開鍵を確認します。
vi ~/.ssh/id_xserver.pub
このコマンドを打つと、公開鍵の文字列が表示されるのでまるッとコピーして、Xserverサーバーパネルの公開鍵登録・更新の入力フォームに公開鍵を貼り付けます。
公開鍵ですが、念の為一部隠しています。このまま確認画面へ進むをクリックし設定しましょう。
ターミナル上vi
で開いたエディタは:q
と入力することにより閉じることができます。
XserverのサーバーIDを確認してください。サーバーパネル上部に記載されています。
ここでは仮にtest
とします。次のコマンドでサーバーに接続することができます。
ssh -l test -p 10022 -i ~/.ssh/id_xserver test.xsrv.jp
-l
はユーザー名を指定するオプションで、サーバーIDに置き換えてください。-p
はポートの指定です。XserverではSSH接続の際に10022
にする必要があります。-i
は秘密鍵のパスを指定します。最後のtest.xsrv.jp
は接続するホスト名を指定しています。test
をサーバーIDに置き換えてください。
このコマンドを入力すると、鍵の生成時に設定した(-N
で設定した)パスワードが求められるので入力してください。
これで、SSH接続が完了します。接続からログアウトするためには、exit
と入力しましょう。
毎回この長いコマンドを打つのが面倒なので、~/.ssh/configファイルに以下を記述します。
Host xserver
HostName test.xsrv.jp
Port 10022
User test
IdentityFile ~/.ssh/id_xserver
この設定をすると、ssh xserver
と入力すると、それぞれのオプションはconfigによって自動で設定され、SSH接続が完了します。
GitHub
GitHubもSSH接続は公開鍵と秘密鍵による認証を利用します。
まずは、専用の鍵を生成します。
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_github -N ""
オプションの説明はXserverの例で説明済みなので、省略します。
GitHubログイン後、アカウント設定画面から“SSH and GPG keys”ページに移動します。“New SSH key”ボタンをクリックします。
生成した、公開鍵をコピーし、フォームに貼り付けます。
“Title”は鍵の名前を設定しておくとわかりやすいでしょう。
GitHubのSSH接続は、主に、push
やpull
、fetch
の時に使われますが、ssh
コマンドを叩くことでも鍵の有効性を確かめることができます。
ssh -i ~/.ssh/id_github git@github.com
このコマンドによって、以下が返ってくれば、SSH接続が完了しています。
PTY allocation request failed on channel 0
Hi User-Name! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
GitHubでは、ユーザー名を指定する必要はなく、ホストgit@github.com
のみでSSH接続が可能です。
これは、接続時にSSHクライアントが秘密鍵から公開鍵を作成し、GitHubに送り、その公開鍵からユーザーを特定することで鍵の認証を行なっているからです。
このように、GitHubでのSSH認証がおこなわれます。
まとめ
今回は公開鍵と秘密鍵の仕組み、生成方法、SSH接続の流れ、SSH接続の具体的な使用例を解説しました。
参考
Xserver サーバーパネル:https://www.xserver.ne.jp/manual/man_server_ssh.php