ubuntuusers.de

[Script] Verschlüsseltes System via SSH freischalten

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

gekmihesg

Anmeldungsdatum:
6. Mai 2009

Beiträge: 106

Erstmal alles so einrichten wie hier beschrieben: Verschlüsseltes System via SSH freischalten

Wenn man jetzt aber das /usr/share/initramfs-tools/scripts/local-top/cryptroot Skript nicht ändern will, hab ich hier dieses Skript gebastelt:

 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
#!/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
	cat > "${DESTDIR}/bin/unlock" <<-EOF
		#!/bin/sh
		if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot
		then
			/sbin/pkill cryptroot
			/sbin/pkill -f "plymouth ask-for-pass"
			/sbin/pkill cryptsetup
			exit 0
		fi
		exit 1
	EOF
	chmod 755 "${DESTDIR}/bin/unlock"

	mkdir -p "${DESTDIR}/lib/unlock"
	cat > "${DESTDIR}/lib/unlock/plymouth" <<-EOF
		#!/bin/sh
		[ "\$1" == "--ping" ] && exit 1
		/bin/plymouth "\$@"
	EOF
	chmod 755 "${DESTDIR}/lib/unlock/plymouth"

	# Enable password login
	if [ -n "$SSHUSERPASS" ]
	then
		sed -n "s/^${SSHUSERPASS}:/root:/p" /etc/shadow > "${DESTDIR}/etc/shadow"
		chmod 640 "${DESTDIR}/etc/shadow"
	fi
fi

Das fügt man einfach in /usr/share/initramfs-tools/hooks/ ein, dann einmal update-initramfs -u. Jetzt kann man sich wie im Wiki beschrieben über SSH einloggen und dann aber das System mit dem Befehl unlock freischalten.

Wenn man sich zusätzlich mit einem Passwort einloggen will (also nicht mit Schlüsseldatei) hat man die Möglichkeit in der /etc/initramfs-tools/initramfs.conf die Zeile SSHUSERPASS=<Benutzername> einzufügen. Dadurch wird der Login als root mit dem Passwort von <Benutzername> freigeschaltet. Man kann hier natürlich auch den Benutzer root angeben, aber dann muss man ein root-Passwort festlegen und den root-Login Systemweit aktivieren.

Das Ganze ist ein ziemlicher Hack, aber bei mir funktionierts. Falls es also jemand testen will, wäre ich über Erfahrungsberichte sehr dankbar!

Timmeey

Anmeldungsdatum:
10. November 2007

Beiträge: 77

Juhu geil, des funktioniert übrigens auch für 10.10 (bei mir egrade)

Jetzt kann man entfernt UND lokal entsperren, ziemlich fett.

Allerdings tuts des mit dem Benutzernamen bei mri noch nciht.

UND was ich machen musste war nen chmod +X auf [...]/hooks/unlock

und dann liefs.

Und so ein krasser hack ist das garnicht. Wenn ich des richtig verstanden habe wartet des plymouth doch darauf das enteder ein passwort kommt ODER nen ping oder sowas, und dann umspringt. und genau das machst du doch. ist doch geil Glückwunsch, und ne dose voller Kekse

gekmihesg

(Themenstarter)

Anmeldungsdatum:
6. Mai 2009

Beiträge: 106

Naja, ich trickse das cryptroot Skript aus. Das ermittelt mit plymouth --ping ob es plymouth oder askpass für die Passworteingabe verwenden soll. Über die PATH Variable schalte ich ein eigenes Skript zwischen, das für cryptroot plymouth --ping abfängt und immer false zurück gibt. Das cryptroot Skript läuft also zwei mal nachdem man unlock ausführt, einmal lokal mit plymouth und einmal über ssh mit askpass.

Das mit dem Benutzernamen weiß ich nicht woran das liegt. In /etc/ sollte die Datei shadow liegen mit einem einzigen Eintrag für root. Das reicht für mein System. Aber du kannst mal versuchen noch diese Zeilen hinzuzufügen:

1
2
3
4
5
6
7
8
	if [ -n "$SSHUSERPASS" ]
	then
		grep -m1 "^root:" /etc/passwd > "${DESTDIR}/etc/passwd"
		grep -m1 "^root:" /etc/group > "${DESTDIR}/etc/group"
		chmod 644 "${DESTDIR}/etc/passwd" "${DESTDIR}/etc/group"
		sed -n "s/^${SSHUSERPASS}:/root:/p" /etc/shadow > "${DESTDIR}/etc/shadow"
		chmod 640 "${DESTDIR}/etc/shadow"
	fi

