SSHはパスワードの他にSSH鍵によるログインもできます。本記事では鍵認証するための鍵の作成方法から解説していきます。
Contents
公開鍵認証とは
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ログインするにはクライアント側(接続元)に秘密鍵を配置し、サーバー側(接続先)に公開鍵を配置します。
公開鍵は生成したファイルをそのまま配置するのではなくて、接続先の~/.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.com
のfoo
というユーザー名の.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
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
がログインに使う鍵となります。
他にUser
やPort
でユーザー名やポート番号も設定できます。
この設定をしておくとssh example.com
はssh foo@example.com -p 65123 -i ~/.ssh/my_identity_file
を実行します。また、ssh example.net
はssh bar@example.net -p 65321 -i ~/.ssh/my_identity_file2
を実行します。
このように複数のサーバーへの接続設定をひとつのファイルにまとめることができます。複数のサーバーにログインして鍵を使い分けたりサーバーごとにユーザーやポート番号が異なる場合は非常に役に立ちます。