No.2357 公開鍵暗号でSSHのセキュリティを高める
公開鍵暗号でSSHのセキュリティを高める
2005年2月13日 掲載
2006年1月16日 改訂
※このページでは公開鍵暗号をサーバー側で作成する方法を紹介していますが、Windowsマシンで公開鍵暗号を作る方法もあります。こちらの方が簡単にできるので、「TeraTermProで公開鍵認証を使う」の手順をおすすめします。
SSHサーバーは特に何の設定をしなくても動作してくれるが、そのままで使うには少し不安がある。セキュリティを高めるための設定を行ってみよう。キーワードは「公開鍵暗号」だ。
公開鍵暗号とは
公開鍵暗号というのは1970年代後半に考案されたもので、暗号化と解読に別のカギを使おうというもの。「公開鍵」「秘密鍵」という一対のカギを 用意しておく。そして、公開鍵で暗号化したものは秘密鍵でしか解読できない。反対に秘密鍵で暗号化すると公開鍵でしか解読できない。
これを利用するとパスワードを相手に知らせることなく、暗号化されたデータをやりとりできる。公開鍵を相手にしらせておき、データを受け取るときは公開鍵で暗号化してもらう。そのデータを解読できるのは秘密鍵を持っている自分だけだ。
公開鍵暗号でログインする仕組み
SSHでのユーザー認証にもこの公開鍵暗号を使う。接続する側のパソコンに秘密鍵を保存しておき、サーバーの側に公開鍵を入れておく。ログインす るときにサーバーはクライアントに向けて、ユーザーの公開鍵で暗号化したメッセージを送信する。それを受け取ったクライアントではユーザーの秘密鍵でメッ セージを解読する。そのメッセージをサーバーに送り返し、暗号化する前のメッセージと一致すればログインを許可する。
サーバーが公開鍵で暗号化したものを解読できるのは、秘密鍵を持つユーザーだけ。この方式ならパスワードをネットワーク上で送ることなく確実にユーザーの認証ができるわけだ。
作業の手順
安全性を高められる公開鍵暗号だが、実際の設定はけっこう面倒だ。整理すると次のようなステップになる。
- サーバー側でSSHサーバーの設定を変更し、公開鍵暗号でのログインを指定する
- サーバー側でユーザーの秘密鍵と公開鍵のペアを作成する
- できあがった秘密鍵をユーザーのパソコンへコピーする
- パソコンのSSHクライアントで公開鍵による認証を行うように設定する
1:SSHサーバーの設定変更
SSHサーバーの設定を行うには「/etc/ssh/sshd_config」をviで開いて編集する。コマンドプロンプトから 「vi /etc/ssh/sshd_config」と入力すればいい。長いファイルだが設定変更は一カ所だけだ。 「PasswordAuthentication」をyesからnoに変更する。元のファイルで行頭に「#」が付いているのは、コメントとして無効にされ ているので、「#」を削除することを忘れないように。
同じフォルダに「/etc/ssh/ssh_config」というファイルもあるが、こちらはSSHクライアントの設定ファイルなので間違えてはいけない。
PasswordAuthentication no ←パスワードではなくカギでログインする
ついでに以下のような項目もいっしょに設定しておこう。さらに安全性を高められる。
PermitRootLogin no ←rootでのログインを禁止する PermitEmptyPassword no ←パスワードなしのログインは許可しない AllowUsers ×× ←指定したユーザーのみログインを許可
これらの設定が終わったらファイルを保存し、SSHサーバーを再起動して設定を有効にする。これで従来の方式でのログインはできなくなった。
# /etc/rc.d/init.d/sshd restart
2:ユーザーのカギを作成する
次にユーザーのカギを作成しよう。スーパーユーザーとしてroot権限で作業をしていたときは、いったんexitする。カギを作るときはログインするユーザーとして作業を行う必要がある。
途中でパスワードを入力するが、これはログインパスワードではない。秘密鍵にアクセスするためのパスワードである。このパスワードを入力しないと、たとえ秘密鍵が誰かに奪われたとしても使われることはない。二重の安全策がほどこされているわけだ。
また、SSHサーバーが認証の時に利用する公開鍵の名前は「authorized_keys」なので、作成されたカギの名前を変更しておく。
$ whoami ←念のために現在のユーザー名を確認 yasu $ ssh-keygen -t rsa ←カギを作成するコマンド Generating public/private rsa key pair. Enter file in which to save the key (/home/yasu/.ssh/id_rsa): Created directory '/home/yasu/.ssh'. ↑そのままEnterキーを押す Enter passphrase (empty for no passphrase): ←パスワードを入力 Enter same passphrase again: ←もう一度パスワードを入力 Your identification has been saved in /home/yasu/.ssh/id_rsa. Your public key has been saved in /home/yasu/.ssh/id_rsa.pub. The key fingerprint is: ff:8a:6b:d8:eb:ad:68:90:33:eb:2c:6c:d8:ea:98:41 yasu@localhost.localdomain $ ls -la ~/.ssh ←カギができているか確認 合計 16 drwx------ 2 yasu yasu 4096 Feb 2 13:53 ./ drwx------ 22 yasu yasu 4096 Feb 2 13:53 ../ -rw------- 1 yasu yasu 951 Feb 2 13:53 id_rsa ←秘密鍵 -rw-r--r-- 1 yasu yasu 236 Feb 2 13:53 id_rsa.pub ←公開鍵 $ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys $ ↑公開鍵をauthorized_keysにリネーム
3:秘密鍵をパソコンにとりこむ
できあがった秘密鍵「id_rsa」をパソコンへととりこむわけだが、どのようにとりこむかが問題になる。もしサーバーでFTPを起動しているな ら、クライアントのWindowsパソコンからFTPで接続してダウンロードすればいい。FTPソフトによっては隠しファイルや隠しフォルダが表示されな いことがあるので、そのときは「.ssh」と手動でフォルダ名を指定する必要がある。下の写真はFFFTPを使っているが、隠しフォルダが表示されなかっ たのでフォルダ名を手動で打ち込んだ。
フロッピーディスクでとりこむという手もある。Linuxの場合、フロッピーやHDDにドライブ名が割り当てられるわけではなく、「/mnt」ディレクトリの中に位置付けられている。また、リムーバブルディスクを使うには、最初にマウントという操作を行う必要がある。
このあたりの詳細はLinuxの入門書を参照してもらうとして、とりあえずコピーしたいときは次のようにコマンドを打ち込んでいけばいい。
$ mount /mnt/floppy ←フロッピーをマウントする $ mv ~/.ssh/id_rsa /mnt/floppy/ ←秘密鍵をフロッピーにコピー $ umount /mnt/floppy ←フロッピーのマウントを解除する $
4:SSHクライアントの設定を行う
カギを使ってログインするようにPuTTYを設定しよう。コピーしてきた秘密鍵はそのままでは使うことができず、Windows上で形式を変換しなければならない。まずはこちらのページから「PuTTYgen」をダウンロードして実行する。
右のような画面が表示されるので、次の手順で変換を行う。
- 「Load」ボタンをクリックする
- コピーしてきた秘密鍵を選択する。「ファイルの種類」を「PuTTY private key」から「All」に変更しないと秘密鍵のファイルが見えないところに注意
- 「Enter Passphrase」という画面が表示される。サーバーでカギを作成したときに入力したパスワードを打ち込む
- 変換が完了した。「Save private key」ボタンをクリックする
- 適当な名前でPuTTYのフォルダに保存する
カギの変換が終わったら、次はPuTTYの設定に入る。通常のログインと違うのは変換したカギのファイルを指定するところだ。
左のメニューで「接続」→「SSH」→「認証」とたどっていき、「認証のためのプライベートキーファイル」のところに変換した秘密鍵のファイルを指定する。
あとはセッションのページで接続先のサーバーのIPアドレスなりホスト名を入力するだけでいい。
なお、PuTTYは自動で設定を保存しないので、このままでは接続のたびにIPアドレスを入力し、カギのファイルを指定しなければならない。
必要な設定をすべて終えたら、左側のメニューで「セッション」を選ぶ。「保存されたセッション」のところに何か名前を入力し、「保存」をクリックすると 現在の設定が保存される。次回からは設定のリストの中から名前を選んで「読込」をクリックするだけで、設定が読み込まれる。