2009/03/03(Tue)特定のホストからだけsshの公開鍵認証ができない
2009/03/03 21:38
不思議なことに、公開鍵認証が通るホストもあるのだが、あるホストからは何度鍵を作り直したり、パーミッションを確認してみても通らない。
sshコマンドに-v等と付けて様子を見ていたが、これという原因が分からなくて悩んでいたのだけど、やっと解決。
脆弱性のあるlibsslを使って公開鍵を作成していたのが原因ということだった。
環境
接続する側、される側ともにDebian。- 接続する側
- Linux host-c 2.6.18-4-686 #1 SMP Wed May 9 23:03:12 UTC 2007 i686 GNU/Linux
- 接続される側
- Linux host-a 2.6.18-6-686 #1 SMP Thu May 8 07:34:27 UTC 2008 i686 GNU/Linux
状況
ちなみにssh -vしてみた時の様子。id_rsaをOfferingしてるけど、うまくいかないので結局password認証に落ちている、と。
# PlainTextを通す設定にしてなかったらPermission deniedとかなんとか言われるのかな。
debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Trying private key: /home/kero/.ssh/identity debug1: Offering public key: /home/kero/.ssh/id_rsa debug1: Authentications that can continue: publickey,password debug1: Trying private key: /home/kero/.ssh/id_dsa debug1: Next authentication method: password kero@host-a's password:
一方
sshdが走っている接続される側のログはというと、# lv /var/log/auth.log 8510 Mar 3 20:41:36 host-c sshd[31638]: Public key XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX blacklisted (see ssh-vulnkey(1))という風になっていた。
つまりは、脆弱性があるキーを使っているので接続させないようにブロックしているらしい。詳しくは、Debian JP Projectをどうぞ。
authorized_keysに書かれている公開鍵の検証は、ssh-vulnkeyコマンドによって行えるそうなのでやってみると、
$ ssh-vulnkey
Not blacklisted: 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX root@local
Not blacklisted: 1024 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX root@local
Not blacklisted: 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX /home/kero/.ssh/id_rsa.pub
Not blacklisted: 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX kero@host-a
Unknown (no blacklist information): 1024 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX kero@host-b
COMPROMISED: 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX kero@host-c
上のように該当しているキーが「COMPROMISED」と表示される。解決方法
Debian GNU/Linux に含まれる OpenSSL/OpenSSH の脆弱性に関する注意喚起によると、Debian GNU/Linux 4.0 (etch) ではこの問題はバージョン 0.9.8c-4etch3 で修正されています。とのことなので、アップデートしてみる。
OpenSSLとlibsslがともに古い状況だったので、更新して鍵を作り直せばOK。
host-cは事情によりインターネットに直に接続していないので、aptitude downloadとかでopensslとlibsslのパッケージを取得し、scp等で飛ばしておいた。
$ sudo dpkg -i openssl_0.9.8c-4etch4_i386.deb Password: (データベースを読み込んでいます ... 現在 88835 個のファイルとディレクトリがインストールされています。) openssl 0.9.8c-4etch1 を (openssl_0.9.8c-4etch4_i386.deb で) 置換するための準備をしています ... openssl を展開し、置換しています... openssl (0.9.8c-4etch4) を設定しています ... $ sudo dpkg -i libssl0.9.8_0.9.8c-4etch4_i386.deb (データベースを読み込んでいます ... 現在 88835 個のファイルとディレクトリがインストールされています。) libssl0.9.8 0.9.8c-4etch1 を (libssl0.9.8_0.9.8c-4etch4_i386.deb で) 置換するための準備をしています ... libssl0.9.8 を展開し、置換しています... libssl0.9.8 (0.9.8c-4etch4) を設定しています ... Checking for services that may need to be restarted...done. Checking init scripts... # ここで各種サービスを再起動してよいか確認される。 # 以下のように、ntp, bind9, spamassassin, exim4, sshが再起動された。 # 現在接続中のsshターミナルは切られなかった。 Restarting services possibly affected by the upgrade: ntp: stopping...starting...done. bind9: stopping...starting...done. spamassassin: stopping...starting...done. exim4: stopping...starting...done. ssh: stopping...starting...done. Services restarted successfully.それで鍵を作りなおして、該当サーバーへ登録。
最近知ったがssh-copy-idという便利なコマンドがあるので、わざわざscpしてcatして…という面倒なことはしなくてよい。
$ rm ~/.ssh/id* rm: remove 通常ファイル `id_rsa'? y rm: remove 通常ファイル `id_rsa.pub'? y $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/kero/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/kero/.ssh/id_rsa. Your public key has been saved in /home/kero/.ssh/id_rsa.pub. The key fingerprint is: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX kero@host-c $ ssh-copy-id -i ~/.ssh/id_rsa.pub host-a 10 kero@host-a's password: Now try logging into the machine, with "ssh 'host-a'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. $ ssh host-a Last login: .... ログイン成功!いやぁ、インターネットに直に接続していないマシンってアップデートが遅れがちになっちゃうな…。