staging.inyokaproject.org

System verschlüsseln/Schlüsselableitung

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels System_verschlüsseln/Schlüsselableitung.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Hallo. Die Meldung ergab folgenden Suchtreffer: http://www.linuxforen.de/forums/showthread.php?275038-luks-verschl%FCsselung-mit-passphrase-und-key-file. Bestätigt dann mein Posting im anderen Diskussionsartikel: LUKS.

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Benno-007 schrieb:

Hallo. Die Meldung ergab folgenden Suchtreffer: http://www.linuxforen.de/forums/showthread.php?275038-luks-verschl%FCsselung-mit-passphrase-und-key-file. Bestätigt dann mein Posting im anderen Diskussionsartikel: LUKS.

Der Befehl

/lib/cryptsetup/scripts/decrypt_derived root | cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y /dev/sdX2 

funktioniert nicht. Das wird in dem von Dir verlinkten Beitrag ebenfalls beschrieben. Was jetzt Dein anderer Beitrag mit diesem Fehler zu tun hat, erschließt sich mir nicht.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Auch er funktioniert ohne diese Meldung, wenn der Sicherheitsschlüssel ZUVOR angelegt wurde. Steht erstens im Weblink und zweitens hatten wir ja gerade die Diskussion im Forum, wo ich lang und breit erläuterte, dass und warum alles zur Ableitung bei mir funktionierte - hättest also auch erst mal dort fragen können, was ich anders mache.

Drittens hab ich dann in der von uns beiden hier verlinkten Wikidiskussion bestätigt, dass es wohl (deine Tests) nur (dann aber gewiss, meine Benutzung) funktioniert, wenn der Sicherheitsschlüssel ZUVOR angelegt wurde.

Damit sollten eigentlich jetzt alle Unklarheiten beseitigt sein. Den Schlüssel zuvor anlegen beseitigt also beide Probleme, die Meldung beim Anlegen hier und die beim PW ergänzen drüben. Schön, dass du es bisher auch getestet hast. Bliebe also nur der Hinweis zu ändern, das der Sicherheitsschlüssel zuvor angelegt werden muss? Möchtest du das für deinen Fall (der wie meiner gelagert ist, Wiki-geleitet) testen?

Grüße, Benno

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Ich habe nun herausgefunden, dass der Fehler in der Befehlszeile der letzte Parameter -y ist.

/lib/cryptsetup/scripts/decrypt_derived root | cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y /dev/sdX2 

muss einen Fehler produzieren, da mit dem Parameter -y ein überprüfen der Passphrase gefordert wird. In LUKS/Schlüsselableitung lautet der Befehl analog auch:

/lib/cryptsetup/scripts/decrypt_derived <Name_des_Ursprungsgeräts> | cryptsetup -c aes-xts-plain64 -s 512 luksFormat <Gerät> 

Von daher sollte der Befehl nach

/lib/cryptsetup/scripts/decrypt_derived root | cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512   /dev/sdX2

geändert werden.

Insofern bezweifle ich, dass der Befehl so bei Dir funktioniert hat - und zwar unabhängig von einem angelegten Sicherheitsschlüssel.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Es wird halt unübersichtlich, zumal in zwei Threads, die aber meines Erachtens dieselbe Ursache hatten. Also: Ich hab es mit dem Umweg über ramfs wie im Wiki gemacht. Ich hatte aber auch Pipes - meines Wissens nach zum Erzeugen von Keydateien, aber auch zum Entschlüsseln damit - mal mit und mal ohne Zwischendatei rumspielend. Mit vorhandenem Sicherheits-PW klappte das alles wie gewünscht.

Sowas wie -y hab ich sicherlich sowieso gleich wieder rausgehauen oder es wird manchmal im Wiki ohne verwendet, wie du schon selber festgestellt hast. Und den Sicherheitskey eben vorher anlegen. Dann sollte alles klappen.

Zum ramfs steht ja nun schon wieder im andren Thema was von wem. 😬 Und eine andere Schreibweise/ Lösung für einen Teil des Problemkomplexes.

lionlizard

Avatar von lionlizard

Anmeldungsdatum:
20. September 2012

Beiträge: 6244

Ich kann leider im Moment außer meinen Hinweisen nichts weiter beitragen, weil ich auf Grund meiner Medikamente derzeit nur eingeschränkt konzentrationsfähig bin. Es wäre schön, wenn sich jemand fände, die Fehler im Wiki zu beseitigen.

ubuntuuser1311161408

Anmeldungsdatum:
16. November 2013

Beiträge: 104

mkdir /etc/initramfs-tools/scripts/luks cp /lib/cryptsetup/scripts/decrypt_derived /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived

