ubuntuusers.de

[Script] Verschlüsseltes System via SSH freischalten

Status: Gelöst | Ubuntu-Version: Server 10.04 (Lucid Lynx)
Antworten |

Michael_64

Anmeldungsdatum:
17. Dezember 2006

Beiträge: 9

Hallo zusammen,

gibt es eigentlich eine Möglichkeit, dass dropbear per scp selbst ein keyfile zieht um das System zu entschlüsseln?

Damit würde das verschlüsselte System immer automatisch hochfahren, solange der key über das Netz erreichbar ist.

Michael

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

gekmihesg schrieb:

Ich nutze das zwar selber nicht mehr, aber nachdem der Thread jetzt doch schon einige Hits hat, hier mal eine überarbeitete Version für 12.04.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. "$CONFDIR/initramfs.conf"
#. /usr/share/initramfs-tools/hook-functions

if [ "$DROPBEAR" != "n" ] && [ -r "/etc/crypttab" ] ; then
    # fix for dropbear in Ubuntu 12.04 x86_64
    [ -d /lib/x86_64-linux-gnu ] && cp -p /lib/x86_64-linux-gnu/libnss_* "$DESTDIR/lib/"

    mkdir -m 755 -p "$DESTDIR/lib/unlock"

##### /bin/unlock
cat > "${DESTDIR}/bin/unlock" <<EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot ; then
    for n in cryptroot "plymouth ask-for-pass" cryptsetup ; do
        p=\$(ps w | grep "\$n" | awk '\$5 != "grep" {print \$1}')
        [ -n "\$p" ] && kill \$p
    done
    exit 0
fi
exit 1
EOF
##### EOF /bin/unlock

##### /lib/unlock/plymouth
cat > "$DESTDIR/lib/unlock/plymouth" <<-EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
exec /bin/plymouth "\$@"
EOF
##### EOF /lib/unlock/plymouth

    chmod 755 "$DESTDIR/bin/unlock"
    chmod 755 "$DESTDIR/lib/unlock/plymouth"

    # enable password login
    [ -n "$SSHUSERPASS" ] &&
    touch "$DESTDIR/etc/shadow" && chmod 640 "$DESTDIR/etc/shadow" &&
    getent shadow "$SSHUSERPASS" | sed -n "s/^$SSHUSERPASS:/root:/p" /etc/shadow >> "$DESTDIR/etc/shadow"

    sed -i'' 's|^\(root:.*\):[^:]*$|\1:/bin/sh|' "$DESTDIR/etc/passwd"
fi

Das Skript ist übrigens viel besser in /etc/initramfs-tools/hooks/ aufgehoben.

Ich hab auch ein paar Fixes übernommen:

  • Für root wird jetzt nochmal sichergestellt, dass die Shell auch /bin/sh ist

  • pkill ist rausgeflogen, die Methode von servern00b hab ich ein bisschen angepasst

  • Zumindest bei mir (12.04 Server x86_64 Beta 2) hat der SSH Login erstmal garnicht funktioniert, nachdem der dropbear-Hook die nss-Libs nicht gefunden hat

Funktioniert übrigens hervorragend mit 12.10 ☺ Danke dafür!

bboyzrulez

Avatar von bboyzrulez

Anmeldungsdatum:
23. Dezember 2012

Beiträge: Zähle...

Besten Dank an gekmihesg und an alle die beigetragen haben. Ich habe einpaar Aenderungen eingebaut. Das "ps" Command in der BusyBox akzeptiert keine Optionen. Die Zeile zum Ermitteln der Pids ist jetzt einfacher geworden. Es wird ein SIG 9 beim beenden der Prozesse geschickt. Beim "fix for dropbear in Ubuntu 12.04 x86_64" wird das copieren trotz evtl. vorhandener cp, mv ... aliases ausgefuehrt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. "$CONFDIR/initramfs.conf"
#. /usr/share/initramfs-tools/hook-functions

if [ "$DROPBEAR" != "n" ] && [ -r "/etc/crypttab" ] ; then
    # fix for dropbear in Ubuntu 12.04 x86_64
    [ -d /lib/x86_64-linux-gnu ] && \cp -a /lib/x86_64-linux-gnu/libnss_* "$DESTDIR/lib/"

    mkdir -m 755 -p "$DESTDIR/lib/unlock"

##### /bin/unlock
cat > "${DESTDIR}/bin/unlock" <<EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot ; then
    for n in cryptroot "plymouth ask-for-pass" cryptsetup ; do
        p=\$(ps | grep "\$n" | awk '!/grep/ {print \$1}')
        [ -n "\$p" ] && kill -KILL \$p
    done
    exit 0
fi
exit 1
EOF
##### EOF /bin/unlock

