From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-f54.google.com (mail-it0-f54.google.com [209.85.214.54]) by mail.openembedded.org (Postfix) with ESMTP id 49A427820B for ; Fri, 26 May 2017 01:52:11 +0000 (UTC) Received: by mail-it0-f54.google.com with SMTP id r63so1733506itc.1 for ; Thu, 25 May 2017 18:52:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kOaBbFWvI1lVmV6DUYdSsad3b5/IVl+6VA7qObNcJgA=; b=cxR7uzGkog/5XNX087OSAjXzm+LFGmbNWwBfJ5C9yVuqvs2jnbYYNqA+LBZx4BUSYi Ag472cewcFzEkOgX2dyvbIbQHRzQJrVE+olDzx38wg7bRZdMiv7Yr30My62e1O8lC5yh DY9+eT3P1Qm/Cpx0WIxYwo+8jcfu+4Wj8RkNQsccmNRUPskj2VfW7gpL+yI8jhLS7mNP 6AfNusVaNcqCvHxB57vdc2duL4L7Z3c1GypWN7t1WX77dy+ctUb6dHdnvAVlg9gax97S 3jRY2OOS0/yQmkHH0SHdYSVtPe7Q3qdPUoB7wYV8IqfOqBnO/fPc70xlmI80aUk2JF3e hVZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kOaBbFWvI1lVmV6DUYdSsad3b5/IVl+6VA7qObNcJgA=; b=KZGNThfMiUxwAOTaj5hzb77KE7grkxqp4CD5Mgs5F1mutrPuiKsqtmaX09qZQJBDUO FF/IvmmijUnzB0Bk2oSU1o6fpANrhTPbh4tF02/xzCRxjzK7BMQxEbXSaT5y6USPuTlz rFSbmEffrpBvrRXcZjZZXsPW6lie39hetKBeyqmBGcjH4gwsAaWETG2LWC6goTQ3WCDb eauYF0vc3XR5bbQotNXR5gZ8sIvMnat0iMqcDG2RgZtEpnVuR9iRSbtlL8HEx5sk8c8H D7j+hUJfiX5Xjq2jqkWh3UuebwUlWlqoka72mrLPPYL3p1Y2YwYFBkap/8likrM0Tbpx EjaQ== X-Gm-Message-State: AODbwcD3L7GcAHnCi64vQ5iiRdmzwRR5JYhJJIbh4Dzkq74sXjGdC3F6 gUjctl/zGaZHAd9ZodU= X-Received: by 10.36.115.1 with SMTP id y1mr586948itb.117.1495763532275; Thu, 25 May 2017 18:52:12 -0700 (PDT) Received: from localhost.localdomain ([2605:a601:a83:3700:10fb:b4c1:2c33:798c]) by smtp.gmail.com with ESMTPSA id e34sm3769054iod.18.2017.05.25.18.52.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 May 2017 18:52:11 -0700 (PDT) From: Joshua Watt X-Google-Original-From: Joshua Watt To: openembedded-core@lists.openembedded.org Date: Thu, 25 May 2017 20:52:02 -0500 Message-Id: <20170526015202.13469-1-JPEWhacker@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: Subject: [meta-oe][PATCH v4] openssh: Atomically generate host keys X-BeenThere: openembedded-core@lists.openembedded.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Patches and discussions about the oe-core layer List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 May 2017 01:52:13 -0000 Generating the host keys atomically prevents power interruptions during the first boot from leaving the key files incomplete, which often prevents users from being able to ssh into the device. --- meta/recipes-connectivity/openssh/openssh/init | 22 +++---------- .../openssh/openssh/sshd-check-key | 36 ++++++++++++++++++++++ .../openssh/openssh/sshdgenkeys.service | 25 +++++++-------- meta/recipes-connectivity/openssh/openssh_7.5p1.bb | 9 ++++++ 4 files changed, 63 insertions(+), 29 deletions(-) create mode 100644 meta/recipes-connectivity/openssh/openssh/sshd-check-key diff --git a/meta/recipes-connectivity/openssh/openssh/init b/meta/recipes-connectivity/openssh/openssh/init index 1f63725..e02c479 100644 --- a/meta/recipes-connectivity/openssh/openssh/init +++ b/meta/recipes-connectivity/openssh/openssh/init @@ -45,23 +45,11 @@ check_config() { } check_keys() { - # create keys if necessary - if [ ! -f $HOST_KEY_RSA ]; then - echo " generating ssh RSA key..." - ssh-keygen -q -f $HOST_KEY_RSA -N '' -t rsa - fi - if [ ! -f $HOST_KEY_ECDSA ]; then - echo " generating ssh ECDSA key..." - ssh-keygen -q -f $HOST_KEY_ECDSA -N '' -t ecdsa - fi - if [ ! -f $HOST_KEY_DSA ]; then - echo " generating ssh DSA key..." - ssh-keygen -q -f $HOST_KEY_DSA -N '' -t dsa - fi - if [ ! -f $HOST_KEY_ED25519 ]; then - echo " generating ssh ED25519 key..." - ssh-keygen -q -f $HOST_KEY_ED25519 -N '' -t ed25519 - fi + @LIBEXECDIR@/sshd-check-key $HOST_KEY_RSA rsa + @LIBEXECDIR@/sshd-check-key $HOST_KEY_ECDSA ecdsa + @LIBEXECDIR@/sshd-check-key $HOST_KEY_DSA dsa + @LIBEXECDIR@/sshd-check-key $HOST_KEY_ED25519 ed25519 + @BASE_BINDIR@/sync } export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" diff --git a/meta/recipes-connectivity/openssh/openssh/sshd-check-key b/meta/recipes-connectivity/openssh/openssh/sshd-check-key new file mode 100644 index 0000000..d2613af --- /dev/null +++ b/meta/recipes-connectivity/openssh/openssh/sshd-check-key @@ -0,0 +1,36 @@ +#! /bin/sh +set -e + +NAME="$1" +TYPE="$2" + +if [ -z "$NAME" ] || [ -z "$TYPE" ]; then + echo "Usage: $0 NAME TYPE" + exit 1; +fi + +DIR="$(dirname "$NAME")" + +if [ ! -f "$NAME" ]; then + echo " generating ssh $TYPE key..." + ssh-keygen -q -f "${NAME}.tmp" -N '' -t $TYPE + + # Move (Atomically rename) files + mv -f "${NAME}.tmp.pub" "${NAME}.pub" + + # This sync does double duty: Ensuring that the data in the temporary + # private key file is on disk before the rename, and ensuring that the + # public key rename is completed before the private key rename, since we + # switch on the existence of the private key to trigger key generation. + # This does mean it is possible for the public key to exist, but be garbage + # but this is OK because in that case the private key won't exist and the + # keys will be regenerated. + # + # In the event that sync understands arguments that limit what it tries to + # fsync(), we provided them. If it does not, it will simply call sync() + # which is just as well + sync "${NAME}.pub" "$DIR" "${NAME}.tmp" + + mv -f "${NAME}.tmp" "${NAME}" +fi + diff --git a/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service b/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service index 148e6ad..23fd351 100644 --- a/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service +++ b/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service @@ -1,22 +1,23 @@ [Unit] Description=OpenSSH Key Generation RequiresMountsFor=/var /run -ConditionPathExists=!/var/run/ssh/ssh_host_rsa_key -ConditionPathExists=!/var/run/ssh/ssh_host_dsa_key -ConditionPathExists=!/var/run/ssh/ssh_host_ecdsa_key -ConditionPathExists=!/var/run/ssh/ssh_host_ed25519_key -ConditionPathExists=!/etc/ssh/ssh_host_rsa_key -ConditionPathExists=!/etc/ssh/ssh_host_dsa_key -ConditionPathExists=!/etc/ssh/ssh_host_ecdsa_key -ConditionPathExists=!/etc/ssh/ssh_host_ed25519_key +ConditionPathExists=|!/var/run/ssh/ssh_host_rsa_key +ConditionPathExists=|!/var/run/ssh/ssh_host_dsa_key +ConditionPathExists=|!/var/run/ssh/ssh_host_ecdsa_key +ConditionPathExists=|!/var/run/ssh/ssh_host_ed25519_key +ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key +ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key +ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key +ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key [Service] Environment="SYSCONFDIR=/etc/ssh" EnvironmentFile=-/etc/default/ssh ExecStart=@BASE_BINDIR@/mkdir -p $SYSCONFDIR -ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_rsa_key -N '' -t rsa -ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_dsa_key -N '' -t dsa -ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_ecdsa_key -N '' -t ecdsa -ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_ed25519_key -N '' -t ed25519 +ExecStart=@LIBEXECDIR@/sshd-check-key ${SYSCONFDIR}/ssh_host_rsa_key rsa +ExecStart=@LIBEXECDIR@/sshd-check-key ${SYSCONFDIR}/ssh_host_dsa_key dsa +ExecStart=@LIBEXECDIR@/sshd-check-key ${SYSCONFDIR}/ssh_host_ecdsa_key ecdsa +ExecStart=@LIBEXECDIR@/sshd-check-key ${SYSCONFDIR}/ssh_host_ed25519_key ed25519 +ExecStart=@BASE_BINDIR@/sync Type=oneshot RemainAfterExit=yes diff --git a/meta/recipes-connectivity/openssh/openssh_7.5p1.bb b/meta/recipes-connectivity/openssh/openssh_7.5p1.bb index 5b96745..c1fcda4 100644 --- a/meta/recipes-connectivity/openssh/openssh_7.5p1.bb +++ b/meta/recipes-connectivity/openssh/openssh_7.5p1.bb @@ -25,6 +25,7 @@ SRC_URI = "http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar file://openssh-7.1p1-conditional-compile-des-in-cipher.patch \ file://openssh-7.1p1-conditional-compile-des-in-pkcs11.patch \ file://fix-potential-signed-overflow-in-pointer-arithmatic.patch \ + file://sshd-check-key \ " PAM_SRC_URI = "file://sshd" @@ -124,7 +125,15 @@ do_install_append () { sed -i -e 's,@BASE_BINDIR@,${base_bindir},g' \ -e 's,@SBINDIR@,${sbindir},g' \ -e 's,@BINDIR@,${bindir},g' \ + -e 's,@LIBEXECDIR@,${libexecdir}/${BPN},g' \ ${D}${systemd_unitdir}/system/sshd.socket ${D}${systemd_unitdir}/system/*.service + + sed -i -e 's,@LIBEXECDIR@,${libexecdir}/${BPN},g' \ + -e 's,@BASE_BINDIR@,${base_bindir},g' \ + ${D}${sysconfdir}/init.d/sshd + + install -d ${D}${libexecdir}/${BPN} + install -m 0755 ${WORKDIR}/sshd-check-key ${D}${libexecdir}/${BPN} } do_install_ptest () { -- 2.9.3