Anschließend wird in dieser Kopie anstatt der Variable $1 jeweils nochmal der zur <SDX3_ROOT_VOLUME_ID> gehörende <target name> eingetragen - im folgenden Beispiel wieder root:

sed -i s/\$1/root/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived

Der Befehl ist also unverändert zu übernehmen, lediglich das obige target namens root ist hier einzusetzen oder ggf. an den eigenen Namen anzupassen.

Zuletzt ist noch die Datei cryptroot anzulegen. Dazu führt man folgende Befehle, welche anzupassen sind, aus:

echo "target=root,source=UUID=<SDX3_ROOT_VOLUME_ID>,key=none" >> /etc/initramfs-tools/conf.d/cryptroot echo "target=data,source=UUID=<DATA_VOLUME_ID>,keyscript=/etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived" >> /etc/initramfs-tools/conf.d/cryptroot

In der ersten Zeile wird im Beispiel wieder wie oben das Beispiel root für <target name> eingetragen sowie die UUID <SDX3_ROOT_VOLUME_ID> entsprechend ihrem tatsächlichen Wert eingesetzt. Im zweiten Befehl wird die Partition, welche durch die Schlüsselableitung geöffnet werden soll, eingetragen - in diesem Beispiel unter dem Namen data, wenn also entsprechend die Partition unter dem Namen data (auch nochmal nachzusehen im Verzeichnis /dev/mapper) entschlüsselt wurde. Hier ist ebenfalls mittels blkid dessen <DATA_VOLUME_ID> entsprechend einzusetzen.

Das Befolgen dieser Anleitung führt bei mir leider nicht zur erfolgreichen Schlüsselableitung, sondern zur Fehlermeldung: "/etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived: device root doesn't exist".

Aber mein Rootlaufwerk, von welchem der Schlüssel abgeleitet werden soll, heißt wie in der Anleitung auch root und ist auch unter /dev/mapper/root zu finden. UUIDs sind alle korrekt. Was läuft hier verkehrt oder habe ich die Anleitung nicht richtig verstanden?

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

welche Ubuntu-Version verwendest du?

Gruß, noisefloor

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6497

Hallo,

der Artikel wurde nun diesbezgl. geändert, was auf Korrektheit überprüft werden sollte.

Gruß BillMaier

ubuntuuser1311161408

Anmeldungsdatum:
16. November 2013

Beiträge: 104

welche Ubuntu-Version verwendest du?

18.04 Bionic Beaver

ubuntuuser1311161408

Anmeldungsdatum:
16. November 2013

Beiträge: 104

der Artikel wurde nun diesbezgl. geändert, was auf Korrektheit überprüft werden sollte.

Was genau wurde geändert mit welcher beabsichtigter Auswirkung?

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Es wurde ein Pfad zur Datei ergänzt.

eliro

Anmeldungsdatum:
16. Juli 2018

Beiträge: Zähle...

ubuntuuser1311161408 schrieb:

Das Befolgen dieser Anleitung führt bei mir leider nicht zur erfolgreichen Schlüsselableitung, sondern zur Fehlermeldung: "/etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived: device root doesn't exist".

Diese Fehlermeldung hatte ich auch. Das Problem liegt hier:

Anschließend wird in dieser Kopie anstatt der Variable $1 jeweils nochmal der zur <SDX3_ROOT_VOLUME_ID> gehörende <target name> eingetragen - im folgenden Beispiel wieder root:

sed -i s/\$1/root/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived 

Diese Zeile funktioniert mit der in Bionic Beaver (LTS 18.04) enthaltenen Version von cryptsetup nicht mehr. Zwischen den von Ubuntu ausgelieferten Versionen 1.7.2-0ubuntu4 und 1.7.3-4ubuntu1 (siehe cryptsetup package publishing history) hat sich nämlich das Skript /lib/cryptsetup/scripts/decrypt_derived verändert: Aus dem Block

1
2
3
4
if ! device=$(dmsetup --showkeys table 2>/dev/null | grep "^$1:"); then
	echo "$0: failed to find $1 in dmtable" >&2
	exit 1
fi

ist dabei der Block

1
2
3
4
5
if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="$1" '$1 == target ":" {print}'); then
	echo "$0: failed to find $1 in dmtable" >&2
	exit 1
fi

geworden. In diesem Block dürfen aber nicht alle $1 durch root ersetzt werden, weil das zweite $1 eine durch den awk-Befehl vorbelegte Bedeutung hat (wie man am Syntax-Highlighting des Editors auch gut sieht). Für das Skript /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived sollte dieser Block stattdessen wie folgt aussehen:

1
2
3
4
5
if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="root" '$1 == target ":" {print}'); then
	echo "$0: failed to find root in dmtable" >&2
	exit 1
fi

