aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-10-18 15:38:26 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-10-18 18:55:38 +0200
commit9ab9dd54247fba00f1d7644ff7ee82ef59bf8157 (patch)
tree7cb3f30d5a02716ec7f3f2a38e72cc44848b61f0
parented25e33899cb55377b1bc1f4f47625889bb52fa7 (diff)
naskpass initramfs script fixup
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rwxr-xr-xdebian/naskpass.postinst15
-rwxr-xr-xdebian/naskpass.prerm3
-rwxr-xr-xdebian/rules14
-rw-r--r--debian/templates11
-rwxr-xr-xscripts/naskconf35
-rwxr-xr-xscripts/naskpass.initconf5
-rwxr-xr-xscripts/naskpass.post16
-rwxr-xr-xscripts/naskpass.pre15
-rwxr-xr-xscripts/naskpass_debian.inithook (renamed from scripts/naskpass.inithook)12
-rwxr-xr-xscripts/naskpass_debian.initscript (renamed from scripts/naskpass.initscript)137
10 files changed, 68 insertions, 195 deletions
diff --git a/debian/naskpass.postinst b/debian/naskpass.postinst
index 255bfd0..025c25d 100755
--- a/debian/naskpass.postinst
+++ b/debian/naskpass.postinst
@@ -6,25 +6,10 @@
set -e
. /usr/share/debconf/confmodule
-. /usr/share/naskpass/naskconf
case "$1" in
configure)
- nask_update
- db_input high naskpass/activate || true
- db_go
- db_get naskpass/activate
- if [ "x$RET" = "xtrue" ]; then
- nask_activate || true
- if [ "x${ERRMSG}" != "x" ]; then
- echo "* ${ERRMSG}" >&2
- nask_deactivate
- false
- fi
- else
- nask_deactivate
- fi
if [ -x /usr/bin/ssh-keygen ]; then
[ -r /etc/initramfs-tools/etc/ssh/ssh_host_rsa_key ] || /usr/bin/ssh-keygen -t rsa -N '' -b 4096 -f /etc/initramfs-tools/etc/ssh/ssh_host_rsa_key
[ -r /etc/initramfs-tools/etc/ssh/ssh_host_dsa_key ] || /usr/bin/ssh-keygen -t dsa -N '' -b 1024 -f /etc/initramfs-tools/etc/ssh/ssh_host_dsa_key
diff --git a/debian/naskpass.prerm b/debian/naskpass.prerm
index 47beafb..86d693d 100755
--- a/debian/naskpass.prerm
+++ b/debian/naskpass.prerm
@@ -7,12 +7,9 @@ set -e
. /usr/share/debconf/confmodule
-. /usr/share/naskpass/naskconf
case "$1" in
remove)
- nask_deactivate
- db_purge
update-initramfs -u
;;
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
diff --git a/debian/rules b/debian/rules
index 2cf220c..f26c7d3 100755
--- a/debian/rules
+++ b/debian/rules
@@ -45,15 +45,11 @@ install: build
dh_installchangelogs
dh_installdebconf
$(MAKE) install-strip prefix=$(CURDIR)/debian/naskpass
- install -d -m755 $(CURDIR)/debian/naskpass/usr/share/naskpass
- install -D -m755 ./scripts/naskconf $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -D -m755 ./scripts/naskpass.inithook $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -D -m755 ./scripts/naskpass.initscript $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -D -m755 ./scripts/naskpass.initconf $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -D -m755 ./scripts/naskpass.pre $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -D -m755 ./scripts/naskpass.post $(CURDIR)/debian/naskpass/usr/share/naskpass/
- install -d -m755 $(CURDIR)/debian/naskpass/etc/initramfs-tools/etc/ssh/
- install -D -m644 ./scripts/sshd_config $(CURDIR)/debian/naskpass/etc/initramfs-tools/etc/ssh/
+ install -d -m755 $(CURDIR)/debian/naskpass/usr/share/initramfs-tools/scripts/local-top
+ install -D -m755 ./scripts/naskpass_debian.inithook $(CURDIR)/debian/naskpass/usr/share/initramfs-tools/hooks/naskpass
+ install -D -m755 ./scripts/naskpass_debian.initscript $(CURDIR)/debian/naskpass/usr/share/initramfs-tools/scripts/local-top/naskpass
+ install -d -m755 $(CURDIR)/debian/naskpass/etc/initramfs-tools/etc/ssh/
+ install -D -m644 ./scripts/sshd_config $(CURDIR)/debian/naskpass/etc/initramfs-tools/etc/ssh/
binary-indep: build install
diff --git a/debian/templates b/debian/templates
deleted file mode 100644
index 7e664ab..0000000
--- a/debian/templates
+++ /dev/null
@@ -1,11 +0,0 @@
-Template: naskpass/activate
-Type: boolean
-Default: false
-Description.UTF-8: Do you want to activate naskpass?
- Activate or Deactivate the naskpass initramfs replacement
- for askpass. You can activate/deactivate it later with
- 'dpkg-reconfigure naskpass'.
-
-Template: naskpass/active
-Type: boolean
-Default: false
diff --git a/scripts/naskconf b/scripts/naskconf
deleted file mode 100755
index 5f82f22..0000000
--- a/scripts/naskconf
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/sh
-
-export ORGCHKSM="2057abcd4c0038fb3357680ac3057b208672d5d81bca85e1cc668f17d4060a23bda4c34352682b289d17a18f6ab75c4b9ea9df1a9f85709e3042ff7fdc83e245"
-export ORGFILE="/usr/share/initramfs-tools/scripts/local-top/cryptroot"
-
-
-. /usr/share/debconf/confmodule
-
-_nask_cmd () {
- db_get naskpass/active
- if [ "x$1" = "xACTV" ] && [ "$RET" = "false" ]; then
- if [ "${ORGCHKSM}" != "$(/usr/bin/sha512sum ${ORGFILE} | grep -Eo '^[0-9a-zA-Z]*')" ]; then
- export ERRMSG="$0: sha512sum mismatch"
- return 1
- fi
- dpkg-divert --package naskpass --add --rename --divert /var/backups/cryptroot.initramfs.bak ${ORGFILE}
- cp /usr/share/naskpass/naskpass.initscript ${ORGFILE}
- ln -s /usr/share/naskpass/naskpass.inithook \
- /usr/share/initramfs-tools/hooks/naskpass
- db_set naskpass/active true
- elif [ "x$1" = "xDCTV" ] && [ "$RET" = "true" ]; then
- rm ${ORGFILE}
- rm /usr/share/initramfs-tools/hooks/naskpass
- dpkg-divert --package naskpass --rename --remove ${ORGFILE}
- db_set naskpass/active false
- elif [ "x$1" = "xUPDT" ] && [ "$RET" = "true" ]; then
- cp /usr/share/naskpass/naskpass.initscript ${ORGFILE}
- fi
- return 0
-}
-
-nask_activate () { _nask_cmd "ACTV"; return $?; }
-nask_deactivate () { _nask_cmd "DCTV"; return $?; }
-nask_update () { _nask_cmd "UPDT"; return $?; }
-
diff --git a/scripts/naskpass.initconf b/scripts/naskpass.initconf
deleted file mode 100755
index fa1f945..0000000
--- a/scripts/naskpass.initconf
+++ /dev/null
@@ -1,5 +0,0 @@
-# initramfs naskpass config file
-
-# kernel printk path
-PRINTK=/proc/sys/kernel/printk
-OLDPRINTK=/tmp/naskpass.oldprintk
diff --git a/scripts/naskpass.post b/scripts/naskpass.post
deleted file mode 100755
index a38e1c5..0000000
--- a/scripts/naskpass.post
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-
-. /etc/naskpass.conf
-
-if [ "x${OLDPRINTK}" != "x" ] && [ -r ${OLDPRINTK} ] && [ -w ${PRINTK} ]; then
- cat ${OLDPRINTK} >${PRINTK}
-fi
-
-kill $(pidof sshd)
-
-for interface in $(ifconfig | grep -oE '^[a-zA-Z0-9]+\s+'); do
- echo "disable ${interface}"
- ifconfig ${interface} 0.0.0.0
- ifconfig ${interface} down
-done
-
diff --git a/scripts/naskpass.pre b/scripts/naskpass.pre
deleted file mode 100755
index 4eb6d3b..0000000
--- a/scripts/naskpass.pre
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-. /scripts/functions
-. /etc/naskpass.conf
-
-
-if [ "x${PRINTK}" != "x" ] && [ -r ${PRINTK} ] && [ -w ${PRINTK} ]; then
- cat ${PRINTK} >${OLDPRINTK}
- echo "0 0 0 0" >${PRINTK}
-fi
-
-if [ -x /sbin/sshd ]; then
-[ -x /bin/ipconfig ] && configure_networking >/dev/null 2>/dev/null &
-/sbin/sshd
-fi
diff --git a/scripts/naskpass.inithook b/scripts/naskpass_debian.inithook
index 9f7eaf5..d45a142 100755
--- a/scripts/naskpass.inithook
+++ b/scripts/naskpass_debian.inithook
@@ -16,23 +16,23 @@ esac
. /usr/share/initramfs-tools/hook-functions
+# copy executables
copy_exec /lib/cryptsetup/naskpass /lib/cryptsetup
copy_exec /lib/cryptsetup/naskshell /bin
copy_exec /lib/cryptsetup/naskpass_check /lib/cryptsetup
-copy_exec /usr/share/naskpass/naskpass.pre /lib/cryptsetup
-copy_exec /usr/share/naskpass/naskpass.post /lib/cryptsetup
-dash -n /usr/share/naskpass/naskpass.initconf
-copy_exec /usr/share/naskpass/naskpass.initconf /etc/naskpass.conf
-
copy_exec /usr/sbin/sshd /sbin/sshd
+
+# OpenSSH config directory
cp -R /etc/initramfs-tools/etc/ssh "${DESTDIR}/etc/"
+# /root is required for a successful SSH login
if [ ! -r "${DESTDIR}/root" ]; then
mkdir -p "${DESTDIR}/root"
chown root:root "${DESTDIR}/root"
chmod 0700 "${DESTDIR}/root"
fi
+# libnss and nsswitch are required for a successful SSH login
copy_exec /usr/lib/$(dpkg-architecture -q DEB_HOST_MULTIARCH)/libnss_compat.so /usr/lib/$(dpkg-architecture -q DEB_HOST_MULTIARCH)/
if [ -r "${DESTDIR}/etc/nsswitch.conf" ]; then
echo "passwd: compat" > "${DESTDIR}/etc/nsswitch.conf"
@@ -40,10 +40,12 @@ echo "group: compat" >>"${DESTDIR}/etc/nsswitch.conf"
echo "shadow: compat" >>"${DESTDIR}/etc/nsswitch.conf"
fi
+# passwd, group, shadow entries to enable root with naskshell login
[ -r "${DESTDIR}/etc/passwd" ] || echo 'root:x:0:0:root:/root:/bin/naskshell' >"${DESTDIR}/etc/passwd"
[ -r "${DESTDIR}/etc/group" ] || echo 'root:x:0:' >"${DESTDIR}/etc/group"
[ -r "${DESTDIR}/etc/shadow" ] || echo 'root:*:15446:0:99999:7:::' >"${DESTDIR}/etc/shadow"
+# terminfo is viable for ncurses programs
mkdir -p ${DESTDIR}/lib/terminfo/l
cp /lib/terminfo/l/linux ${DESTDIR}/lib/terminfo/l/
diff --git a/scripts/naskpass.initscript b/scripts/naskpass_debian.initscript
index b92381f..3cffd4f 100755
--- a/scripts/naskpass.initscript
+++ b/scripts/naskpass_debian.initscript
@@ -7,13 +7,7 @@ PREREQ="cryptroot-prepare"
#
prereqs()
{
- # Make sure that cryptroot is run last in local-top
- for req in $(dirname $0)/*; do
- script=${req##*/}
- if [ $script != cryptroot ]; then
- echo $script
- fi
- done
+ echo "$PREREQ"
}
case $1 in
@@ -69,8 +63,10 @@ parse_options()
cryptlvm=""
cryptkeyscript=""
cryptkey="" # This is only used as an argument to an eventual keyscript
+ cryptkeyslot=""
crypttries=3
crypttcrypt=""
+ cryptveracrypt=""
cryptrootdev=""
cryptdiscard=""
CRYPTTAB_OPTIONS=""
@@ -96,7 +92,7 @@ parse_options()
if [ ${cryptsource#UUID=} != $cryptsource ]; then
cryptsource="/dev/disk/by-uuid/${cryptsource#UUID=}"
elif [ ${cryptsource#LABEL=} != $cryptsource ]; then
- cryptsource="/dev/disk/by-label/${cryptsource#LABEL=}"
+ cryptsource="/dev/disk/by-label/$(printf '%s' "${cryptsource#LABEL=}" | sed 's,/,\\x2f,g')"
fi
export CRYPTTAB_SOURCE="$cryptsource"
;;
@@ -119,6 +115,9 @@ parse_options()
fi
export CRYPTTAB_KEY="$cryptkey"
;;
+ keyslot=*)
+ cryptkeyslot=${x#keyslot=}
+ ;;
tries=*)
crypttries="${x#tries=}"
case "$crypttries" in
@@ -130,6 +129,9 @@ parse_options()
tcrypt)
crypttcrypt="yes"
;;
+ veracrypt)
+ cryptveracrypt="--veracrypt"
+ ;;
rootdev)
cryptrootdev="yes"
;;
@@ -149,7 +151,7 @@ parse_options()
export CRYPTTAB_OPTIONS
if [ -z "$cryptsource" ]; then
- message "cryptsetup: source parameter missing"
+ message "cryptsetup ($crypttarget): source parameter missing"
return 1
fi
return 0
@@ -159,7 +161,7 @@ activate_vg()
{
# Sanity checks
if [ ! -x /sbin/lvm ]; then
- message "cryptsetup: lvm is not available"
+ message "cryptsetup ($crypttarget): lvm is not available"
return 1
fi
@@ -180,13 +182,29 @@ setup_mapping()
parse_options "$opts" || return 1
- if [ -n "$cryptkeyscript" ] && ! type "$cryptkeyscript" >/dev/null; then
- message "cryptsetup: error - script \"$cryptkeyscript\" missing"
+ if [ -z "$cryptkeyscript" ]; then
+ if [ ${cryptsource#/dev/disk/by-uuid/} != $cryptsource ]; then
+ # UUIDs are not very helpful
+ diskname="$crypttarget"
+ else
+ diskname="$cryptsource ($crypttarget)"
+ fi
+ cryptkeyscript="/lib/cryptsetup/naskpass"
+ cryptkey="Please unlock disk $diskname: "
+ elif ! type "$cryptkeyscript" >/dev/null; then
+ message "cryptsetup ($crypttarget): error - script \"$cryptkeyscript\" missing"
return 1
fi
+ if [ "$cryptkeyscript" = "cat" ] && [ "${cryptkey#/root/}" != "$cryptkey" ]; then
+ # skip the mapping if the root FS is not mounted yet
+ sed -rn 's/^\s*[^#]\S*\s+(\S+)\s.*/\1/p' /proc/mounts | grep -Fxq "$rootmnt" || return 1
+ # substitute the "/root" prefix by the real root FS mountpoint otherwise
+ cryptkey="${rootmnt}/${cryptkey#/root/}"
+ fi
+
if [ -n "$cryptheader" ] && ! type "$cryptheader" >/dev/null; then
- message "cryptsetup: error - LUKS header \"$cryptheader\" missing"
+ message "cryptsetup ($crypttarget): error - LUKS header \"$cryptheader\" missing"
return 1
fi
@@ -261,12 +279,15 @@ setup_mapping()
if [ -n "$cryptheader" ]; then
cryptopen="$cryptopen --header=$cryptheader"
fi
+ if [ -n "$cryptkeyslot" ]; then
+ cryptopen="$cryptopen --key-slot=$cryptkeyslot"
+ fi
if /sbin/cryptsetup isLuks ${cryptheader:-$cryptsource} >/dev/null 2>&1; then
- cryptopen="$cryptopen open --type luks $cryptsource $crypttarget --key-file=-"
+ cryptopen="$cryptopen open --type luks $cryptsource $crypttarget"
elif [ "$crypttcrypt" = "yes" ]; then
- cryptopen="$cryptopen open --type tcrypt $cryptsource $crypttarget"
+ cryptopen="$cryptopen open --type tcrypt $cryptveracrypt $cryptsource $crypttarget"
else
- cryptopen="$cryptopen -c $cryptcipher -s $cryptsize -h $crypthash open --type plain $cryptsource $crypttarget --key-file=-"
+ cryptopen="$cryptopen -c $cryptcipher -s $cryptsize -h $crypthash open --type plain $cryptsource $crypttarget"
fi
cryptremove="/sbin/cryptsetup remove $crypttarget"
NEWROOT="/dev/mapper/$crypttarget"
@@ -277,65 +298,16 @@ setup_mapping()
export CRYPTTAB_TRIED="$count"
count=$(( $count + 1 ))
- if [ -z "$cryptkeyscript" ]; then
- if [ ${cryptsource#/dev/disk/by-uuid/} != $cryptsource ]; then
- # UUIDs are not very helpful
- diskname="$crypttarget"
- else
- diskname="$cryptsource ($crypttarget)"
- fi
-
- if [ -x /bin/plymouth ] && plymouth --ping; then
- cryptkeyscript="plymouth ask-for-password --prompt"
- # Plymouth will add a : if it is a non-graphical prompt
- cryptkey="Please unlock disk $diskname"
- else
- if [ -x /lib/cryptsetup/naskpass ] && [ $askpass_fallback -eq 0 ]; then
- cryptkeyscript="/lib/cryptsetup/naskpass"
- cryptkey=""
- else
- cryptkeyscript="/lib/cryptsetup/askpass"
- cryptkey="Please unlock disk $diskname: "
- fi
- fi
- fi
-
-
if [ ! -e "$NEWROOT" ]; then
- if [ -x /bin/plymouth ] && plymouth --ping || [ $askpass_fallback -ne 0 ]; then
- if [ $askpass_fallback -eq 0 ]; then
- message "naskpass does not work with plymouth, falling back to default askpass .."
- fi
- if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
- $cryptkeyscript "$cryptkey" | $cryptopen; then
- message "cryptsetup: cryptsetup failed, bad password or options?"
- continue
- fi
- else
- [ -z ${NASK_FAIL} ] && /lib/cryptsetup/naskpass.pre
- if ! $cryptkeyscript -c "/sbin/cryptsetup -T 1 open $cryptsource $crypttarget"; then
- NASK_FAIL=1
- message "naskpass: failed ${count}/${crypttries}"
- if [ $crypttries -gt 0 ] && [ $count -ge $crypttries ]; then
- message "cryptsetup: maximum number of tries exceeded for $crypttarget"
- message "shutdown in 3 seconds"
- sleep 3
- [ -w /proc/sysrq-trigger ] && /bin/echo 'o' > /proc/sysrq-trigger
- [ -w /proc/sysrq ] && /bin/echo 'o' > /proc/sysrq
- [ -x /sbin/poweroff ] && /sbin/poweroff -n -f
- sleep 10
- return 1
- fi
- continue
- else
- message "naskpass: success"
- fi
- /lib/cryptsetup/naskpass.post
+ if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
+ $cryptkeyscript -c"$cryptopen"; then
+ message "cryptsetup ($crypttarget): cryptsetup failed, bad password or options?"
+ continue
fi
fi
if [ ! -e "$NEWROOT" ]; then
- message "cryptsetup: unknown error setting up device mapping"
+ message "cryptsetup ($crypttarget): unknown error setting up device mapping"
return 1
fi
@@ -347,11 +319,11 @@ setup_mapping()
#if [ "$FSTYPE" = "lvm" ] || [ "$FSTYPE" = "lvm2" ]; then
if [ "$FSTYPE" = "LVM_member" ] || [ "$FSTYPE" = "LVM2_member" ]; then
if [ -z "$cryptlvm" ]; then
- message "cryptsetup: lvm fs found but no lvm configured"
+ message "cryptsetup ($crypttarget): lvm fs found but no lvm configured"
return 1
elif ! activate_vg; then
# disable error message, LP: #151532
- #message "cryptsetup: failed to setup lvm device"
+ #message "cryptsetup ($crypttarget): failed to setup lvm device"
return 1
fi
@@ -372,19 +344,26 @@ setup_mapping()
#if [ -z "$FSTYPE" ] || [ "$FSTYPE" = "unknown" ]; then
if [ -z "$FSTYPE" ]; then
- message "cryptsetup: unknown fstype, bad password or options?"
+ message "cryptsetup ($crypttarget): unknown fstype, bad password or options?"
udev_settle
$cryptremove
continue
fi
- message "cryptsetup: $crypttarget set up successfully"
+ # decrease $count by 1, apparently last try was successful.
+ count=$(( $count - 1 ))
+
+ message "cryptsetup ($crypttarget): set up successfully"
break
done
- if [ $crypttries -gt 0 ] && [ $count -gt $crypttries ]; then
- message "cryptsetup: maximum number of tries exceeded for $crypttarget"
- return 1
+ failsleep=60 # make configurable later?
+
+ if [ "$cryptrootdev" = "yes" ] && [ $crypttries -gt 0 ] && [ $count -ge $crypttries ]; then
+ message "cryptsetup ($crypttarget): maximum number of tries exceeded"
+ message "cryptsetup: going to sleep for $failsleep seconds..."
+ sleep $failsleep
+ exit 1
fi
udev_settle
@@ -396,7 +375,6 @@ setup_mapping()
#
# Do we have any kernel boot arguments?
-askpass_fallback=0
cmdline_cryptopts=''
unset cmdline_root
for opt in $(cat /proc/cmdline); do
@@ -420,9 +398,6 @@ for opt in $(cat /proc/cmdline); do
*) # lilo major/minor number (See #398957). Ignore
esac
;;
- cryptfallback)
- askpass_fallback=1
- ;;
esac
done