公開鍵認証でログインする - さくらのVPSを使ってみた

公開鍵認証とは

秘密鍵と公開鍵のペアを使った認証です。詳しい内容を知りたい方は共通鍵暗号と公開鍵暗号の解説とSSHでの認証手順など探せば解説している方がたくさんいらっしゃるのでそちらをご覧ください。

公開鍵認証の利点

パスワード認証の場合パスワードがばれると勝手にログインされてしまいます。わざわざ自分からばらすということはないと思いますが、パスワードは人間が記憶できる長さの文字列ということであまり長くできないですし、ついありがちなパスワードを使ってしまうこともあり、そういうパスワードは自分でばらさなくても破られる可能性があります。

公開鍵認証では秘密鍵がパスワードに相当するのですが、秘密鍵は十分に長くかつランダムな内容になっているため、秘密鍵を流出させない限りは破られることはありません。

個人での利用ではあまり関係ないですが、管理者と利用者がはっきりと分かれている場合に、パスワード認証では最初にどうやってパスワードを安全に通知するかという問題もあります。公開鍵認証の場合は第三者に知られても良い公開鍵をサーバーに登録すればよいので通知問題がありません。

公開鍵認証の問題点

秘密鍵がないとログインできない点が問題になることがあります。例えば出先からログインしたい場合。秘密鍵を常に持ち歩いていればそれを使うこともできますが、なかなかそうもいかないでしょう。

パスワード認証の場合はパスワードを記憶していればよいので、普段と違う環境からでもログインできます。

秘密鍵と公開鍵のペアを作成する

Windowsの場合はPuTTY Download PageにあるPuTTYgenを使うのが簡単だと思います。使い方は検索すれば説明してあるページがたくさん見つかります。

PuTTYgenを使う時に間違えやすいのが公開鍵の作成方法で、「Save public key」ボタンを使うのではありません。画面上部にある「Public key for pasting into OpenSSH authorized_keys2 file:」と書かれている欄の文字列を使います。

Linuxの場合はssh-keygenというコマンドを利用します。

作成した秘密鍵は手元で管理します。公開鍵はサーバーに登録します。

公開鍵を登録する

ユーザーの~/.ssh/authorized_keysファイルに公開鍵を登録します。すでにファイルがある場合は公開鍵の内容を追記してください。新規の場合は次の手順でファイルを作ります。

# .sshディレクトリを作成
$ mkdir ~/.ssh

# .sshディレクトリのパーミッションは700
$ chmod 700 ~/.ssh

# authorized_keysファイルを作成
# (下記はviの例ですがファイルをコピーしても良いです)
$ vi ~/.ssh/authorized_keys

# authorized_keysファイルのパーミッションは600
$ chmod 600 ~/.ssh/authorized_keys

パーミッションが違うとログインできないので、設定を忘れないようにしてください。

公開鍵認証を有効にする

最初から有効になっていると思いますが、もし無効になっていたら有効にしてください。/etc/ssh/sshd_configで設定します。

$ sudo vi /etc/ssh/sshd_config

PubkeyAuthentication noとなっていたら値をyesにします。

PubkeyAuthentication no
  ↓
PubkeyAuthentication yes

設定を変更したらsshdを再起動します。設定を変えていなければ再起動は不要です。

$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

これで公開鍵認証でログインできるようになりました。

パスワード認証を無効にする

公開鍵認証でログインできることを確認したらパスワード認証を無効にします。/etc/ssh/sshd_configで設定します。

$ sudo vi /etc/ssh/sshd_config

PasswordAuthenticationとChallengeResponseAuthenticationをnoにします。自分の環境ではChallengeResponseAuthenticationは最初からnoでしたので下記のように変更しました。

PasswordAuthentication yes
  ↓
PasswordAuthentication no

設定を変更したらsshdを再起動します。

$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

これでパスワード認証でログインできなくなりました。