Ubuntu Server 22.04でSSH接続のパスワード認証を有効に出来ない

普段はサーバ用途でもUbuntu Desktopをminimal installationで使用することが多いのですが、久しぶりにUbuntu Server 22.04を入れてみたらSSH接続のパスワード認証を有効にできなくてドツボったので対処方法を残しておきます。

sshd_config を何度書き換えても反映されない、というのが典型的な症状です。設定ファイルの書き方が間違っているわけではないので、単体で見ている限り原因が見つかりません。

動作環境

  • Ubuntu Server 22.04(cloud image由来のインストール)
  • OpenSSH(Ubuntu 22.04の標準パッケージ)

Ubuntu Serverのイメージ側の事情による挙動なので、バージョンによって該当するファイル名が変わります。詳細は後述の「新しいバージョンでの注意点」に書きました。

結論

/etc/ssh/sshd_config.d/*.conf にパスワード認証を無効にする設定があったので有効にならなかった

詳細

まずSSH関連の設定を行う /etc/ssh/sshd_config では冒頭の部分で以下のようにconfファイルをincludeしています。

$ cat /etc/ssh/sshd_config

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf
(以下、略)

そして、Ubuntu Desktopでは通常はこの /etc/ssh/sshd_config.d 配下には何もファイルがない状態になっています。

$ ll /etc/ssh/ssh_config.d/
total 8.0K
drwxr-xr-x 2 root root 4.0K Feb 26  2022 ./
drwxr-xr-x 4 root root 4.0K Jul  2 00:00 ../

したがってSSHに関する設定はsshd_configファイルで完結しているのですが、Ubuntu Serverでは以下のようにconfファイル(60-cloudimg-settings.conf)が存在しており、その中でパスワード認証が無効にされているため、sshd_configをいくら変更してみてもパスワード認証が有効に出来ない状態となっていました。

$ ll /etc/ssh/sshd_config.d/
total 16
drwxr-xr-x 2 root root 4096 Oct  1 18:19 ./
drwxr-xr-x 4 root root 4096 Oct  1 18:18 ../
-rw-r--r-- 1 root root   26 Sep 11 23:29 60-cloudimg-settings.conf

$ cat /etc/ssh/sshd_config.d/60-cloudimg-settings.conf 
PasswordAuthentication no

そのため、このconfファイルを削除するかもしくはこのデフォルトで存在するファイルよりもさらに先に読み込まれるファイルを用意してその中でパスワード認証を有効にするようにすればOKです。

なぜ「先に読み込ませる」と勝てるのか

ここが直感に反するところなので補足しておきます。

sshd_config の設定項目は、多くのものが最初に見つかった値が採用されるという規則になっています。後から書いた値で上書きされるのではなく、先に書いた値が生き残ります。

Include /etc/ssh/sshd_config.d/*.conf はファイル名順に展開されるので、00-user-settings.conf60-cloudimg-settings.conf より先に読まれます。したがって先に書いた PasswordAuthentication yes が採用され、後から出てくる no は無視される、という流れです。

この規則を知らないと「上書きしたいのだから後ろに置くべきでは」と考えてしまい、99- のようなファイル名を付けて効かずに悩むことになります。私は最初それをやりました。

$ ll /etc/ssh/sshd_config.d/
total 16
drwxr-xr-x 2 root root 4096 Oct  1 18:19 ./
drwxr-xr-x 4 root root 4096 Oct  1 18:18 ../
-rw-r--r-- 1 root root   27 Oct  1 18:19 00-user-settings.conf # <- 追加
-rw-r--r-- 1 root root   26 Sep 11 23:29 60-cloudimg-settings.conf

$ cat /etc/ssh/sshd_config.d/00-user-settings.conf 
PasswordAuthentication yes

設定が終わったら最後にSSHのサービスを再起動するのを忘れないでください。

systemctl restart sshd

新しいバージョンでの注意点

この記事はUbuntu Server 22.04で確認したものですが、その後のバージョンでは次の点が変わっている場合があります。手元の環境で確認してから進めてください。

該当するファイル名が違うことがある。 ここでは 60-cloudimg-settings.conf でしたが、cloud-initが生成する 50-cloud-init.conf に同種の設定が入っているケースもあります。ファイル名を決め打ちで探すより、まず中身を確認するのが確実です。

grep -r PasswordAuthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

これで、どのファイルのどの行が効いているのかが一度に分かります。

サービス名が ssh の場合がある。 Ubuntu 22.10以降ではsshdがsocket activation(ssh.socket)で起動する構成になっており、systemctl restart sshd では意図した通りに反映されないことがあります。その場合は systemctl restart ssh を使うか、socket側を再起動してください。

パスワード認証を有効にすることについて

最後に一つ書いておくと、そもそもUbuntu Serverのイメージでパスワード認証が最初から無効にされているのは、意図的な安全側の初期設定です。インターネットに直接公開するサーバでこれを有効にすると、総当たり攻撃の対象になります。実際にどの程度のスキャンが来ているかは攻撃ログ公開:.env や config.yml を狙う不正スキャンの現場に書きました。

家庭内LANのような閉じた環境で使う分には現実的な選択だと思いますが、外部に公開する場合は公開鍵認証を使う方が確実です。私も自宅のラズパイのように手元で触る用途だけパスワード認証を有効にしています。

WiFi接続とIP固定の手順は、22.04ではRaspberry PI 3のUbuntu Server 22.04でWiFi接続&IPを固定するに、24.04ではUbuntu Server 24.04でのWiFi接続設定&IP固定に書いています。このサーバを複数人で使うファイル置き場にする場合の権限設計は、チーム向けLinuxファイルサーバ構築:権限設定とユーザ管理にまとめました。