前回まではプリペイドSIMカードネタですが、久々にVPSネタです。
だいぶ前にVPSにSSHで接続する際に鍵認証を使う方法を紹介しました。
ところがこの設定方法がいまいち間違っていた気がするので、念のため訂正しておきます。
SSHの鍵認証とは
鍵認証方式とはパスワードだけでなく、”正当な認証鍵(実際にはファイル)”を持っているかどうかで接続の許可不許可を決める方式です。
一般的には、秘密鍵と公開鍵のペアを作成します。この鍵のペアには、「公開鍵で暗号化をしたデータはペアとなる秘密鍵でしか解読できない」という特徴があるのがポイントです。
- 参考 公開鍵暗号方式
鍵のペアを作成したら、サーバ側に公開鍵をクライアント側に秘密鍵を持つようにします。
SSHのサーバはあるユーザに対して接続の要求があると、あるランダムなメッセージをそのユーザの公開鍵で暗号化して、接続要求元に送信します。接続要求元は送られてきたメッセージを秘密鍵で解読してサーバに送り返します。
サーバは送ったランダムなメッセージと接続元から送り返されたメッセージが一致した場合に限り、正しい接続相手(=正しい秘密鍵を持っているユーザ)として認めます。
厳密には異なるかもしれませんが、大体こんな感じです。
鍵認証を導入することで、秘密鍵を持っていない人からはアクセスを拒否することができ、SSHサーバの安全性が高まるのです。
何が間違っていたのか
以前の紹介では
- サーバで公開鍵と秘密鍵を作る
- 1の公開鍵をSSHでログイン可能なカギとして登録する(.ssh/authorized_keysに追加する)
- 1の秘密鍵をクライアント側にコピーしてSSHでログイン時に使用する
という流れでした。
これでも動作することは動作するのですが、
- 秘密鍵をコピーしてサーバからクライアントに移すのはやりおかしい
- クライアントが同じ秘密鍵を使うことになり、漏えいリスクが高まる。また漏えいしたときにそのキーを無効にするとすべてのクライアントからアクセスできなくなってしまう
という点からこの手順は間違っている気がしてきました。
正しい手順
正しい手順は
- 各クライアントで公開鍵と秘密鍵を作る
- 1の公開鍵をサーバ側にコピーしてログイン可能なカギとして登録する(.ssh/authorized_keysに追加する)
- 1の秘密鍵をSSHでログインする時に使用する
となります。
各クライアントが異なる公開鍵と秘密鍵のペアを利用しているので、たとえ漏洩してもそのクライアントからだけアクセスを無効にする、というようなことができますので、管理上こちらのほうが安全です。
また秘密鍵ごとにパスフレーズが設定できるので、クライアントごとに異なるパスワードを使うようにすることもできます。
クライアントがWindowsの場合の設定
Windowsでssh用の公開鍵・秘密鍵のペアを作成するにはフリーのSSHクライアントPuTTYについてくるPuTTYgenというコマンドを利用します。
PuTTYgenの入手
PuTTYは下記のURLからダウンロードすることができます。
PuTTYを使いたい人は、「For Windows on Intel x86」のところからInstallerを選んでダウンロードしてください。PuTTYをインストールしたディレクトリにPuTTYgenコピーされているいるはずです。
PuTTYgenだけを使いたい人は上記のURLからputtygen.exeをダウンロードして適当なディレクトリにコピーしておいてください。
公開鍵・秘密鍵ペアの作成
PuTTYgenを実行すると次のような画面が現れます。
公開鍵・秘密鍵のペアを作成する場合は、「Generate」ボタンを押します。「Generate」ボタンを押したらキーの生成が始まりますので、「Key」のエリアの上でマウスを適当に動かしましょう。マウスの動きを使ってキーに必要な乱数を生成しているようです。
Keyの生成が完了すると次のような画面になります。コメントはこのキーを利用するクライアントの名前などにしておくとよいでしょう。
生成した秘密鍵を安全な場所でのみ利用するでしたらパスフレーズは空欄のままでも構いませんが、そうでない場合は安全のため入力しておいた方がよいと思います。もちろん確認用のパスフレーズの欄にも同じパスフレーズを入力しておきます。
コメントとパスフレーズの設定が終わったら、「Save private key」で秘密鍵をファイルに保存します。
最後にOpenSSH用の公開鍵(赤枠で囲った部分のテキスト)をすべてコピーしておきます。
サーバの設定
サーバで行うことは、サーバ側のユーザのホームディレクトリの.ssh/authorized_keyファイルに、先ほど作成した公開鍵の内容を追記することです。
authorized_keyは普通のテキストファイルなので、エディタで開いて、先ほどPuTTYgenの画面でコピーしたOpenSSH用の公開鍵をペーストしておきます。コピペができない場合は、公開鍵をファイルか何かにしてサーバに転送すればよいでしょう。
ポイントはauthorized_keyに「追記する」というところです。
接続テスト
ここまで来たら接続テストを行ってみましょう。
接続にはPuTTYを使います。PuTTYを起動してホスト名・ポート番号・接続タイプを設定したら、左側の接続→SSH→認証を選んで、「認証のためのプライベートキーファイル」に先ほど保存した秘密鍵のファイルを指定します。
あとは「開く」ボタンを押して接続できることを確認してください。
クライアントがLinuxの場合
Linuxでssh用の公開鍵・秘密鍵のペアを作成するにはssh-keygenというコマンドを使います。sshクライアントが入っていればこのコマンドは存在しているはずです。
公開鍵・秘密鍵ペアの作成
ssh-keygenコマンドを実行するだけで簡単に公開鍵・秘密鍵のペアを作成することができます。
ssh-keygen
Generating public/private rsa key pair. Enter file in which to save the key (/home/foo/.ssh/id_rsa): Created directory '/home/foo/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/foo/.ssh/id_rsa. Your public key has been saved in /home/foo/.ssh/id_rsa.pub. ...
途中でパスフレーズの入力を求められるので入力しておきます(パスフレーズなしにもできますが、安全のため、やはりパスフレーズは設定しておきましょう)。
特に問題がなければ、ユーザfooの.sshディレクトリに、id_rsa.pubとid_rsaというファイルができます。id_rsa.pubが公開鍵、id_rsaが秘密鍵になります。
サーバの設定
サーバで行うことは、サーバ側のユーザのホームディレクトリの.ssh/authorized_keyファイルに、先ほど作成した公開鍵の内容を追記することです。
authorized_keyは普通のテキストファイルなので、エディタで開いて、先ほど作成したid_rsa.pubの内容をコピー&ペーストペーストしておきます。コピペができない場合は、公開鍵をファイルかサーバに転送して作業を行ってください。
ポイントはauthorized_keyに「追記する」というところです。
接続テスト
ここまで来たら接続テストを行ってみましょう。次のコマンドを実行してみてください。
ssh ユーザ名@ホスト名 -p ポート番号
なお、秘密鍵をid_rsa以外のファイル名で作成した場合は、-iオプションでその秘密鍵ファイルを指定してください。
SSH接続に鍵認証を必須にする
最後に再びサーバ(VPS)側の作業です。
SSHのログインを鍵認証のみに変更します。これにより鍵を持っていないユーザはアクセスすることができなくなります。この作業は必ず鍵認証による接続が成功したのを確認してから行ってください。
これには/etc/ssh/sshd_configに下記2つの変更を加えます
- 「PasswordAuthentication no」を追記する
- 下記の行の先頭の#をはずす
AuthorizedKeysFile %h/.ssh/authorized_keys
忘れずにSSHサーバを再起動します。
sudo service ssh restart
これで今後はサーバのauthorized_keysファイルに公開鍵を登録してないクライアントからはSSHで接続ができなくなります。
これは、接続を許可したくないクライアントができたらauthorized_keysファイルからその公開鍵を削除すればよいということになります。万が一、秘密鍵が流出してしまった場合は、その秘密鍵に対する公開鍵をauthorized_keysファイルから削除するようにしましょう。
まとめ
今回は鍵認証方式でVPSのSSHに接続する方法を改めて紹介しました。
以前はサーバ側で公開鍵と秘密鍵のペアで鍵認証をしていましたが、これを各クライアントで鍵のペアを作成して、公開鍵をサーバに登録するようにしました。
こちらのほうが安全で運用も楽ですので、もしサーバ側の鍵ペアを利用している方がいましたら修正することをお勧めします。
次回は、Webサーバのオレオレ証明書の問題点について紹介します。
コメント