##### /lib/unlock/plymouth
cat > "$DESTDIR/lib/unlock/plymouth" <<-EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
exec /bin/plymouth "\$@"
EOF
##### EOF /lib/unlock/plymouth

    chmod 755 "$DESTDIR/bin/unlock"
    chmod 755 "$DESTDIR/lib/unlock/plymouth"

    # enable password login
    [ -n "$SSHUSERPASS" ] &&
    touch "$DESTDIR/etc/shadow" && chmod 640 "$DESTDIR/etc/shadow" &&
    getent shadow "$SSHUSERPASS" | sed -n "s/^$SSHUSERPASS:/root:/p" /etc/shadow >> "$DESTDIR/etc/shadow"

    sed -i'' 's|^\(root:.*\):[^:]*$|\1:/bin/sh|' "$DESTDIR/etc/passwd"
fi

Fuer Ubuntu Lucid ist Folgendes noch zu beachten (getestet auf 10.04 amd64)! Im script "/usr/share/initramfs-tools/scripts/init-premount/devpts" muss folgender Eintrag hinzugefuegt werden damit pts terminals funktionieren nachdem Dropbear installiert wurde (ist ein kleiner bug im Dropbear packet).

1
2
# If /dev/pts is already mounted, don't re-mount it.
mountpoint -q /dev/pts || exit 0

Zum Schluss muss das Script wei folgt aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh

PREREQ="udev"

prereqs() {
        echo "$PREREQ"
}

case "$1" in
        prereqs)
                prereqs
                exit 0
        ;;
esac

. /scripts/functions

grep -E "[[:space:]]+devpts$" /proc/filesystems >/dev/null 2>&1 || exit 0

# If /dev/pts is already mounted, don't re-mount it.
mountpoint -q /dev/pts || exit 0

log_begin_msg "Mounting devpts"

mkdir -p /dev/pts
mount -t devpts none /dev/pts

Damit die Aenderungen auch wirksam werden muss noch ein

1
update-initramfs -k all -u

ausgefuehrt werden.

Cheers

Happy Chritsmas and happy new year everybody

Gerrit507

Anmeldungsdatum:
26. Mai 2014

Beiträge: Zähle...

Vielen Dank erstmal für die Scripts. In meinen Augen ist es die beste Möglichkeit die luks boot Partition zu entsperren, da das lokale entsperren aktiviert bleibt. Ich weiß der Thread ist schon relativ alt aber ich versuche gerade das Skript auf ubuntu 14.04 Server zum laufen zu bekommen. Ich kann mich soweit mit mit ssh in der busybox anmelden aber wenn ich den Befehl unlock ausführe bekomme ich nur die Fehlermeldung:

Device /dev/md/1 doesn't exist or access denied.

Das zu entsperrende LVM heißt bei mir nicht /dev/md/1 und ich weiß auch nicht wieso der Skript genau diese Partition enstperren will. Gibt es irgendein workaround den Skript auf 14.04 zum Laufen zu bekommen?

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

Wie genau bist du vorgegangen und welche Version des Skripts genau hast du benutzt? Hier im Thread kursieren ja inzwischen mehrere Versionen.

Ich frage deshalb, weil ich vor ca. 2 Wochen wieder mit Hilfe genau dieses Threads einen Server eines Bekannten mit der Möglichkeit "ausgestattet" habe, ihn per SSH entsperren zu können. Dabei läuft 14.04. Also liegt es nicht an 14.04, sondern irgendwo anders an deiner Config.

Hast du mal die /etc/crypttab unter die Lupe genommen? Klingt so, als wenn dort /dev/md/1 eingetragen ist.

bboyzrulez

Avatar von bboyzrulez

Anmeldungsdatum:
23. Dezember 2012

Beiträge: 2

bboyzrulez schrieb:

Besten Dank an gekmihesg und an alle die beigetragen haben. Ich habe einpaar Aenderungen eingebaut. Das "ps" Command in der BusyBox akzeptiert keine Optionen. Die Zeile zum Ermitteln der Pids ist jetzt einfacher geworden. Es wird ein SIG 9 beim beenden der Prozesse geschickt. Beim "fix for dropbear in Ubuntu 12.04 x86_64" wird das copieren trotz evtl. vorhandener cp, mv ... aliases ausgefuehrt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. "$CONFDIR/initramfs.conf"
#. /usr/share/initramfs-tools/hook-functions

if [ "$DROPBEAR" != "n" ] && [ -r "/etc/crypttab" ] ; then
    # fix for dropbear in Ubuntu 12.04 x86_64
    [ -d /lib/x86_64-linux-gnu ] && \cp -a /lib/x86_64-linux-gnu/libnss_* "$DESTDIR/lib/"

    mkdir -m 755 -p "$DESTDIR/lib/unlock"

