Humanity

Edit the world by your favorite way

/etc/ssh/ssh_host_* の SSH 鍵を再生成する

d.hatena.ne.jp

結論から言うと、上記記事の通り SSH 鍵を削除するなり移動するなりして sshd を再起動すれば自動的に生成してくれる。

# rm -f ssh_host_{ecdsa,ed25519,rsa}_key{,.pub}
# systemctl restart sshd

どんな風に実装されてるか気になったので調べた。のでまとめる。 CentOS 7 上だと以下の Unit が生成処理を行っている(終)。

/usr/lib/systemd/system/sshd-keygen.service

[Unit]
Description=OpenSSH Server Key Generation
ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key
ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key
PartOf=sshd.service sshd.socket

[Service]
ExecStart=/usr/sbin/sshd-keygen
Type=oneshot
RemainAfterExit=yes

通常はやることがないのでこんなログになる。

$ sudo systemctl status sshd-keygen.service
● sshd-keygen.service - OpenSSH Server Key Generation
   Loaded: loaded (/usr/lib/systemd/system/sshd-keygen.service; static; vendor preset: disabled)
   Active: inactive (dead)
Condition: start condition failed at 日 2016-09-04 02:13:33 JST; 16h ago
           none of the trigger conditions were met

 9月 04 02:13:33 myhost systemd[1]: Started OpenSSH Server Key Generation.

キーを移動して sshd-keygen.service を再起動してみる。

$ mkdir -p sshkeys.old; for i in ssh_host_{ecdsa,ed25519,rsa}_key{,.pub}; do sudo mv /etc/ssh/$i sshkeys.old/$i; done
$ ls sshkeys.old/
ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub
$ sudo systemctl restart sshd-keygen.service

そうするとこうなる。

$ sudo systemctl status sshd-keygen.service
● sshd-keygen.service - OpenSSH Server Key Generation
   Loaded: loaded (/usr/lib/systemd/system/sshd-keygen.service; static; vendor preset: disabled)
   Active: active (exited) since 日 2016-09-04 18:32:28 JST; 3s ago
  Process: 2417 ExecStart=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
 Main PID: 2417 (code=exited, status=0/SUCCESS)

 9月 04 18:32:28 myhost systemd[1]: Starting OpenSSH Server Key Generation...
 9月 04 18:32:28 myhost sshd-keygen[2417]: Generating SSH2 RSA host key: [  OK  ]
 9月 04 18:32:28 myhost sshd-keygen[2417]: Generating SSH2 ECDSA host key: [  OK  ]
 9月 04 18:32:28 myhost sshd-keygen[2417]: Generating SSH2 ED25519 host key: [  OK  ]
 9月 04 18:32:28 myhost systemd[1]: Started OpenSSH Server Key Generation.

今回は sshd-keygen.service を restart したけど、sshd.service は sshd-keygen.service に依存しているので systemctl restart sshd.service しても再生成されるのを確認した。 ので、普通は sshd.service を restart すればいい。

ちなみに sshd は restart しても既存の接続が切れることはない。詳しくは以下の記事を参照。

equj65.net