systemd: Add unit to auto reload sshd after renew
dustin/sshca-cli/pipeline/head This commit looks good Details

`sshd` no longer appears to automatically pick up the new certificate
after it has been renewed by `ssh-host-cert-sign@.service`; we need to
explicitly reload it.  To handle this, I've added a systemd _path_ unit
that monitors the certificate files for changes and triggers a
corresponding _service_ unit that reloads the SSH daemon.
dev/auto-reload
Dustin 2025-09-12 07:16:02 -05:00
parent 730448c79d
commit 9dc20b4fd4
3 changed files with 43 additions and 4 deletions

11
reload-ssh-cert.path Normal file
View File

@ -0,0 +1,11 @@
[Unit]
Description=Watch SSH Host certificates for renewal
After=sshd.service
[Path]
PathChanged=/etc/ssh/ssh_host_rsa_key-cert.pub
PathChanged=/etc/ssh/ssh_host_ecdsa_key-cert.pub
PathChanged=/etc/ssh/ssh_host_ed25519-cert.pub
[Install]
WantedBy=paths.target

24
reload-ssh-cert.service Normal file
View File

@ -0,0 +1,24 @@
[Unit]
Description=Reload SSH daemon when certificate is renewed
After=sshd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl reload sshd
CapabilityBoundingSet=
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateDevices=true
PrivateTmp=true
ProtectHostname=true
ProtectClock=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=yes
RestrictAddressFamilies=AF_UNIX
LockPersonality=true
MemoryDenyWriteExecute=true
RestrictRealtime=true
RestrictSUIDSGID=true

View File

@ -8,7 +8,7 @@
Name: sshca-cli Name: sshca-cli
Version: 0.1.1 Version: 0.1.1
Release: 1%{?dist} Release: 2%{?dist}
Summary: CLI client for SSHCA Summary: CLI client for SSHCA
SourceLicense: MIT OR Apache-2.0 SourceLicense: MIT OR Apache-2.0
@ -22,6 +22,8 @@ Source: ssh-host-cert-sign@.service
Source: ssh-host-certs.target Source: ssh-host-certs.target
Source: ssh-host-certs-renew.target Source: ssh-host-certs-renew.target
Source: ssh-host-certs-renew.timer Source: ssh-host-certs-renew.timer
Source: reload-ssh-cert.path
Source: reload-ssh-cert.service
ExclusiveArch: %{rust_arches} ExclusiveArch: %{rust_arches}
@ -62,6 +64,8 @@ install -m u=rw,go=r \
%{SOURCE3} \ %{SOURCE3} \
%{SOURCE4} \ %{SOURCE4} \
%{SOURCE5} \ %{SOURCE5} \
%{SOURCE6} \
%{SOURCE7} \
$RPM_BUILD_ROOT%{_unitdir} $RPM_BUILD_ROOT%{_unitdir}
%if %{with check} %if %{with check}
@ -70,13 +74,13 @@ install -m u=rw,go=r \
%endif %endif
%post systemd %post systemd
%systemd_post ssh-host-certs.target ssh-host-certs-renew.timer %systemd_post ssh-host-certs.target ssh-host-certs-renew.timer reload-ssh-cert.path
%preun systemd %preun systemd
%systemd_preun ssh-host-certs.target ssh-host-certs-renew.timer %systemd_preun ssh-host-certs.target ssh-host-certs-renew.timer reload-ssh-cert.path
%postun systemd %postun systemd
%systemd_postun ssh-host-certs.target ssh-host-certs-renew.timer %systemd_postun ssh-host-certs.target ssh-host-certs-renew.timer reload-ssh-cert.path
%files %files
%license LICENSE-Apache-2.0.txt %license LICENSE-Apache-2.0.txt