パーソナルツール
現在の場所: ホーム サーバ設定 SSH 秘密鍵・公開鍵SSH接続

秘密鍵・公開鍵SSH接続

秘密鍵・公開鍵(鍵交換方式)使ったSSH接続の設定方法。

秘密鍵・公開鍵認証

SSHによって通信経路を暗号化したとしても、何らかの原因(ブルートフォース攻撃等)でパスワードが第3者に漏れてしまったらせっかくの暗号化通信も意味がありません。

※ならばパスワードを推測できないぐらい複雑なものにすればよいと思うかもしれませんがそんな難しいパスワードは、ユーザ自身が覚えておくことも難しくて結局紙に書いたりしてそこからパスワードがもれてしまう・・・

なので、セキュリティレベルをもう一段強固にするために「鍵認証方式」を使用したSSH接続を実装したいと思います。

この方式ですと、万が一パスワードが第3者に漏れたとしても鍵を持っていないホストからの接続は出来なくなくなります。

※逆にいうと、正規のユーザも鍵が保存されているホストからのみしか接続できなくなるので利便性は下がります。

鍵作成

鍵を作成したいユーザでログイン後「ssh-keygen」コマンドを使用して秘密鍵と公開鍵を作成します。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tamohiko/.ssh/id_rsa):
Created directory '/home/tamohiko/.ssh'.
Enter passphrase (empty for no passphrase): (SSHログイン用のパスワードを入力)
Enter same passphrase again:(SSHログイン用のパスワードを入力)
Your identification has been saved in /home/tamohiko/.ssh/id_rsa.
Your public key has been saved in /home/tamohiko/.ssh/id_rsa.pub.
The key fingerprint is:
1d:cc:af:2d:3c:82:6a:97:6e:c5:af:18:7b:b6:ff:f7 tamohiko@sun.server-memo.net

これで、秘密鍵と公開鍵がユーザホームディレクトリ内の.sshディレクトリ内に作成されます。

秘密鍵

/home/tamohiko/.ssh/id_rsa.

公開鍵

/home/tamohiko/.ssh/id_rsa.pub

公開鍵の登録

作成された公開鍵からauthorized_keysを作成します。

authorized_keysが無い場合
$ cd ~/.ssh
$ mv id_rsa.pub authorized_keys
$ chmod 600 authorized_keys
既にauthorized_keysがある場合
$ cat id_dsa.pub >> authorized_keys

秘密鍵を接続元クライアントへ

id_rsa(秘密鍵)を何らかの方法でクライアントに持っていきます。

セキュリティを考えると、フロッピーディスクとかUSBメモリなんかでクライアントに持っていくのが良いでしょう。

sftpやscpでもよいかもしれません。

秘密鍵の登録(puttyの場合)

今回使用したSSHクライアントは、蛭子屋本舗さんで配布しているPuttyごった煮版です。
ここでは、サーバより持ってきたid_rsa(秘密鍵)をPuttyへ登録する手順です。

Putty用秘密鍵の生成
(1) puttygen.exeの起動 Puttyge.exeアイコンをクリックして起動します (2) 秘密鍵の読込み   「ファイル」-「秘密鍵の読込み」を選択します。 秘密鍵の読込み サーバより持ってきたid_rsaを選択します。 (その際ファイルの種類はすべてのファイルを選択します。) id_rsaファイルの選択 (3) パスフレーズ入力 「パスフレーズの入力」ウインドウが表示されますので、 サーバで鍵を作成した際に設定したパスワードを入力します。 パスフレーズ入力 (4) 鍵インポートの確認 「鍵のインポートに成功しました」といウィンドウが表示されますので   「OK」ボタンを押下します。 鍵インポート成功画面 (5) 秘密鍵の保存   「秘密鍵の保存」ボタンを押下して、秘密鍵の保存を行います。 秘密鍵の保存  「秘密鍵の保存」画面が表示されるので、適当な場所に分かりやすい名前を付けて   PuTTY秘密鍵ファイルをを保存してください。    秘密鍵の保存 以上でPuttyに登録するための秘密鍵生成作業は完了です。
Puttyへ秘密鍵の登録
(1) putty起動   putty.exeを起動します。    (2) サーバ接続データの読込   PuTTY設定ウィンドウが表示されますので、既存のサーバ接続用データを読み込みます。   接続用の設定がなければ、新規に作成してください。 Putty設定 (3) putty用秘密鍵の読込み カテゴリ欄より「SSH」-「認証」を選択し、 「認証のためのプライベートキーファイル欄」の「参照」ボタンを押下します。 秘密鍵登録   「秘密鍵ファイルの選択」画面が表示されるので、    putty-gen.exeで作成した、秘密鍵を選択します。 秘密鍵登録2 (4) 秘密鍵登録完了 秘密鍵登録完了 (5) puttyの設定保存 カテゴリ欄よりセッションを選択し、「保存」ボタンを押下して設定を保存します。 Putty設定保存 以上で、Puttyへの秘密鍵登録作業は完了となります。
秘密鍵の登録(TeraTermの場合)

