SSHの公開鍵認証でログインするための設定方法

SSHはパスワードの他にSSH鍵によるログインもできます。本記事では鍵認証するための鍵の作成方法から解説していきます。

公開鍵認証とは

SSH公開鍵認証は、セキュアなリモートログインを実現するための一種の認証方式です。従来のパスワードによる認証よりも高いセキュリティを提供し、外部からの不正アクセスを防止するのに役立ちます。

鍵認証では、公開鍵と秘密鍵のペアを使用してログインを行います。公開鍵はサーバーに登録し、秘密鍵はクライアント側で保持されます。この方法により、秘密鍵を知らない第三者はログインできなくなります。

公開鍵認証の注意点

SSH公開鍵は安全なログイン方法であることは確かですが、それは正しい使い方をした場合に限られます(パスワードと同じです)。

強固なパスフレーズを使う

鍵の秘密鍵部分は非常に重要な情報を含んでいます。万が一、秘密鍵が第三者の手に渡ってしまった場合に備えて、秘密鍵には強固なパスフレーズを設定することが重要です。パスフレーズが複雑であれば、不正アクセスを防ぐための一重要な層となります。

秘密鍵の適切な管理

秘密鍵は絶対に他の人と共有せず、権限を適切に設定してアクセスを制限しましょう。不用意に秘密鍵をクラウドストレージや共有ディレクトリに保存してはいけません。個人のコンピュータや専用のUSBデバイスなど、信頼性の高い物理的な保管場所に保存してください。

公開鍵の定期的な管理

SSH公開鍵認証を使用する場合、サーバーに登録された公開鍵を定期的に管理することが大切です。特にアクセス権限を持っていないユーザーの公開鍵が登録されていないか、不要な公開鍵が残っていないかを確認しましょう。

また、Webアプリの脆弱性を突いて自分の公開鍵を追加し侵入するというのは常套手段なので、公開鍵の定期的な管理は必ずおこないましょう。

公開鍵と秘密鍵のつくりかた

公開鍵と秘密鍵を作成するコマンド

Windowsの方はターミナル(コマンドプロンプト)を開いて、以下のコマンドを実行します。一般的に広く使われているRSAは次のコマンドを実行します。

ssh-keygen -t rsa -b 4096

より強固でパフォーマンスが高いEd25519というアルゴリズムも使えます。こちらは古いサーバーだと使えない場合もあるので注意が必要です。

ssh-keygen -t ed25519

更に詳しく知りたい方は次の記事をご覧ください。

SSHで鍵認証するための秘密鍵・公開鍵ペアを作成する方法

実際に生成してみる

それでは実際にSSH公開鍵と秘密鍵を生成してみます。

RSA鍵

まずRSAの公開鍵と秘密鍵を生成してみます。

$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa): ※ファイル名
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase): ※パスフレーズ
Enter same passphrase again: ※パスフレーズ
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:8E/TgckQl7cJRPo4T8A1kF8/X3iXCBDUqi98yrO4DHM user1@ubuntu
The key's randomart image is:
+---[RSA 4096]----+
|        =XX.     |
|       ..*o*o    |
|      . +.=+o+...|
|       o =..oo+.+|
|        S = .  +o|
|       . * .    .|
|   o E. . o      |
|    = o+ o       |
|     +.+*        |
+----[SHA256]-----+
$

初期設定では~/.ssh/id_rsaというファイル名で秘密鍵が生成され、~/.ssh/id_rsa.pubという名前の公開鍵が生成されます。複数のファイルを使い分ける場合(接続先ドメインによって分けるなど)はファイル名を指定できます。

次にパスフレーズですが、そのままエンターキーを押せば空のパスフレーズが設定されます。しかし万が一秘密鍵が盗まれた場合に備えて強固なパスフレーズを設定することをおすすめします。弱いパスフレーズはパスワードクラッカーで簡単に解析されます。

Ed25519鍵

次にEd25519の公開鍵と秘密鍵を生成してみます。オプションと生成されるファイル名が異なるだけでRSAと同じです。