Mit dieser Änderung konnte ich die Anleitung und damit die Installation erfolgreich durchlaufen.

Für die Anleitung muss der sed-Befehl also geändert werden und wird dadurch etwas komplizierter. Folgende Möglichkeiten kommen mir in den Sinn:

1.

sed -i s/\"\$1\"/\"root\"/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived
sed -i s/\ \$1/\ root/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived 

2.

sed -i s/\'\$1\ ==\ target/tempPlatzhalter/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived
sed -i s/\$1/root/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived
sed -i s/tempPlatzhalter/\'\$1\ ==\ target/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived 

Fällt euch was schöneres oder kürzeres ein?

Hinweis: Neben Bionic Beaver (LTS 18.04) sind wohl auch alle Artful Aardvark-Releases (17.10) betroffen.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Schön, dass das hier jemand weiterpflegt und komisch, dass das Script angepasst wurde und es in Ubuntu immer noch nicht funktioniert - überhaupt, dass es so lange nicht funktioniert. Aber nun gut, das ist ja das Schöne an Open Source und Communities...

Ich musste abends abgelenkt echt eine Weile über deine Zeilen grübeln, weil ich zu faul zum Testen war und vom Sofa aus auch nicht ständig ins Original schaute, wo vieles klarer wurde.

Die Frage ist, ob dann erst mal eine Weile Ruhe ist. Das Wiki tendiert sonst wohl eher dazu, die komplette Datei in Codeblock zu posten. Ich fand sed irgendwie handlicher für Anwender. Wenn man dabei bleiben will, müsste es nochmal einer mit einer Testdatei testen bzw. dir vertrauen. Möglich wäre auch die Angabe von Ersetzungsnummern, hier den 2. Treffer:

$ echo "1 1 1" | sed "s/1/0/2"
1 0 1

Deine erste Variante ist etwas kürzer, man könnte nun ja die beiden probieren und vergleichen. Findet sich keiner, müssten wir den Codeblock einpflegen. Könntest du vielleicht der Zeitersparnis halber auch einfach nochmal für alle einschließlich mir bei deiner ersten Variante erläutern, wieso du den selben Befehl wiederholst, nur einmal ohne Anführungszeichen? Reicht da nicht die ohne, um auch die Ersetzungen an den Stellen mit mit zu erwischen? Eine Kopie der Ein- und Ausgabe im Terminal könnte hier viel bringen. Müsste sonst eben jeder für sich zusammenfummeln. Dann kommen hier ewig keine Antworten.

eliro

Anmeldungsdatum:
16. Juli 2018

Beiträge: 4

Benno-007 schrieb:

Könntest du vielleicht der Zeitersparnis halber auch einfach nochmal für alle einschließlich mir bei deiner ersten Variante erläutern, wieso du den selben Befehl wiederholst, nur einmal ohne Anführungszeichen? Reicht da nicht die ohne, um auch die Ersetzungen an den Stellen mit mit zu erwischen? Eine Kopie der Ein- und Ausgabe im Terminal könnte hier viel bringen.

Jup klar, gerne. ☺ Sorry, dass ich dem ersten Post den Kontext etwas vernachlässigt habe. (Der zitierte sed-Befehl stammte aus der Anleitung und ist derjenige Teil der Anleitung, der nun nicht mehr funktioniert.)

Der zweite Befehl wäre natürlich überflüssig, wenn er nur eine Kopie des ersten ohne die Anführungszeichen wäre. Das ist er aber nicht, denn beim zweiten Befehl steht vor dem $1 ein Leerzeichen!

Hintergrund: Das neue Skript /lib/cryptsetup/scripts/decrypt_derived sieht im Ganzen so aus:

 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
#!/bin/sh

# WARNING: If you use the decrypt_derived keyscript for devices with
# persistent data (i.e. not swap or temp devices), then you will lose
# access to that data permanently if something damages the LUKS header
# of the LUKS device you derive from. The same applies if you luksFormat
# the device, even if you use the same passphrase(s). A LUKS header
# backup, or better a backup of the data on the derived device may be
# a good idea. See the Cryptsetup FAQ on how to do this right.

countlines() {
	local IFS input count tmp
	input="$1"
	count=0
	IFS='
'
	for tmp in $input; do
		count=$(( $count + 1 ))
	done
	echo $count
}

if [ -z "$1" ]; then
	echo "$0: must be executed with a crypto device as argument" >&2
	exit 1
fi

if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="$1" '$1 == target ":" {print}'); then
	echo "$0: failed to find $1 in dmtable" >&2
	exit 1
fi

if [ -z "$device" ]; then
	echo "$0: device $1 doesn't exist" >&2
	exit 1
fi