今回はTeraTerm Pro with TTSSH2を使用しています。

(1) TeraTermを起動
接続先を入力し、サービス欄でSSHにチェックを入れて「OK」ボタンを押下します。

TeraTermの起動

(2)SSH認証設定
「SSH認証」ウィンドウが表示されるので、「ユーザ名」「パスフレーズ」を入力し、
「RSA/DSA鍵を使う」にチェックを入れて、「秘密鍵」ボタンを押下します。

ssh-key-teraterm2.jpg(30225 byte)

(3)秘密鍵の登録
「RSA/DSA秘密鍵ファイルの選択」画面が表示されるので、サーバより持ってきた秘密鍵を選択します。

ssh-key-teraterm3.jpg(27183 byte)
秘密鍵の登録(linuxの場合)
※今回は~/.ssh に秘密鍵を保存するものとします。
$ cd ~./ssh
$ ls -la
-rw-r--r--   1 tamo tamo  224 7月 6 16:00 known_hosts
-rw-r--r--   1 tamo tamo  952 7月 6 16:03 id_rsa  <--接続先より持ってきた秘密鍵
(1) パーミッションの変更 サーバより持ってきた秘密鍵のパーミッションを600に変更します。
$ cd ~/.ssh
$ mv id_rsa www_rsa  <--どのサーバの鍵なのか、分りやすいように名前を変更
$ chmod 600 www_rsa
(2) 接続方法 秘密鍵を使用してssh接続するにはsshの「-i」オプションを使用します。
$ ssh -i ~/.ssh/www_rsa tamohiko@192.168.0.1
Enter passphrase for key '/root/.ssh/www_rsa':
Last login: Sun Jun  3 22:59:03 2007 from 192.168.0.100

sshd設定変更

鍵を持っているクライアントからのみSSH接続を許可するという設定を、 sshdの設定ファイルである「/etc/ssh/sshd_config」に設定していきます。

/etc/ssh/sshd_configの編集

ここからはrootユーザで作業します。

$ su -
# cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_yyymmdd
# vi /etc/ssh/sshd_config
変更項目
変更前
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys

#PasswordAuthentication yes
変更後

コメントをはずして、「PasswordAuthentication」の項目を「no」に変更します。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

PasswordAuthentication no   <-- noへ変更します
configのテスト

「/usr/sbin/sshd -t」コマンドを実行すると設定ファイルの書式に間違いが無いか確認してくれます。

「/etc/sshd/sshd_config」の書式に問題がなければ何も表示されません。
(書式をテストするだけで、設定値等はテストしてくれません。)

表示例
# /usr/sbin/sshd -t
書式に間違えがあれば以下のように、間違っている箇所が表示されます。
# /usr/sbin/sshd -t
/etc/ssh/sshd_config line 64: Bad yes/no argument: No
/etc/ssh/sshd_config: line 91: Bad configuration option: UesPAM
/etc/ssh/sshd_config: terminating, 1 bad configuration options

設定反映

設定が完了しましたら、sshdを再起動することで設定を反映させます。

ssh再起動

現在の通信を切断しないまま行います。
(出来れば、コンソールで操作できる環境で行ったほうがよい)

# /etc/init.d/sshd restart

動作確認

設定変更が完了しましたら、実際に鍵を持っているクライアントと持っていないクライアントよりログインしてみて、動作確認を行って見ます。

鍵を持っているクライアントからのログイン

今回はwindowsXPより「putty」というsshクライアント使用して動作確認をしてみました。

login as: tamohiko
Authenticating with public key "imported-openssh-key"
Passphrase for key "imported-openssh-key":
Last login: Tue May 22 15:54:09 2007 from 192.168.85.1

無事ログインすることが出来ました:-p

ちなみに、/var/log/secure ログには以下のようにログが残ります。

May 22 08:10:28 sun sshd[11934]: Accepted publickey for tamohiko from 192.168.85.1 port 2149 ssh2

鍵を持っていないクライアントからのログイン

鍵を持っていないクライアントからログインしてみると、ログイン出来ないことが確認できます。

login as: tamohiko

こちらの場合は、以下のように/var/log/secureへログが残ります。

May 22 08:11:42 sun sshd[12023]: Received disconnect from 192.168.85.1: 11: No supported authentication methods available

これで設定は完了です:-)