PasswordAuthentication yesなのにSSHでパスワード認証できない|EC2で確認した設定

Linux

EC2上のLinuxでSSHのパスワード認証を有効にしようとして、/etc/ssh/sshd_config の設定を変更しました。

PasswordAuthentication yes

これでパスワード認証ができると思ったのですが、うまくいきません。

設定ファイルを見直しても、確かにyesになっています。

「設定を変えたのになぜ?」

と調べてみると、sshd_config以外にもSSHの設定ファイルが存在していました。

今回は、実際にEC2を使っていて遭遇したこの問題と、確認した内容を記録しておきます。

PasswordAuthenticationはyesになっている

まず/etc/ssh/sshd_configを確認しました。

sudo grep "PasswordAuthentication" /etc/ssh/sshd_config

設定は、

PasswordAuthentication yes

となっています。

それでもパスワード認証ができません。

そこで、/etc/ssh/以下に同じ設定が存在していないか調べてみました。

sshd_config.dも確認する

次のコマンドで、PasswordAuthenticationが記述されている場所をまとめて検索できます。

sudo grep -R "PasswordAuthentication" \
  /etc/ssh/sshd_config \
  /etc/ssh/sshd_config.d/

今回の環境では、次のような結果になりました。

/etc/ssh/sshd_config:PasswordAuthentication yes
/etc/ssh/sshd_config.d/50-cloud-init.conf:PasswordAuthentication no

sshd_configではyesなのに、

/etc/ssh/sshd_config.d/50-cloud-init.conf

には、

PasswordAuthentication no

という設定が存在しています。

つまり、sshd_configだけを見ていては、SSHに関係する設定をすべて確認できていませんでした。

実際に有効になっている設定を確認する

設定ファイルを一つずつ確認するだけでなく、sshdが最終的にどの設定を使用しているか確認する方法もあります。

sudo sshd -T | grep -i passwordauthentication

たとえば、

passwordauthentication no

と表示されれば、現在のsshdではパスワード認証が無効として解釈されています。

設定ファイルを書き換えたのに思ったように動かない場合は、sshd -Tで有効な設定を確認すると原因を探しやすくなります。

sshd_configだけを見ない

今回のポイントは、

/etc/ssh/sshd_config

だけではなく、

/etc/ssh/sshd_config.d/

以下にも設定が存在する場合があることでした。

SSHの設定で想定した動作にならないときは、

sudo grep -R "PasswordAuthentication" \
  /etc/ssh/sshd_config \
  /etc/ssh/sshd_config.d/

で設定箇所を探し、

sudo sshd -T | grep -i passwordauthentication

で実際に有効になっている値を確認する、という流れが使えそうです。

設定を変更したらsshdに反映する


`PasswordAuthentication` の設定を変更しただけでは、現在動いているsshdには設定変更が反映されません。

そこで、設定を変更したあとはsshdに設定を読み直してもらう必要があります。

ただし、いきなりsshdを再起動するのは少し怖いところです。SSHで接続して作業している場合、設定ファイルにミスがあると、新しくSSH接続できなくなる可能性があります。

まずは設定ファイルに問題がないか確認します。

“`bash
sudo sshd -t

何も表示されなければ、少なくともsshdが検出できる構文エラーはありません。

そのうえで設定を反映します。

今回の環境では、次のようにsshdを再起動しました。

sudo systemctl restart sshd

状態も確認しておきます。

sudo systemctl status sshd

restartではなくreloadでもよい?

sshdの設定変更を反映する方法として、restartのほかにreloadもあります。

sudo systemctl reload sshd

restartはsshdのサービスをいったん停止して起動し直すのに対して、reloadはサービス自体を停止せずに設定を読み直します。

SSHでリモートサーバーを操作していることを考えると、設定変更の反映だけが目的ならreloadを使う方法もあります。

ただし、利用しているLinuxディストリビューションやサービス定義によって、サービス名やreloadへの対応が異なる場合があります。

そのため、

systemctl status sshd

などでサービスの状態を確認してから操作するのが確実です。

また、Ubuntuなどではサービス名がsshdではなくsshとなっている環境もあります。

sudo systemctl reload ssh

このあたりも、EC2で使用するAMIによって違いがあるのか、今後実際に確認して追記していきたいところです。

SSH接続は残したまま確認する

SSHの設定変更では、現在接続しているターミナルをすぐに閉じないことも大切です。

設定を反映したあと、別のターミナルを開いて新しくSSH接続してみます。

新しい接続でも問題なくログインできることを確認してから、元のSSH接続を終了します。

今回のような作業なら、次の流れで確認すると安全です。

設定ファイルを編集
        ↓
sudo sshd -t
        ↓
sudo systemctl reload sshd
        ↓
sudo sshd -T で有効な設定を確認
        ↓
別のターミナルからSSH接続を確認

このように、設定ファイルを書き換えてすぐに接続を切るのではなく、構文チェック、設定の反映、有効な設定の確認、新規接続の確認という順番で進めることで、設定変更によって自分自身をサーバーから締め出してしまうリスクを減らせます。

EC2ではAMIによる違いもありそう

今回この問題に遭遇して気になったのが、EC2で使用するAMIによってSSHの初期設定がどの程度違うのかということです。

EC2では、Ubuntu、Amazon Linux、Red Hat Enterprise Linuxなど、さまざまなAMIを利用できます。

実際に使っていると、SSH周辺の挙動にも違いがあるように感じます。

そこで今後、

  • Ubuntu
  • Amazon Linux
  • Red Hat Enterprise Linux

などのEC2インスタンスを実際に立ち上げ、sshd_configやsshd_config.dの初期状態を比較してみようと思います。

確認できた内容は、この記事に追記していきます。


AITRetry Lab メモ

この記事は、実際に作業中につまずいたことを記録したものです。

AITRetry Labでは、最初から完璧な記事を作るのではなく、実際に試した結果をもとに記事そのものも更新していきます。

今回のSSH設定についても、別のAMIで検証した結果が分かり次第、追記する予定です。

コメント

タイトルとURLをコピーしました