setodaNote

忘れる用のメモ書き for Cybersecurity

SSH で正しく公開鍵認証設定しているのに接続先パスワードを聞かれるときの対処

概要

SSH の公開鍵認証設定が正しいはずなのにどうしても接続先パスワードを聞かれたときに、実際に確認した内容のまとめた記事です。

最終的に通信経路上に設置されていたセキュリティ機器が SSH 通信をスキャンしていたことが原因でした。*1 *2

試行錯誤しているときは以下の記事などを参考にポート番号を 22 番から変更することで事象が解消されましたが、可能であればセキュリティ機器の設定を修正するのが適切だと思います。

以下、原因にたどりつくまでに確認した項目などを列挙しています。

環境

  • クライアント・サーバ:共に Ubuntu 20.04
  • ssh:OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020

確認1:鍵設定の手順を確かめる

なるべくまっさらな状態で確立された手順を確かめつつ実施する。

基本的には以下の通りでうまく動くはず。コマンド実行なのでファイル名のタイポやパーミッション誤りも防げる。 *3

ssh-keygen
ssh-copy-id username@remote_host
ssh username@remote_host

確認2:パーミッション

パスワードを聞かれる原因のほとんどはこれらしい。関連記事も多数。 いつの間にか /home/user/ が 777 になってしまっていたというのが多い様子。

<接続元(クライアント)の設定例>

  • chmod 755 /home/
  • chmod 755 /home/user
  • chmod 700 /home/user/.ssh
  • chmod 600 /home/user/.ssh/id_rsa
  • chmod 644 /home/user/.ssh/id_rsa.pub

<接続先(サーバ)の設定例>

  • chmod 755 /home/
  • chmod 755 /home/user
  • chmod 700 /home/user/.ssh
  • chmod 600 /home/user/.ssh/authorized_keys

確認3:sshd_config の設定値

サーバで公開鍵認証が許可されているか確認する。 デフォルトが yes なので no と明示設定されていない限りは問題ないはず。

# サーバー側
vi /etc/ssh/sshd_config

PubkeyAuthentication yes

確認4:sshd のログ

ログを確認してエラーが出力されていないか確認する。最初に確認するのが解決の近道。

[CentOS]
/var/log/secure

[Ubuntu]
/var/log/auth.log

確認5:SELinux が止めていないか確認する

今回の環境は Ubuntu なのであまりないものの、なんらか SELinux の制限にひっかかっている場合も。 以下で ssh 関係の出力がされていないか確認する。

[CentOS]
yum install policycoreutils-python
cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow

確認6:マシンを再起動する

個別のリスタートでうまくいかなければ。 もしかすると設置値がうまく反映されない場合があるかもと一縷の望みをかけて。

復旧しても往々にして原因不明のままになるので、基本的には避けたい。

確認7:ssh のデバッグログ

今回の事象解消に役に立った方法。 -v を付けた状態で ssh を実行する。 *4

ssh -v username@remote_host

ずらっとログが出力されるので、パスワードを聞かれる少し上にあるはずの以下の個所を確認。

debug1: Authentications that can continue: password

上記のように password になっている場合、サーバ側で公開鍵認証が許可されておらず、 パスワード認証のみが有効になっている状態を意味する。

本来想定される出力は例えば以下のような感じ。

debug1: Authentications that can continue: publickey,password

設定などが正しいにも関わらず password のみになっている場合、 ポート番号を変更(例えば 2222 などに)することで解消される場合がある。

# サーバー側
vi /etc/ssh/sshd_config

Port 2222

設定後に sshd をリスタートする。

sudo systemctl restart sshd

今回の場合はポート番号を変更することで事象が解消され、通信できるようになった。 通信経路上に存在していたセキュリティ機器がポート 22 番での ssh に対してパスワード認証を強制していたためのよう。*5

その他:最新版にアップデートする

Ubuntu のパッケージで導入できる OpenSSL は 1.1.1f となっているが、OpenSSL は 1.1.1j が最新版となっている。*6

特定環境で影響するバグが関係しているのであれば、最新版にアップデートすることで解消される可能性もあるが、別の事象に悩まされることになる可能性もある。 また、利用者と開発者とのやりとりが公開されている場合、ぴったり同じでなくても似た事象がバグ報告されていないかどうかも確認すると問題解決の糸口になるときも。

参考文献

SSH で正しく公開鍵認証設定しているのに接続先パスワードを聞かれるときの対処関連

その他

更新履歴

  • 2021/03/04 新規作成
  • 2021/03/04 一部記載の加除修正。「SELinux が止めていないか確認する」を追記。
  • 2021/03/04 暫定的に、通信経路上のセキュリティ機器による SSH 通信のスキャンが原因であったことを冒頭に追記。
  • 2021/05/15 暫定的に記載していた内容を本文に反映。合わせて冒頭の記載も修正。

*1:中間者として通信を仲介していた形になっていたようです。Twitter で言及していただいたおかげで気づくことができました。

*2:接続先の fingerprint をちゃんと確認すれば、接続しようとしている機器のものではないと気づけたはずでした。

*3:鍵の種類や強度やコメントなどは必要なら適宜追加する。トラブルシューティングなのでプレーンなもので試していった。

*4: -vvv とするとさらに詳細なログが確認できる。

*5:最終的にはセキュリティ機器の設定を適切なものに変更しました。

*6:OpenSSL https://www.openssl.org/news/newslog.html