From ed52814c776963efdcc9dcda1ec26fc09930ef93 Mon Sep 17 00:00:00 2001 From: Bogdan Purcareata Date: Wed, 22 Apr 2015 14:53:32 +0000 Subject: [PATCH] lxc-busybox: add OpenSSH support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an additional template parameter for SSH support in the container. Currently this can be implemented using the Dropbear or OpenSSH utility. The respective tool needs to be available on the host Linux. If the parameter is omitted, the template will look for the Dropbear utility on the host and install it if it is available (legacy behavior). Adding OpenSSH support has been done following the model in the lxc-sshd template. Upstream-status: Accepted [https://github.com/lxc/lxc/commit/ed52814c776963efdcc9dcda1ec26fc09930ef93] Signed-off-by: Bogdan Purcareata Acked-by: Stéphane Graber --- templates/lxc-busybox.in | 169 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 139 insertions(+), 30 deletions(-) diff --git a/templates/lxc-busybox.in b/templates/lxc-busybox.in index 7e05bd6..95961a3 100644 --- a/templates/lxc-busybox.in +++ b/templates/lxc-busybox.in @@ -22,6 +22,7 @@ LXC_MAPPED_UID= LXC_MAPPED_GID= +SSH= # Make sure the usual locations are in PATH export PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin @@ -160,6 +161,116 @@ EOF return $res } +install_dropbear() +{ + # copy dropbear binary + cp $(which dropbear) $rootfs/usr/sbin + if [ $? -ne 0 ]; then + echo "Failed to copy dropbear in the rootfs" + return 1 + fi + + # make symlinks to various ssh utilities + utils="\ + $rootfs/usr/bin/dbclient \ + $rootfs/usr/bin/scp \ + $rootfs/usr/bin/ssh \ + $rootfs/usr/sbin/dropbearkey \ + $rootfs/usr/sbin/dropbearconvert \ + " + echo $utils | xargs -n1 ln -s /usr/sbin/dropbear + + # add necessary config files + mkdir $rootfs/etc/dropbear + dropbearkey -t rsa -f $rootfs/etc/dropbear/dropbear_rsa_host_key > /dev/null 2>&1 + dropbearkey -t dss -f $rootfs/etc/dropbear/dropbear_dss_host_key > /dev/null 2>&1 + + echo "'dropbear' ssh utility installed" + + return 0 +} + +install_openssh() +{ + # tools to be installed + server_utils="sshd" + client_utils="\ + ssh \ + scp \ + sftp \ + ssh-add \ + ssh-agent \ + ssh-keygen \ + ssh-keyscan \ + ssh-argv0 \ + ssh-copy-id \ + " + + # new folders used by ssh + ssh_tree="\ +$rootfs/etc/ssh \ +$rootfs/var/empty/sshd \ +$rootfs/var/lib/empty/sshd \ +$rootfs/var/run/sshd \ +" + + # create folder structure + mkdir -p $ssh_tree + if [ $? -ne 0 ]; then + return 1 + fi + + # copy binaries + for bin in $server_utils $client_utils; do + tool_path=`which $bin` + cp $tool_path $rootfs/$tool_path + if [ $? -ne 0 ]; then + echo "Unable to copy $tool_path in the rootfs" + return 1 + fi + done + + # add user and group + cat <> $rootfs/etc/passwd +sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin +EOF + + cat <> $rootfs/etc/group +sshd:x:74: +EOF + + # generate container keys + ssh-keygen -t rsa -N "" -f $rootfs/etc/ssh/ssh_host_rsa_key >/dev/null 2>&1 + ssh-keygen -t dsa -N "" -f $rootfs/etc/ssh/ssh_host_dsa_key >/dev/null 2>&1 + + # by default setup root password with no password + cat < $rootfs/etc/ssh/sshd_config +Port 22 +Protocol 2 +HostKey /etc/ssh/ssh_host_rsa_key +HostKey /etc/ssh/ssh_host_dsa_key +UsePrivilegeSeparation yes +KeyRegenerationInterval 3600 +ServerKeyBits 768 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords yes +ChallengeResponseAuthentication no +EOF + + echo "'OpenSSH' utility installed" + + return 0 +} + configure_busybox() { rootfs=$1 @@ -230,34 +341,6 @@ EOF lxc-unshare -s MOUNT -- /bin/sh < $CHPASSWD_FILE rm $CHPASSWD_FILE - # add ssh functionality if dropbear package available on host - which dropbear >/dev/null 2>&1 - if [ $? -eq 0 ]; then - # copy dropbear binary - cp $(which dropbear) $rootfs/usr/sbin - if [ $? -ne 0 ]; then - echo "Failed to copy dropbear in the rootfs" - return 1 - fi - - # make symlinks to various ssh utilities - utils="\ - $rootfs/usr/bin/dbclient \ - $rootfs/usr/bin/scp \ - $rootfs/usr/bin/ssh \ - $rootfs/usr/sbin/dropbearkey \ - $rootfs/usr/sbin/dropbearconvert \ - " - echo $utils | xargs -n1 ln -s /usr/sbin/dropbear - - # add necessary config files - mkdir $rootfs/etc/dropbear - dropbearkey -t rsa -f $rootfs/etc/dropbear/dropbear_rsa_host_key > /dev/null 2>&1 - dropbearkey -t dss -f $rootfs/etc/dropbear/dropbear_dss_host_key > /dev/null 2>&1 - - echo "'dropbear' ssh utility installed" - fi - return 0 } @@ -315,12 +398,12 @@ remap_userns() usage() { cat < +$1 -h|--help -p|--path= -s|--ssh={dropbear,openssh} EOF return 0 } -options=$(getopt -o hp:n: -l help,rootfs:,path:,name:,mapped-uid:,mapped-gid: -- "$@") +options=$(getopt -o hp:n:s: -l help,rootfs:,path:,name:,mapped-uid:,mapped-gid:,ssh: -- "$@") if [ $? -ne 0 ]; then usage $(basename $0) exit 1 @@ -336,6 +419,7 @@ do -n|--name) name=$2; shift 2;; --mapped-uid) LXC_MAPPED_UID=$2; shift 2;; --mapped-gid) LXC_MAPPED_GID=$2; shift 2;; + -s|--ssh) SSH=$2; shift 2;; --) shift 1; break ;; *) break ;; esac @@ -384,3 +468,28 @@ if [ $? -ne 0 ]; then echo "failed to remap files to user" exit 1 fi + +if [ -n "$SSH" ]; then + case "$SSH" in + "dropbear") + install_dropbear + if [ $? -ne 0 ]; then + echo "Unable to install 'dropbear' ssh utility" + exit 1 + fi ;; + "openssh") + install_openssh + if [ $? -ne 0 ]; then + echo "Unable to install 'OpenSSH' utility" + exit 1 + fi ;; + *) + echo "$SSH: unrecognized ssh utility" + exit 1 + esac +else + which dropbear >/dev/null 2>&1 + if [ $? -eq 0 ]; then + install_dropbear + fi +fi -- 2.1.4