はじめに
いくつかのディストリビューションにおいて sshd を起動するミニマムと思しき手順をまとめます。
今回想定しているのは init を使わないで直接 sshd を起動するケースです。
・・・っていう出だしなんですが、どちらかと言うと、鍵を誰が作っているのか、鍵が無かったらどうなるのか、イメージ配布するのに鍵を消したいけど自動的に再生成されるのか、みたいなことがポイントになってます。
対象ディストリビューション:
- CentOS 8
- Ubuntu 20.04 LTS (Focal Fossa)
CentOS 6 と 7 それから Ubuntu 16.04 LTS (Xenial Xerus) と 18.04 (Bionic Beaver) については、古い投稿にて扱っています。
そろそろみんな systemd けれど少しずつ微妙に違う
CentOS 8 も Focal も sshd は systemd が管理しています。例えば sshd の起動は下記で共通です。
# systemctl start sshd
CentOS はオンデマンドで鍵を生成する
伝統的に CentOS は sshd 起動時に自動的に鍵が生成されます。
もしイメージから鍵ファイルを消しておいたとすると、次回起動時に改めて生成されるということです。イメージ流用の観点からは、この方式は便利です。サンクス。
CentOS 7 と 8 では鍵生成用の systemd unit ファイルが独立して存在し、sshd.service に依存関係が設定されています。ただちょっと 7 と 8 では unit ファイル構成が違っています。
CentOS 7 はシンプル
[Unit]
Description=OpenSSH Server Key Generation
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_rsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ecdsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ed25519_key
PartOf=sshd.service sshd.socket
[Service]
ExecStart=/usr/sbin/sshd-keygen
Type=oneshot
RemainAfterExit=yes
CentOS 8 は target を活用
[Unit]
Description=OpenSSH %i Server Key Generation
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_%i_key
[Service]
Type=oneshot
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/libexec/openssh/sshd-keygen %i
[Install]
WantedBy=sshd-keygen.target
[Unit]
Wants=sshd-keygen@rsa.service
Wants=sshd-keygen@ecdsa.service
Wants=sshd-keygen@ed25519.service
PartOf=sshd.service
ふーん、て感じですw
Ubuntu は1回だけ鍵を生成する
伝統的に Ubuntu では openssh-server パッケージの postinst スクリプトが鍵を生成しています。
# dpkg-reconfigure openssh-server
もしイメージから鍵ファイルを消しておいたとすると、次回起動時に sshd は正常に動きません。イメージ流用の観点からは、この方式は不便です。ざんねん。
そして、鍵が無いとき、sshd の挙動が Bionic と Focal で異なります。Bionic も Focal も sshd.service
の ExecStartPre
で sshd -t
しているのですが・・・
Bionic は諦めない
Bionic は鍵が無くても sshd -t
が成功扱い($? が 0)で、sshd が起動します。しかし鍵が無いと ssh クライアントから接続できません。
ここで sshd を起動したまま鍵を生成すると、ssh クライアントから接続できるようになります。なんだか強い子っぽい。
Focal は潔い
Focal は鍵が無いと sshd -t
が失敗し、sshd は起動しません。
個人的には Focal の挙動が好きです。
ところで
Ubuntu では伝統的に sshd.service は ssh.service へのシンボリックリンクです。
実は
dpkg-reconfigure openssh-server
では dsa 鍵が生成されません。なんでだろ。
ちょっとキモいけど今は無視します。