$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user1/.ssh/id_ed25519): ※ファイル名
Enter passphrase (empty for no passphrase): ※パスフレーズ
Enter same passphrase again: ※パスフレーズ
Your identification has been saved in /home/user1/.ssh/id_ed25519
Your public key has been saved in /home/user1/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:2R1cThBydC2cD323JPs/wgK7VbRAg0FzDUut0K2NOck user1@ubuntu
The key's randomart image is:
+--[ED25519 256]--+
|        .+=BX+++ |
|         o==oX=.=|
|          ooX.=++|
|         o Eo+...|
|        S . oo.  |
|         .  .  . |
|          o..   .|
|         ... o ..|
|         .. . . .|
+----[SHA256]-----+
$

初期設定では~/.ssh/id_ed25519というファイル名で秘密鍵が生成され、~/.ssh/id_ed25519.pubという名前の公開鍵が生成されます。複数のファイルを使い分ける場合(接続先ドメインによって分けるなど)はファイル名を指定できます。

パスフレーズはRSA同様に強固なパスフレーズの設定をおすすめします。

公開鍵認証でSSHログインする方法

公開鍵を.ssh/authorized_keysに追記する

公開鍵認証でSSHログインするにはクライアント側(接続元)に秘密鍵を配置し、サーバー側(接続先)に公開鍵を配置します。

公開鍵は生成したファイルをそのまま配置するのではなくて、接続先の~/.ssh/authorized_keysに追記する必要があります。接続先に~/.ssh/authorized_keysが存在しなければ公開鍵を~/.ssh/authorized_keysというファイル名で保存すれば良いでしょう。なお、~/.ssh/authorized_keysのパーミッションは600に設定する必要があります。

また、macやLinuxを利用している方はssh-copy-idコマンドを使えます。

ssh-copy-id foo@example.com

これでexample.comfooというユーザー名の.ssh/authorized_keysに自分の公開鍵が追加されます。鍵を指定したい場合は-iオプションで鍵のファイル名を指定します。たとえばmy_identity_fileというファイル名で秘密鍵を生成した場合は次のようにします。

ssh-copy-id foo@example.com -i my_identity_file

SSH公開鍵でログインする

通常はパスワードログインと同じコマンドでログインできます。

ssh example.com

ユーザー名を指定する場合は「ユーザー名@サーバー名」のように指定します。

ssh foo@example.com

鍵を指定したい場合は-iオプションで指定します。

ssh example.com -i my_identity_file

設定ファイルで簡単にログインする

複数のサーバーに対して鍵を使い分けてログインしている場合、毎回鍵を指定するのは面倒です。そのような場合は設定ファイルで鍵を指定しておくと便利です。

設定は~/.ssh/configでおこないます。※Windowsの場合は%USERPROFILE%/.ssh/config

.ssh/config
ServerAliveInterval 15

Host example.com
  HostName example.com
  User foo
  Port 65123
  IdentityFile ~/.ssh/my_identity_file

Host example.net
  HostName example.net
  User bar
  Port 65321
  IdentityFile ~/.ssh/my_identity_file2

先頭のServerAliveInterval 15は15秒おきにサーバーと通信して切断されたり通信が固まることを防ぐ設定で、わたしは常にこの設定を入れています。

Hostは接続名で、各接続先の設定はこのHost単位でおこないます。ここは接続先のホスト名と同じにしておくと分かりやすいでしょう。HostNameは接続先のホスト名です。IdentityFileがログインに使う鍵となります。

他にUserPortでユーザー名やポート番号も設定できます。

この設定をしておくとssh example.comssh foo@example.com -p 65123 -i ~/.ssh/my_identity_file を実行します。また、ssh example.netssh bar@example.net -p 65321 -i ~/.ssh/my_identity_file2 を実行します。

このように複数のサーバーへの接続設定をひとつのファイルにまとめることができます。複数のサーバーにログインして鍵を使い分けたりサーバーごとにユーザーやポート番号が異なる場合は非常に役に立ちます。