Armadilloフォーラム

Debian12でのSSHの設定について

t.sugi

2024年8月5日 17時33分

お世話になっております。

Debian12をインストールしたArmadillo-IoT G3LでSSHを使用する際に待ち受けIPをeth0に設定したIPに制限するためにsshd_configでListenAddressを設定したところ、以下の通りの動作となりました。
・ハードウェア起動時は設定が有効にならない。
・ハード起動後コンソールからSSHのサービスを再起動させた場合は設定が有効になる。
・SSHのサービスファイル(ssh.service)に以下を追加するとハード起動時でも設定が有効になる。
 After=network-online.target
 Wants=network-online.target

上記よりハードウェア起動時ネットワークインタフェースの起動がSSHの起動までに間に合っておらず、SSH側で設定情報を読み込んだ際に指定されたIPを認識できていないのではないかと考えております。
なお、Debian10ではssh.serviceに上記の設定を追加しなくてもハード起動時にListenAddressの設定が有効になっていました。
対策としては上記の通りssh.serviceを修正することで可能と考えていますが、SSHのサービスファイルを変更せずに対応する方法がありましたら教えていただけないでしょうか。

コメント

お忙しいところ申し訳ありませんが、本件ご回答をいただくことはできますでしょうか?

at_dominique.m…

2024年8月8日 16時07分

t.sugiさん

お待たせしました、
マルティネです。

> 上記よりハードウェア起動時ネットワークインタフェースの起動がSSHの起動までに間に合っておらず、SSH側で設定情報を読み込んだ際に指定されたIPを認識できていないのではないかと考えております。

はい、ssh 起動時に ip が存在しない場合にエラーします:

root@armadillo:~# /usr/sbin/sshd -o ListenAddress=10.1.1.2 -d
debug1: sshd version OpenSSH_7.9, OpenSSL 1.1.1n  15 Mar 2022
debug1: private host key #0: ssh-rsa SHA256:SwlxxF+ss2HCMN/DI8AYXRLGEyz3WAswwE5gViU7MJU
debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:BmGGWUbeVYNQ5qBoFLkaNbWqVrH+veyoGiBBh4BgMNI
debug1: private host key #2: ssh-ed25519 SHA256:mmb/Sj0GGllvIxW0EZ/Niox5+uf+6cxs+pcHN/vzKCQ
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-o'
debug1: rexec_argv[2]='ListenAddress=10.1.1.2'
debug1: rexec_argv[3]='-d'
debug1: Set /proc/self/oom_score_adj from 0 to -1000
debug1: Bind to port 22 on 10.1.1.2.
Bind to port 22 on 10.1.1.2 failed: Cannot assign requested address.
Cannot bind any address.
root@armadillo:~# echo $?
255

> なお、Debian10ではssh.serviceに上記の設定を追加しなくてもハード起動時にListenAddressの設定が有効になっていました。

Debian10 でも network-online前に sshd が実行されてますので、アップデートで何かのタイミングが変わりましたね。

サービスに Restart=on-failure がありますので、Debian10 でリトライの回数が足りていて Debian12 で eth0 の ip を設定する前に諦めている可能性があります。
失敗した時の「journalctl -b -u sshd」で確認できます。

> 対策としては上記の通りssh.serviceを修正することで可能と考えていますが、SSHのサービスファイルを変更せずに対応する方法がありましたら教えていただけないでしょうか。

方法はいくつか考えれます:
- systemd のサービスは drop-in という別のファイルで変更できますので、「systemctl edit sshd」 (か直接に)/etc/systemd/system/ssh.service.d/hoge.conf で [unit]のAfter/wants だけを設定するのはそんなに悪くないと考えています。
- systemd のポリシーとしては、一般的に個別のアドレス・インタフェースに listen しないでくださいというスタンスですので、ListenAddress ではなく別の方法でフィルターすればこの問題がなくなります。方法としては iptables/nftables、sshd の別のオプション(Match address や AllowUsers等)、systemd の IPAddressDeny/Allow 等の設定も可能です。

よろしくお願いします

マルティネ様

お世話になっております。
ご回答ありがとうございます。頂いた内容を参考に検討します。