Allerdings hab ich das jetzt nicht getestet. Du solltest vorher überprüfen, ob die Dateien nicht eh schon da sind und noch mehr Einträge drin sind. Nicht das du dir damit was anderes zerschießt.

Das mit den Rechten hab ich vergessen. Danke!

Achso: Der Login erfolgt über ssh root@<IP> aber mit dem Passwort von <Benutzername> und nicht mit ssh <Benutzername>@<IP>. <Benutzername> muss existieren, da das zugehörige Passwort root zugewiesen wird.

Hurga

Anmeldungsdatum:
20. März 2011

Beiträge: 3

Funktioniert auch bei mir bestens auf einer 10.10, sowohl mit Key wie mit Passwort. Besten Dank für deine Mühe!

Eine Ergänzung noch: ich konnte mich nicht einloggen, bis ich in /usr/share/initramfs-tools/hooks/plymouth die Zeile

echo 'root:x:0:0:root:/root:/bin/bash' >${DESTDIR}/etc/passwd

in

echo 'root:x:0:0:root:/root:/bin/sh' >${DESTDIR}/etc/passwd

geändert hatte - plymouth überschreibt hier die passwd-Zeile vom dropbear-Skript, und bash ist eine unbekannte shell für dropbear, woraufhin der Login verweigert wird. Dieser Fix ist aber wohl in Natty schon drin.

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: Zähle...

Moin

Auf 10.04 funktioniert das einwandfrei. Auf 11.04 auch. Auf 11.10 kann man (ich) es nicht testen, da die Systemverschlüsselung dort nicht funktioniert. Unter 12.04 funktioniert es (zumindest jetzt in den Testversionen) nicht mehr. Dort kommt die Fehlermeldung

/bin/unlock: line 8: /sbin/pkill: not found

Wenn man dann danach versucht vor Ort zu entschlüsseln, wird gemeldet, dass das Device schon exisitert. Also funktioniert da noch "irgendwas" aber nicht mehr alles ^^

Hurga

Anmeldungsdatum:
20. März 2011

Beiträge: 3

cuco schrieb:

Auf 10.04 funktioniert das einwandfrei. Auf 11.04 auch. Auf 11.10 kann man (ich) es nicht testen, da die Systemverschlüsselung dort nicht funktioniert.

Ich benutze derzeit die 11.10 mit Verschlüsselung und da tut es problemlos.

lalelooo

Anmeldungsdatum:
30. Januar 2012

Beiträge: 5

edit: -hat sich erledigt-

danke für das script 😀

Hurga

Anmeldungsdatum:
20. März 2011

Beiträge: 3

lalelooo schrieb:

habe das script kopiert und unter namen "unlock" gespeichert im ordner /usr/share/initramfs-tools/hooks/ gespeichert dann "chmod +x unlock" und "update-initramfs -u"

muss ich sonst noch irgendwas machen ?

Das sollte es eigentlich gewesen sein...

wenn ich "unlock" eingebe erhalte ich "-sh: unlock: not found"

Hmm, seltsam. "unlock" ist richtig... pack mal deine initrd aus (also die neu erzeugte) und schau nach, wo das abgeblieben ist.

mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/initrd.img-<version>  | cpio -i
find . -name 'unlock'

Das gefundene ./bin/unlock sollte ausführbar sein und folgendermaßen aussehen:

ls -l ./bin/unlock
-rwxr-xr-x 1 root root 176 2012-01-31 00:05 ./bin/unlock
cat ./bin/unlock
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot
then
/sbin/pkill cryptroot
/sbin/pkill -f "plymouth ask-for-pass"
/sbin/pkill cryptsetup
exit 0
fi
exit 1

lalelooo

Anmeldungsdatum:
30. Januar 2012

Beiträge: 5

thx für deine antwort war leider nur doof und hab n leeres unlock script gespeichert geht mir schon seit tage so das ich stunden wegen solchem schwachsinn verlier 😀

eine frage hätt ich noch von der anleitung hab ich folgendes nie hingebracht (habs dann mit usbstick gemacht)

scp user@server:/etc/initramfs-tools/root/.ssh/id_rsa ~/ war immer permission denied obwohl ich die richtigen passes eingegeben hab und sicherheitshalber gleich noch sudo mit dazu...