count=$(countlines "$device")
if [ $count -ne 1 ]; then
	echo "$0: more than one device match $1" >&2
	exit 1
fi

eval set -- $device
type="$4"
key="$6"

if [ "$type" != "crypt" ]; then
	echo "$0: device $1 is not a crypto device" >&2
	exit 1
fi

echo -n "$key"
exit 0

Für die Erstellung des Skripts /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived, das dann beim Booten benötigt wird, soll diese Datei kopiert und dann sollen alle Stellen $1, die für das erste Kommandozeilen-Argument stehen, durch root ersetzt werden. In dem neuen Skript sind das alle auftretenden $1 bis auf das markierte in dem folgenden Block:

if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="$1" '$1 == target ":" {print}'); then
	echo "$0: failed to find $1 in dmtable" >&2
	exit 1
fi

Um alle anderen, aber nicht diese Stelle zu ersetzen, habe ich versucht, ein Alleinstellungsmerkmal dieser Stelle im Vergleich zu den anderen zu finden und folgendes gefunden:

An der markierten Stelle ist das Zeichen davor ein einfaches Anführungszeichen ', alle anderen Stellen sind von der Form "$1" oder ␣$1 (Leerzeichen vor dem Platzhalter!). Wenn wir also diese jeweils durch "root" bzw. ␣root ersetzen, erreichen wir das Gewünschte. Dafür sind die beiden verschiedenen Befehle da.

PS: Ich hab die Änderung mit den beiden Zeilen schon mal in den Wiki-Eintrag eingepflegt. Ich hoffe, das ist ok - falls nicht, macht es bitte erstmal wieder rückgängig.

Anhang

Hier noch die schrittweisen Änderungen des Skripts nach den Befehlen:

$ sed -i s/\"\$1\"/\"root\"/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived 

Datei danach:

#!/bin/sh

# WARNING: If you use the decrypt_derived keyscript for devices with
# persistent data (i.e. not swap or temp devices), then you will lose
# access to that data permanently if something damages the LUKS header
# of the LUKS device you derive from. The same applies if you luksFormat
# the device, even if you use the same passphrase(s). A LUKS header
# backup, or better a backup of the data on the derived device may be
# a good idea. See the Cryptsetup FAQ on how to do this right.

countlines() {
	local IFS input count tmp
	input="root"
	count=0
	IFS='
'
	for tmp in $input; do
		count=$(( $count + 1 ))
	done
	echo $count
}

if [ -z "root" ]; then
	echo "$0: must be executed with a crypto device as argument" >&2
	exit 1
fi

if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="root" '$1 == target ":" {print}'); then
	echo "$0: failed to find $1 in dmtable" >&2
	exit 1
fi

if [ -z "$device" ]; then
	echo "$0: device $1 doesn't exist" >&2
	exit 1
fi

count=$(countlines "$device")
if [ $count -ne 1 ]; then
	echo "$0: more than one device match $1" >&2
	exit 1
fi

eval set -- $device
type="$4"
key="$6"

if [ "$type" != "crypt" ]; then
	echo "$0: device $1 is not a crypto device" >&2
	exit 1
fi

echo -n "$key"
exit 0
sed -i s/\ \$1/\ root/g /etc/initramfs-tools/scripts/luks/get.root_crypt.decrypt_derived  

Datei danach:

#!/bin/sh

# WARNING: If you use the decrypt_derived keyscript for devices with
# persistent data (i.e. not swap or temp devices), then you will lose
# access to that data permanently if something damages the LUKS header
# of the LUKS device you derive from. The same applies if you luksFormat
# the device, even if you use the same passphrase(s). A LUKS header
# backup, or better a backup of the data on the derived device may be
# a good idea. See the Cryptsetup FAQ on how to do this right.

countlines() {
	local IFS input count tmp
	input="root"
	count=0
	IFS='
'
	for tmp in $input; do
		count=$(( $count + 1 ))
	done
	echo $count
}

if [ -z "root" ]; then
	echo "$0: must be executed with a crypto device as argument" >&2
	exit 1
fi

if ! device=$(dmsetup --showkeys table 2>/dev/null \
	| awk -vtarget="root" '$1 == target ":" {print}'); then
	echo "$0: failed to find root in dmtable" >&2
	exit 1
fi

if [ -z "$device" ]; then
	echo "$0: device root doesn't exist" >&2
	exit 1
fi

count=$(countlines "$device")
if [ $count -ne 1 ]; then
	echo "$0: more than one device match root" >&2
	exit 1
fi

eval set -- $device
type="$4"
key="$6"

if [ "$type" != "crypt" ]; then
	echo "$0: device root is not a crypto device" >&2
	exit 1
fi

echo -n "$key"
exit 0

Ich hoffe, das klärt die offenen Fragen. 😉