##### /bin/unlock
cat > "${DESTDIR}/bin/unlock" <<EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot ; then
    for n in cryptroot "plymouth ask-for-pass" cryptsetup ; do
        p=\$(ps | grep "\$n" | awk '!/grep/ {print \$1}')
        [ -n "\$p" ] && kill -KILL \$p
    done
    exit 0
fi
exit 1
EOF
##### EOF /bin/unlock

##### /lib/unlock/plymouth
cat > "$DESTDIR/lib/unlock/plymouth" <<EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
exec /bin/plymouth "\$@"
EOF
##### EOF /lib/unlock/plymouth

    chmod 755 "$DESTDIR/bin/unlock"
    chmod 755 "$DESTDIR/lib/unlock/plymouth"

    # enable password login
    [ -n "$SSHUSERPASS" ] &&
    touch "$DESTDIR/etc/shadow" && chmod 640 "$DESTDIR/etc/shadow" &&
    getent shadow "$SSHUSERPASS" | sed -n "s/^$SSHUSERPASS:/root:/p" /etc/shadow >> "$DESTDIR/etc/shadow"

    sed -i'' 's|^\(root:.*\):[^:]*$|\1:/bin/sh|' "$DESTDIR/etc/passwd"
fi

Fuer Ubuntu Lucid ist Folgendes noch zu beachten (getestet auf 10.04 amd64)! Im script "/usr/share/initramfs-tools/scripts/init-premount/devpts" muss folgender Eintrag hinzugefuegt werden damit pts terminals funktionieren nachdem Dropbear installiert wurde (ist ein kleiner bug im Dropbear packet).

1
2
# If /dev/pts is already mounted, don't re-mount it.
mountpoint -q /dev/pts || exit 0

Zum Schluss muss das Script wei folgt aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh

PREREQ="udev"

prereqs() {
        echo "$PREREQ"
}

case "$1" in
        prereqs)
                prereqs
                exit 0
        ;;
esac

. /scripts/functions

grep -E "[[:space:]]+devpts$" /proc/filesystems >/dev/null 2>&1 || exit 0

# If /dev/pts is already mounted, don't re-mount it.
mountpoint -q /dev/pts || exit 0

log_begin_msg "Mounting devpts"

mkdir -p /dev/pts
mount -t devpts none /dev/pts

Damit die Aenderungen auch wirksam werden muss noch ein

1
update-initramfs -k all -u

ausgefuehrt werden.

Cheers

Happy Chritsmas and happy new year everybody

Kleiner Bugfix. Ein unnötiges "-" vor dem EOF im Skript gelöscht. Cheers

Gerrit507

Anmeldungsdatum:
26. Mai 2014

Beiträge: 6

cuco schrieb:

Wie genau bist du vorgegangen und welche Version des Skripts genau hast du benutzt? Hier im Thread kursieren ja inzwischen mehrere Versionen.

Ich frage deshalb, weil ich vor ca. 2 Wochen wieder mit Hilfe genau dieses Threads einen Server eines Bekannten mit der Möglichkeit "ausgestattet" habe, ihn per SSH entsperren zu können. Dabei läuft 14.04. Also liegt es nicht an 14.04, sondern irgendwo anders an deiner Config.

Hast du mal die /etc/crypttab unter die Lupe genommen? Klingt so, als wenn dort /dev/md/1 eingetragen ist.

In der /etc/crypttab ist die richtige LVM eingetragen. Benutze die letzte Version.

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

Gerrit507 schrieb:

cuco schrieb:

Wie genau bist du vorgegangen und welche Version des Skripts genau hast du benutzt? Hier im Thread kursieren ja inzwischen mehrere Versionen.

Ich frage deshalb, weil ich vor ca. 2 Wochen wieder mit Hilfe genau dieses Threads einen Server eines Bekannten mit der Möglichkeit "ausgestattet" habe, ihn per SSH entsperren zu können. Dabei läuft 14.04. Also liegt es nicht an 14.04, sondern irgendwo anders an deiner Config.

Hast du mal die /etc/crypttab unter die Lupe genommen? Klingt so, als wenn dort /dev/md/1 eingetragen ist.

In der /etc/crypttab ist die richtige LVM eingetragen. Benutze die letzte Version.

Habe nun gerade wieder einen Server mit 14.04 so eingerichtet, dass er sich per SSH entsperren lässt. Vorgehen:

