初めてやってのでメモしておきます。リモートサーバーへのSSH接続の際に、パスワード認証を禁止し、公開鍵認証にする設定です。公開鍵認証の方がこちらも楽な上に、パスワードの漏洩なども回避できます。
では設定開始。今回は、クライアントがWindowsXP, サーバーがLinux(CentOS4.4)です。
クライアント側でやること
公開鍵、秘密鍵のペアを作成
既に他のサーバーの公開鍵認証等に使っている鍵ペアがあれば、それを使ってもおk。ない場合は生成する。
- 鍵の生成
WinSCPに付属のPuTTYgenを用いた。以下が参考になる。
鍵を生成したら、公開鍵を「id_rsa.pub」、秘密鍵を「id_rsa.ppk」として保存。
保存先とは「C:\Documents and Settings\username\Application Data\rsa 」等、各ユーザーのホームディレクトリ下とし、他のユーザーからはアクセスできないようにしておく。
Linux系の場合は以下のようにして生成。後の確認のために、発行される公開鍵の指紋をメモしておく。
- 公開鍵をサーバーにコピー
WinSCPでサーバーに公開鍵をコピー。
本来であれば、サーバを外部に公開していない場合などを除いては、ネットワークを使用せず、CR-DやUSBなどでコピーした方がよい。
Linuxクライアントなら「scp ~/.ssh/id_rsa.pub user@host:」でコピー。(公開鍵鍵が~/.ssh下にあるという前提)
サーバー側でやること
今回はadminユーザーに対するアクセスを公開鍵認証にするので、adminでログインして設定。
- 公開鍵ファイルをOpenSSH互換の鍵に変換
PuTTYgenで生成した鍵は、OpenSSHでは使えないので、OpenSSH形式に変換する。ssh-keygenのiオプションで変換が可能。
$ ssh-keygen -i -f ~/id_rsa.pub >> ~/authorized_key_for_admin
- 指紋(Finger print)の確認
クライアントで生成時に表示された指紋と下記コマンドの出力を比べ一致していることを確認する。
$ ssh-keygen -l -f ~/authorized_key_for_admin
PuTTYgenを使っている場合は、PuTTYgenを起動し、「Load」で秘密鍵をロードすれば、指紋を調べることができる。
ここで、「/home/admin/authorized_key_for_admin is not a public key file.」と表示される場合は、OpentSSH形式への鍵の変換ができていない。
- 鍵をauthorized_keysに登録する
- ~/.ssh/authorized_keysが既に存在する場合
追加するだけでおk
$ cat authorized_key_for_admin >> ~/.ssh/authorized_keys
-
- ~/.ssh/authorized_keysがない場合
$ sudo mv ~/authorized_keys_for_admin /home/admin/.ssh/authorized_keys
$ sudo chown admin /home/admin/.ssh/authorized_keys
$ sudo chmod 600 /home/admin/.ssh/authorized_keys
$ sudo chmod 700 /home/admin/.ssh
パーミッションを設定し損ねると、SSHアクセスする際に認証に失敗するので注意。
- 公開鍵を削除する
$ rm ~/authorized_keys_for_admin
$ rm ~/id_rsa.pub
アクセスできるか確認
WindowsでPoderosaを使ってログイン。Poderosaでログインする場合は秘密鍵の変換が必要。変換した鍵を「id_rsa_com.ppk」などとして保存。この鍵をログイン時に用いる。
SSHの秘密鍵の形式がPuttyとは互換性が無いわけだが、puttygen.exeで変換が可能。「Export ssh.com Key」すると、Poderosaが読み込めるようになる
めでたくアクセス。ここで、「Wrong Key Format」とでれば、秘密鍵の形式を「ssh.com key」にしていない。「認証に失敗」とでたら、サーバー側で設定をミスった可能性が高い。「~/.ssh」ディレクトリなどをパーミッションを正しく設定したか確認。
- サーバーへのパスワード認証を禁止する
以下を参考。
特にここに注意。
チャレンジレスポンス認証を明示的に無効化しておかないと、PAM認証(実質てきにはパスワード認証)を行ってしまう。公開鍵認証に限定したいので、これも潰しておく。
-
- 変更前
#PasswordAuthentication yes
#ChallengeResponseAuthentication yes
-
- 変更後
PasswordAuthentication no
ChallengeResponseAuthentication no
sshdを再起動。
$ sudo /etc/init.d/sshd restart
以上で設定完了です。