Tabea

Anmeldungsdatum:
31. März 2007

Beiträge: 659

Hallo,

ich möchte auf mein verschlüsseltes Lubuntu 11.10 auch per Tastatur freischalten können. Meine Vorgehensweise bisher war:

- Das Skript aus dem ersten Post /usr/share/initramfs-tools/hooks/unlock erstellt

- chmod +x unlock

- update-initramfs -u

Nach einem Neustart konnte ich zwar wieder schön per ssh alles freischalten, aber auf die Tastatureingabe des Passworts reagiert das System nicht.

Hab ich was vergessen?

Tabea

Anmeldungsdatum:
31. März 2007

Beiträge: 659

Hat keiner ne Ahnung?

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

Gerade nochmal wieder unter Ubuntu 12.04 getestet. Es geht nicht. In der Busybox scheint der Befehl "pkill" zu fehlen. Kann man den irgendwie "nachrüsten" oder durch was anderes ersetzen?

servern00b

Anmeldungsdatum:
30. März 2012

Beiträge: 1

Hi susammen, bin grade dabei, das für Ubuntu Server 12.04 einzurichten. Wie cuco bermerkt hat, wurde busybox für die neue Version wohl ohne den Befehl pkill kompiliert. Der lässt sich aber ersetzen durch:

1
kill `ps | grep cryptroot | grep -v "grep" | awk '{print $i}'`

sieht schlimm aus, ist aber nix anderes als pkill auch macht. Übrigens genügt es, den cryptroot-Prozess zu killen, plymouth und cryptsetup gehen dann wohl mit hops.

Also muss das Script aus dem Eingangspost für 12.04 wie folgt angepasst werden:

 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
#!/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
	cat > "${DESTDIR}/bin/unlock" <<-EOF
		#!/bin/sh
		if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot
		then
			kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$i}'\`
			exit 0
		fi
		exit 1
	EOF
	chmod 755 "${DESTDIR}/bin/unlock"

	mkdir -p "${DESTDIR}/lib/unlock"
	cat > "${DESTDIR}/lib/unlock/plymouth" <<-EOF
		#!/bin/sh
		[ "\$1" == "--ping" ] && exit 1
		/bin/plymouth "\$@"
	EOF
	chmod 755 "${DESTDIR}/lib/unlock/plymouth"

	# Enable password login
	if [ -n "$SSHUSERPASS" ]
	then
		sed -n "s/^${SSHUSERPASS}:/root:/p" /etc/shadow > "${DESTDIR}/etc/shadow"
		chmod 640 "${DESTDIR}/etc/shadow"
	fi
fi

(die Änderungen sind in Zeile 24, wo die drei pkill's durch obigen Befehl ersetzt wurden). Man beachte die Backslashes. Diese müssen rein, da dieses Script selbst wieder ein Script erzeugt. Wenn man die Backticks nicht escaped, wird der Befehl ausgeführt, statt in das Script geschrieben. Die Backticks (misbrauchte französische accents, KEINE einfachen Anführungszeichen!) findet man normalerweise neben der Taste mit ? und \ drauf.

Mit dieser Anpassung kann man das root-Dateisystem jetzt sowohl lokal als auch über SSH (mit "unlock") freischalten. Dabei muss man auch über SSH einfach das Passwort eingeben, das auch nicht angezeigt wird. Ich hoffe, das hilft jemandem.

cuco

Anmeldungsdatum:
6. August 2011

Beiträge: 34

Ich bekomme zwar folgende Ausgabe:

login as: root
root@xxx.ath.cx's password:


BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.

# unlock
Unlocking the disk /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (sda5_crypt)
Enter passphrase:
  Reading all physical volumes.  This may take a while...
  Found volume group "xxx" using metadata type lvm2
  2 logical volume(s) in volume group "xxx" now active
cryptsetup: sda5_crypt set up successfully
kill: invalid number 'root'
kill: can't kill pid 4588: No such process
kill: invalid number 'S'
kill: invalid number '/bin/sh'
kill: invalid number '/scripts/local-top/cryptroot'
#

Aber dann scheint er zu booten!! Es läuft auf jeden Fall! Danke ☺

gekmihesg

(Themenstarter)

Anmeldungsdatum:
6. Mai 2009

Beiträge: 106

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

Antworten |