- openssh-server ist bereits installiert
- mit apt-get den "dropbear" installieren
- das hier im Thread als letztes genannte Script in /etc/initramfs-tools/hooks/ unter dem Namen "unlock" anlegen und mit chmod +x ausführbar machen
- in /etc/initramfs-tools/initramfs.conf die Zeile SSHUSERPASS=Benutzername einfügen und Benutzername durch deinen Benutzernamen ersetzen
- wenn er keine Netzwerkverbindung bekommt: /usr/share/initramfs-tools/scripts/init-premount/dropbear bearbeiten und "configure_networking &" durch "ipconfig eth0 &" ersetzen. Für eth0 natürlich den Namen des Netzwerkinterfaces einsetzen
- alles per "update-initramfs -u -k all" in die Ramdisks übernehmen
- neu starten
- Verbindung mit dem SSH-Clienten aufbauen, Benutzername "root" und das Passwort von dem Benutzer, den man bei SSHUSERPASS eingetragen hat
- "unlock" tippen/ausführen
- Passwort eintippen
- läuft...

alex42

Anmeldungsdatum:
6. Juni 2007

Beiträge: 124

Hm,bei mir klappt es unter 14.04 leider nicht. Ich habe diese Version des Skripts genutzt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. "$CONFDIR/initramfs.conf"
#. /usr/share/initramfs-tools/hook-functions

if [ "$DROPBEAR" != "n" ] && [ -r "/etc/crypttab" ] ; then
    # fix for dropbear in Ubuntu 12.04 x86_64
    [ -d /lib/x86_64-linux-gnu ] && \cp -a /lib/x86_64-linux-gnu/libnss_* "$DESTDIR/lib/"

    mkdir -m 755 -p "$DESTDIR/lib/unlock"

##### /bin/unlock
cat > "${DESTDIR}/bin/unlock" <<EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot ; then
    for n in cryptroot "plymouth ask-for-pass" cryptsetup ; do
        p=\$(ps | grep "\$n" | awk '!/grep/ {print \$1}')
        [ -n "\$p" ] && kill -KILL \$p
    done
    exit 0
fi
exit 1
EOF
##### EOF /bin/unlock

##### /lib/unlock/plymouth
cat > "$DESTDIR/lib/unlock/plymouth" <<EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
exec /bin/plymouth "\$@"
EOF
##### EOF /lib/unlock/plymouth

    chmod 755 "$DESTDIR/bin/unlock"
    chmod 755 "$DESTDIR/lib/unlock/plymouth"

    # enable password login
    [ -n "$SSHUSERPASS" ] &&
    touch "$DESTDIR/etc/shadow" && chmod 640 "$DESTDIR/etc/shadow" &&
    getent shadow "$SSHUSERPASS" | sed -n "s/^$SSHUSERPASS:/root:/p" /etc/shadow >> "$DESTDIR/etc/shadow"

    sed -i'' 's|^\(root:.*\):[^:]*$|\1:/bin/sh|' "$DESTDIR/etc/passwd"
fi

wenn ich in der Busybox dann das Skript aufrufe, bekomme ich folgende Fehlermeldung:

Unlocking the disk /dev/disk/by-uuid/45006904-2da1-4396-b2dc-fb1cd5877013 (vda5_crypt)
Enter passphrase: No key available with this passphrase.
cryptsetup: cryptsetup failed, bad password or options?

Die eingegebene Passphrase ist aber ganz sicher korrekt! Hat jemand eine Idee was ich falsch mache?

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

Lokal klappt das Entsperren mit dem Key aber? Hast du vielleicht Probleme mit Umlauten, Zeichensatzcodierungen (UTF-8 vs. Latin-1 im SSH-Clienten), Sonderzeichen oder dem Tastaturlayout?

alex42

Anmeldungsdatum:
6. Juni 2007

Beiträge: 124

Super! Das wars (ein Kodierungsproblem). Vielen Dank!

PS: Kann man das Problem umgehen, dass der SSH-Client jedesmal blockiert, da der Fingerprint nicht stimmt und man daher erst diesen löschen muss?

elektronaut

Anmeldungsdatum:
3. Mai 2005

Beiträge: 59

Bei mir klappt es unter 12.04 (im Zentyal Flavour) leider nicht, weder mit dem Skript hier noch mit dem auf http://blog.asiantuntijakaveri.fi/2013/09/ubuntu-server-12043-1210-1304-1310-with.html Der SSH Client endet immer mit einem "Connection refused", nmap sagt mir immerhin, dass der Port offen ist und dort ssh verfügbar ist, aber weiter komme ich nicht. Bin nun leider ratlos, hat noch jemand eine Idee, woran es liegen könnte?

Gruentee

Avatar von Gruentee

Anmeldungsdatum:
7. November 2007

Beiträge: 52

Wohnort: Hass'e nich'eseehn...

Hat das schon jemand mit 16.04 getestet?

Antworten |