2009/03/03(Tue)特定のホストからだけsshの公開鍵認証ができない

2009/03/03 21:38 Software::Linux
ちょっと前からssh公開鍵認証が使えなくなって困っていた。
不思議なことに、公開鍵認証が通るホストもあるのだが、あるホストからは何度鍵を作り直したり、パーミッションを確認してみても通らない。
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: ....
ログイン成功!
いやぁ、インターネットに直に接続していないマシンってアップデートが遅れがちになっちゃうな…。