sshdのパスワード認証を無効化できない件の対処方法と原因(Ubuntu)
sshd のパスワード認証・パスワードでのログインを無効化できなかったので、対処方法とその原因を自分用にメモしておく。
環境は、VMware Workstation Pro 上の Ubuntu 22.04。
普通なら /etc/ssh/sshd_config
で、
PasswordAuthentication no
Code language: plaintext (plaintext)
として設定をリロードすれば sshd のパスワードログインは無効になるが、どうにもこれが無効にならない。
で、色々調査したところ、ドロップイン /etc/ssh/sshd_config.d/50-cloud-init.conf
に
PasswordAuthentication yes
Code language: plaintext (plaintext)
などという記述を見つけた。
結論から言えば、このドロップインを削除なり無効化なりすれば sshd のパスワード認証は無効化できる。
とはいえ、設定が勝手に復活されても困るので念のため発生源を追ってみると、どうやら Ubuntu の(OSの)インストーラーが内部的に使っている cloud-init が原因と分かった。
直接的には cloud-init のドロップイン /etc/cloud/cloud.cfg.d/99-installer.cfg
に書かれている、
ssh_pwauth: true
Code language: plaintext (plaintext)
という記述により sshd_config.d
に 50-cloud-init.conf
が作られる、というわけだ。
(※ 余談だが 99-installer.cfg
には Ubuntu インストール時に設定した「身に覚えのある値」が書かれている。興味があれば見てみると良い)
そして 50-cloud-init.conf
を見ると、Ubuntu のインストーラーは(少なくともオンプレ環境で cidata な ISO などの一般的なデータソースを食わせない前提だと)cloud-init のデータソースとして自動的に datasourceNone を利用することが分かる。そりゃそうだ。
そしてそうとは知らない管理人は、自前で datasourceNone な設定を書いて cloud-init をクリーン&リランしたところ、インストーラーが書き出した既存の設定と被って思うように cloud-init が動かないという地雷の踏み抜きまでする始末。
つまづいてもタダでは済まない。その先にある地雷まで踏み抜いてしまう管理人なのでした。
sshd も cloud-init もどうせドロップインはレキシカル順で評価するのであろうから、より後で読まれるドロップインで設定を上書きする手もあるかもしれない。が、cloud-init は通常、インストール~初回起動のプロセス中に1度だけ実行される前提だから、インストーラーが勝手に書いた cloud-init 由来の設定であるならば、単純に上書きなり消すなりすればよいだけとは思う。
もちろん、自前の cloud-init のユーザーデーター由来ならそっちを修正した方が良いとは思うけども。