SSH 公開鍵認証で RSA_public_decrypt failed error

MHA を設定するために各 DB サーバに SSH 鍵を配布して、 masterha_check_ssh で疎通チェックをしたら、なぜか鍵認証で SSH ができない。 接続先サーバの /var/log/secure には以下のようなログが出てた。

Mar 24 19:30:34 host-xx-xx-xxx-xxx sshd[32327]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)

ssh コマンドで接続しにいくと、鍵認証が通らずパスワード認証に切り替わり入力を求められる、という状態。 どこから接続しても鍵認証ができないわけではなく、接続元によっては鍵認証でパスワードなしでログインできる場合もある模様。 SSH できない問題でよくありがちな、鍵のパーミッションやら所有者やらが違う問題でもなさそう。

なんこれ? ということで調べてみた。


結論から言うと

SSH 接続元のサーバにある 公開鍵/秘密鍵 のペアが何故か違い、接続先サーバの authorized_keys には今回使用する鍵のほか、鍵ペアが違う方の公開鍵も登録されていた。

寝ぼけながら鍵配布して、何か手順を間違えて鍵が混ざってしまったのだろうか…

( ゚∀゚)・;'.、グハッ!!

もうちょい詳しく

👆 ややこしいので整理してみる。

問題を再現してみる

SSH 用の認証鍵のペアを 2 つ用意する (Key A と Key B ということにしておく) そして、 3 台サーバを用意して、次のように鍵のファイルを配置した。

  • Server A [ssh 接続先]
    • authorized_keys: Key A / Key B の公開鍵を書いておく
  • Server B [ssh 接続元]
    • id_rsa: Key A の秘密鍵
  • Server C [ssh 接続元]
    • id_rsa: Key A の秘密鍵
    • id_rsa.pub: Key B の公開鍵

Server B から Server A への SSH

鍵認証が成功し、パスワード無しで SSH できる。

Server C から Server A への SSH

鍵認証が失敗し、パスワード入力による認証方式に切り替わる (入力を求められる)。

その際、 Server A の /var/log/secure で以下のログを確認できた。

Mar 31 19:03:45 XXXXXX sshd[6390]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)

なんでなん?

[http://nigohiroki.hatenablog.com/entry/2013/08/18/221434]

[http://ette.asablo.jp/blog/2007/02/08/1171775]

SSH で公開鍵認証が行われる仕組みを再確認してみる。

  1. SSH クライアントは接続時にまず公開鍵をサーバに渡す
  • この時クライアントは秘密鍵と同じ名前の公開鍵を送っているらしい
  • サーバは送られてきた公開鍵とユーザを対応付ける
  1. サーバは乱数を生成し、公開鍵で暗号化してクライアントに返す
  2. クライアントは受け取った暗号化された乱数を持っている秘密鍵で複合する
  • この時、クライアント側の公開鍵と秘密鍵のペアが異なるため正しい複合の結果が得られない
  1. 鍵認証に失敗、パスワード認証に移行…

仕組みを考えると、なるほどなという感じではある…

結局どうした

SSH 接続元にある id_rsaid_rsa.pub のペアが異なる (違うタイミングで ssh-keygen したファイルが何故か混ざってる) のが問題。公開鍵のほうを削除したところ、見事鍵認証が通るようになった。

接続元には秘密鍵だけが置かれている状態だが、接続時に秘密鍵から公開鍵が生成されるようなので、公開鍵のファイルは無くてもオッケー。


comments powered by Disqus