setodaNote

忘れる用のメモ書き for Cybersecurity

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

===(追記:2021/03/04) ===
まだちゃんと確認までできていないものの、通信経路の途中の NW 機器で SSH に対するスキャンが有効になっていることが原因のようでした。

NW 機器がスキャンのために中間者として割り込んでいたのが、通常 SSH で利用されないポート番号に変えたことで検査の対象外となり直接サーバと SSH で接続することができて意図通りの通信ができようになったということのよう。

Twitter で言及していただいたおかげで気づくことができ、謎が解けてとてもうれしかったです。感謝しております。*1 *2
 
以下は上記に気付く前の記載の記事です。 ============================

答え:ポート番号を 22 以外に設定する

SSH の公開鍵認証設定が正しいはずなのにどうしても接続先パスワードを聞かれるとき、接続先ポート番号を変更してみるとうまくいくかもしれない。

手元の環境でもポート番号を変更したことで事象が解消されたように見えるものの、理屈まで確認できていないため実際には副次的に引き起こされた別の要因で解消されている可能性もありそう。 海外の掲示板では、何かがポート 22 番での ssh に対してパスワード認証を強制しているようだというコメントもあったものの、詳細までは触れられていなかった。

以下、そこに至るまでに確認した項目など。

環境

  • クライアント・サーバ:共に 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 に対してパスワード認証を強制していることがあるらしい。 根本的な原因までは追い切れず。

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

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

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

参考文献

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

その他

更新履歴

  • 2021/03/04 新規作成
  • 2021/03/04 一部記載の加除修正。「SELinux が止めていないか確認する」を追記。
  • 2021/03/04 冒頭に追記。

*1:記事は時間を作って修正する予定です。

*2:謎が解けたときは単純に「これかぁ!!」と本当にうれしかったのですが、SSH 周りの仕様や挙動に関するツイートや記事を拝見させていただいて、読み込んでいくにつれてSSH の仕様も挙動もよく理解せず、あまつさえ自分の使っている環境の把握もおぼつかないままに記事として公開している状況に心がきゅーっとなるなどしておりました。死にたい。生きる!

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

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

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