Refactorized generation of OpenSSH host keys with a new systemd unit.

This commit is contained in:
Marcin Engelmann 2018-01-11 17:31:08 +01:00
parent fe0f8eba5b
commit d640311ab6
5 changed files with 102 additions and 32 deletions

View file

@ -1,36 +1,14 @@
#!/bin/sh #!/bin/sh
### BEGIN INIT INFO # Kept for backward compatibility. OpenSSH Host Keys are generated
# Provides: generate-ssh-hostkeys # by "ssh-generate-hostkeys.service" systemd unit or "ssh-generate-hostkeys"
# Required-Start: $local_fs # sysvinit script (#431).
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Description: Generate ssh host keys if they do not exist
### END INIT INFO
prog=$(basename $0) set -eu
logger="logger -t $prog"
rsa_key="/etc/ssh/ssh_host_rsa_key" if [ -z "${1+x}" ] || [ -z "$1" ]; then
ecdsa_key="/etc/ssh/ssh_host_ecdsa_key" PAR="start"
ed25519_key="/etc/ssh/ssh_host_ed25519_key" else
PAR="$1"
# Exit if the hostkeys already exist
if [ -f $rsa_key -a -f $ecdsa_key -a -f $ed25519_key ]; then
exit
fi fi
# Generate the ssh host keys exec /etc/init.d/ssh-generate-hostkeys "$PAR"
[ -f $rsa_key ] || ssh-keygen -f $rsa_key -t rsa -C 'host' -N ''
[ -f $ecdsa_key ] || ssh-keygen -f $ecdsa_key -t ecdsa -C 'host' -N ''
[ -f $ed25519_key ] || ssh-keygen -f $ed25519_key -t ed25519 -C 'host' -N ''
# Output the public keys to the console
# This allows user to get host keys securely through console log
echo "-----BEGIN SSH HOST KEY FINGERPRINTS-----" | $logger
ssh-keygen -l -f $rsa_key.pub | $logger
ssh-keygen -l -f $ecdsa_key.pub | $logger
ssh-keygen -l -f $ed25519_key.pub | $logger
echo "------END SSH HOST KEY FINGERPRINTS------" | $logger

View file

@ -0,0 +1,36 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: ssh-generate-hostkeys
# Required-Start: $local_fs $syslog
# Required-Stop:
# X-Start-Before: ssh
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Generate ssh host keys if they do not exist
# Description: Generate ssh host keys if they do not exist.
# This is part of bootstrap-vz: http://github.com/andsens/bootstrap-vz
# See https://github.com/andsens/bootstrap-vz/blob/master/LICENSE for
# legal notices and disclaimers.
### END INIT INFO
set -e
DAEMON=/usr/local/sbin/ssh-generate-hostkeys
[ -x "$DAEMON" ] || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
$DAEMON
exit $?
;;
stop|restart|reload|force-reload|status)
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
exit 1
esac
exit 0

View file

@ -0,0 +1,19 @@
#!/bin/sh
set -eu
prog="$(basename $0)"
logger="logger -t ${prog}"
# Output the public keys to the console.
# This allows user to get host keys securely through console log.
echo "-----BEGIN SSH HOST KEY FINGERPRINTS-----" | ${logger}
for key in ecdsa ed25519 rsa; do
keyfile="/etc/ssh/ssh_host_${key}_key"
if [ ! -f "${keyfile}" ]; then
/usr/bin/ssh-keygen -f "${keyfile}" -t "${key}" -C 'host' -N ''
fi
/usr/bin/ssh-keygen -l -f "${keyfile}.pub" | ${logger}
done
echo "------END SSH HOST KEY FINGERPRINTS------" | ${logger}

View file

@ -0,0 +1,13 @@
[Unit]
Description=OpenBSD Secure Shell server Host Key Generation
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ecdsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ed25519_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_rsa_key
Before=ssh.service
[Service]
ExecStart=/usr/local/sbin/ssh-generate-hostkeys
Type=oneshot
[Install]
WantedBy=multi-user.target

View file

@ -4,6 +4,7 @@ from ..tools import log_check_call
import os.path import os.path
from . import assets from . import assets
import initd import initd
import shutil
class AddOpenSSHPackage(Task): class AddOpenSSHPackage(Task):
@ -23,6 +24,7 @@ class AddSSHKeyGeneration(Task):
@classmethod @classmethod
def run(cls, info): def run(cls, info):
init_scripts_dir = os.path.join(assets, 'init.d') init_scripts_dir = os.path.join(assets, 'init.d')
systemd_dir = os.path.join(assets, 'systemd')
install = info.initd['install'] install = info.initd['install']
from subprocess import CalledProcessError from subprocess import CalledProcessError
try: try:
@ -38,7 +40,29 @@ class AddSSHKeyGeneration(Task):
elif info.manifest.release == jessie: elif info.manifest.release == jessie:
install['generate-ssh-hostkeys'] = os.path.join(init_scripts_dir, 'jessie/generate-ssh-hostkeys') install['generate-ssh-hostkeys'] = os.path.join(init_scripts_dir, 'jessie/generate-ssh-hostkeys')
else: else:
install['generate-ssh-hostkeys'] = os.path.join(init_scripts_dir, 'generate-ssh-hostkeys') install['ssh-generate-hostkeys'] = os.path.join(init_scripts_dir, 'ssh-generate-hostkeys')
ssh_keygen_host_service = os.path.join(systemd_dir, 'ssh-generate-hostkeys.service')
ssh_keygen_host_service_dest = os.path.join(info.root, 'etc/systemd/system/ssh-generate-hostkeys.service')
ssh_keygen_host_initscript = os.path.join(init_scripts_dir, 'generate-ssh-hostkeys')
ssh_keygen_host_initscript_dest = os.path.join(info.root, 'etc/init.d/generate-ssh-hostkeys')
ssh_keygen_host_script = os.path.join(assets, 'ssh-generate-hostkeys')
ssh_keygen_host_script_dest = os.path.join(info.root, 'usr/local/sbin/ssh-generate-hostkeys')
# Copy files over
shutil.copy(ssh_keygen_host_service, ssh_keygen_host_service_dest)
shutil.copy(ssh_keygen_host_initscript, ssh_keygen_host_initscript_dest)
os.chmod(ssh_keygen_host_initscript_dest, 0755)
shutil.copy(ssh_keygen_host_script, ssh_keygen_host_script_dest)
os.chmod(ssh_keygen_host_script_dest, 0750)
# Enable systemd service
log_check_call(['chroot', info.root, 'systemctl', 'enable', 'ssh-generate-hostkeys.service'])
except CalledProcessError: except CalledProcessError:
import logging import logging
logging.getLogger(__name__).warn('The OpenSSH server has not been installed, ' logging.getLogger(__name__).warn('The OpenSSH server has not been installed, '