LoginSignup
0
0

More than 3 years have passed since last update.

[2020Q2] Docker コンテナでの sshd 起動まとめ w/o init

Posted at

はじめに

いくつかのディストリビューションにおいて 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 はシンプル

/lib/systemd/system/sshd-keygen.service
[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 を活用

/lib/systemd/system/sshd-keygen@.service
[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
/lib/systemd/system/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.serviceExecStartPresshd -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 鍵が生成されません。なんでだろ。
ちょっとキモいけど今は無視します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0