Hat jemand von euch schon mal Dropbear in der Initramdisk benutzt? Habe das eine Weile genutzt, das ganze war auch unter Ubuntu extrem einfach. "sudo apt-get install dropbear" und der Rest passierte automatisch.
Mit Hilfe dieser Anleitung: http://wiki.ubuntuusers.de/Verschlüsseltes_System_via_SSH_freischalten kann mann dann aus der Ferne per SSH auf den PC zugreifen und die nötigen Partitionen eines komplett verschlüsselten Systems entschlüsseln. Mit Hilfe von diesem Thread: http://forum.ubuntuusers.de/topic/script-verschluesseltes-system-via-ssh-freisch/ kann man dann auch noch dafür sorgen, dass man kein Schlüsselpaar zum einloggen braucht und sich ein paar Befehle merken muss, sondern so kann man sich dann auch mit Benutzername und Kennwort einloggen und mit dem Befehl "unlock" (und dann Passworteingabe) das System entschlüsseln.
Sehr praktisch, wenn man Ubuntu auf einem Server nutzt und diesen z.B. per WOL oder Intel AMT aus der Ferne startet, ohne dem könnte man ihn ja nicht booten. Mit neueren Intel AMT Versionen kann man sich dann zwar per VNC ("AMT-KVM") einloggen, aber das klappt des öfteren auch mal nicht. Daher würde ich das ganze gerne weiter nutzen.
Unter 10.04 hat es einwandfrei geklappt. Unter den 11er Versionen auch noch. Aber mit 12.04 und neueren Versionen klappt es nicht mehr. Schon die Geschichte aus dem Wiki-Artikel geht dann nicht. Beim Erstellen der Ramdisks ("sudo update-initramfs -u -k all") gibt es die ersten Fehler. Im Skript /usr/share/initramfs-tools/hooks/dropbear wird der Befehl "cp /lib/libnss_* "${DESTDIR}/lib/" ausgeführt, aber die Dateien liegen nun in "/lib/x86_64-linux-gnu/" und nicht mehr in "/lib/". OK, so weit kein Problem, das ist schnell angepasst und der Fehler ist weg. Auch wenn mir die "copy_exec" Zeilen im Skript komisch vorkommen - den Befehl gibt es doch gar nicht, oder?
Hier mal das originale Skript:
Wenn man das ganze jetzt einfach mal ausprobiert, ergibt sich folgendes:
- statische IP beim Booten als Bootparameter des Kernels übergeben: Alles klappt genau wie es soll. Ich kann mich per SSH einloggen und das System entsperren/entschlüsseln. Allerdings bleibt die statische IP natürlich nach dem Booten auch. Ich kann dann kein DHCP mehr nutzen bzw. muss das immer manuell machen. Und ich kann mich natürlich nur einloggen, wenn die statische IP auch wirklich noch frei war usw. Für eine DHCP-Umgebung eine verdammt unsaubere Lösung...
- wenn ich keine statische IP vergebe, sondern (so wie es soll und so wie ich es gerne hätte) DHCP nutze, dann bekommt das Ding partout keine IP. Er versucht und versucht, aber es klappt nicht. Muss dann also doch wieder lokal vor Ort entsperren. Manchmal bekomme ich noch eine Fehlermeldung, dass "ipconfig" nicht gefunden werden konnte und auf "/tmp/net-*.conf" nicht zugegriffen werden konnte, der Verweis der Zeile, in der die Fehlermeldung auftritt, zeigt auf eine "configure_networking"-Funktion. Nach etwas suchen, habe ich "/usr/share/initramfs-tools/scripts/functions" gefunden, in der die "configure_networking"-Funktion drin ist. Die sieht folgendermaßen aus:
Nur wo ist die ipconfig-Funktion? Ich dachte, dafür nutzt Linux "dhclient" bzw "ifconfig" bzw. dessen Nachfolger...
Hat irgendjemand das ganze schon mal unter neueren Ubuntu-Versionen als 10.04 bzw. die 11er ausprobiert? Oder hat noch jemand eine Idee, was da schief läuft?
Mit Hilfe dieser Anleitung: http://wiki.ubuntuusers.de/Verschlüsseltes_System_via_SSH_freischalten kann mann dann aus der Ferne per SSH auf den PC zugreifen und die nötigen Partitionen eines komplett verschlüsselten Systems entschlüsseln. Mit Hilfe von diesem Thread: http://forum.ubuntuusers.de/topic/script-verschluesseltes-system-via-ssh-freisch/ kann man dann auch noch dafür sorgen, dass man kein Schlüsselpaar zum einloggen braucht und sich ein paar Befehle merken muss, sondern so kann man sich dann auch mit Benutzername und Kennwort einloggen und mit dem Befehl "unlock" (und dann Passworteingabe) das System entschlüsseln.
Sehr praktisch, wenn man Ubuntu auf einem Server nutzt und diesen z.B. per WOL oder Intel AMT aus der Ferne startet, ohne dem könnte man ihn ja nicht booten. Mit neueren Intel AMT Versionen kann man sich dann zwar per VNC ("AMT-KVM") einloggen, aber das klappt des öfteren auch mal nicht. Daher würde ich das ganze gerne weiter nutzen.
Unter 10.04 hat es einwandfrei geklappt. Unter den 11er Versionen auch noch. Aber mit 12.04 und neueren Versionen klappt es nicht mehr. Schon die Geschichte aus dem Wiki-Artikel geht dann nicht. Beim Erstellen der Ramdisks ("sudo update-initramfs -u -k all") gibt es die ersten Fehler. Im Skript /usr/share/initramfs-tools/hooks/dropbear wird der Befehl "cp /lib/libnss_* "${DESTDIR}/lib/" ausgeführt, aber die Dateien liegen nun in "/lib/x86_64-linux-gnu/" und nicht mehr in "/lib/". OK, so weit kein Problem, das ist schnell angepasst und der Fehler ist weg. Auch wenn mir die "copy_exec" Zeilen im Skript komisch vorkommen - den Befehl gibt es doch gar nicht, oder?
Hier mal das originale Skript:
Code:
#!/bin/sh
PREREQ=""
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
# Install dropbear if explicitly enabled, or in case of a cryptroot setup if not explicitly disabled
if [ "${DROPBEAR}" = "y" ] || ( [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ); then
if [ ! -x "/usr/sbin/dropbear" ]; then
if [ "${DROPBEAR}" = "y" ]; then
echo "dropbear: FAILURE: Dropbear not found!"
else
echo "dropbear: WARNING: Dropbear not found, remote unlocking of cryptroot via ssh won't work!"
fi
else
rm -f "${DESTDIR}/sbin/dropbear"
copy_exec "/usr/sbin/dropbear" "/sbin/"
cp /lib/libnss_* "${DESTDIR}/lib/"
echo "root:x:0:0:root:/root:/bin/sh" > "${DESTDIR}/etc/passwd"
for keytype in "dss" "rsa"; do
if [ ! -f "/etc/initramfs-tools/etc/dropbear/dropbear_${keytype}_host_key" ]; then
mkdir -p "/etc/initramfs-tools/etc/dropbear"
dropbearkey -t "${keytype}" -f "/etc/initramfs-tools/etc/dropbear/dropbear_${keytype}_host_key"
fi
done
cp -R /etc/initramfs-tools/etc/dropbear "${DESTDIR}/etc/"
if [ ! -f "/etc/initramfs-tools/root/.ssh/authorized_keys" ]; then
mkdir -p "/etc/initramfs-tools/root/.ssh"
if [ ! -f "/etc/initramfs-tools/root/.ssh/id_rsa.pub" ]; then
dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear
/usr/lib/dropbear/dropbearconvert dropbear openssh /etc/initramfs-tools/root/.ssh/id_rsa.dropbear /etc/initramfs-tools/root/.ssh/id_rsa
dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub
fi
cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys
fi
mkdir -p "${DESTDIR}/root/.ssh"
cp /etc/initramfs-tools/root/.ssh/authorized_keys "${DESTDIR}/root/.ssh/"
fi
fi
Wenn man das ganze jetzt einfach mal ausprobiert, ergibt sich folgendes:
- statische IP beim Booten als Bootparameter des Kernels übergeben: Alles klappt genau wie es soll. Ich kann mich per SSH einloggen und das System entsperren/entschlüsseln. Allerdings bleibt die statische IP natürlich nach dem Booten auch. Ich kann dann kein DHCP mehr nutzen bzw. muss das immer manuell machen. Und ich kann mich natürlich nur einloggen, wenn die statische IP auch wirklich noch frei war usw. Für eine DHCP-Umgebung eine verdammt unsaubere Lösung...
- wenn ich keine statische IP vergebe, sondern (so wie es soll und so wie ich es gerne hätte) DHCP nutze, dann bekommt das Ding partout keine IP. Er versucht und versucht, aber es klappt nicht. Muss dann also doch wieder lokal vor Ort entsperren. Manchmal bekomme ich noch eine Fehlermeldung, dass "ipconfig" nicht gefunden werden konnte und auf "/tmp/net-*.conf" nicht zugegriffen werden konnte, der Verweis der Zeile, in der die Fehlermeldung auftritt, zeigt auf eine "configure_networking"-Funktion. Nach etwas suchen, habe ich "/usr/share/initramfs-tools/scripts/functions" gefunden, in der die "configure_networking"-Funktion drin ist. Die sieht folgendermaßen aus:
Code:
configure_networking(){
if [ -n "${BOOTIF}" ]; then
# pxelinux sets BOOTIF to a value based on the mac address of the
# network card used to PXE boot, so use this value for DEVICE rather
# than a hard-coded device name from initramfs.conf. this facilitates
# network booting when machines may have multiple network cards.
# pxelinux sets BOOTIF to 01-$mac_address
# strip off the leading "01-", which isn't part of the mac
# address
temp_mac=${BOOTIF#*-}
# convert to typical mac address format by replacing "-" with ":"
bootif_mac=""
IFS='-'
for x in $temp_mac ; do
if [ -z "$bootif_mac" ]; then
bootif_mac="$x"
else
bootif_mac="$bootif_mac:$x"
fi
done
unset IFS
# look for devices with matching mac address, and set DEVICE to
# appropriate value if match is found.
for device in /sys/class/net/* ; do
if [ -f "$device/address" ]; then
current_mac=$(cat "$device/address")
if [ "$bootif_mac" = "$current_mac" ]; then
DEVICE=${device##*/}
break
fi
fi
done
fi
# networking already configured thus bail out
[ -n "${DEVICE}" ] && [ -e /tmp/net-"${DEVICE}".conf ] && return 0
# support ip options see linux sources
# Documentation/filesystems/nfs/nfsroot.txt
# Documentation/frv/booting.txt
for ROUNDTTT in 2 3 4 6 9 16 25 36 64 100; do
# The NIC is to be configured if this file does not exist.
# Ip-Config tries to create this file and when it succeds
# creating the file, ipconfig is not run again.
for x in /tmp/net-"${DEVICE}".conf /tmp/net-*.conf ; do
[ -e "$x" ] && break 2
done
case ${IP} in
none|off)
# Do nothing
;;
""|on|any)
# Bring up device
ipconfig -t ${ROUNDTTT} "${DEVICE}"
;;
dhcp|bootp|rarp|both)
ipconfig -t ${ROUNDTTT} -c ${IP} -d "${DEVICE}"
;;
*)
ipconfig -t ${ROUNDTTT} -d $IP
# grab device entry from ip option
NEW_DEVICE=${IP#*:*:*:*:*:*}
if [ "${NEW_DEVICE}" != "${IP}" ]; then
NEW_DEVICE=${NEW_DEVICE%:*}
else
# wrong parse, possibly only a partial string
NEW_DEVICE=
fi
if [ -n "${NEW_DEVICE}" ]; then
DEVICE="${NEW_DEVICE}"
fi
;;
esac
done
# source ipconfig output
if [ -n "${DEVICE}" ]; then
# source specific bootdevice
. /tmp/net-${DEVICE}.conf
else
# source any interface...
# ipconfig should have quit after first response
. /tmp/net-*.conf
fi
}
Nur wo ist die ipconfig-Funktion? Ich dachte, dafür nutzt Linux "dhclient" bzw "ifconfig" bzw. dessen Nachfolger...
Hat irgendjemand das ganze schon mal unter neueren Ubuntu-Versionen als 10.04 bzw. die 11er ausprobiert? Oder hat noch jemand eine Idee, was da schief läuft?