Wenn ich den Befehl Cryptsetup ausführe, wird die Befehlszeilenausgabe angezeigt: „Geben Sie eine beliebige vorhandene Passphrase ein:“.
Ich möchte dies von der Konsole in mein Skript einlesen und die Passphrase aus dem Skript selbst übergeben, da ich viele Partitionen entschlüssele und es nicht machbar ist, den Benutzer jedes Mal zur Eingabe der Passphrase aufzufordern.
Befehlsausführung:
cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile
Geben Sie eine vorhandene Passphrase ein:
Ich bin für jede Hilfe dankbar.
Antwort1
Meine Antwort basiert auf der benötigten Linux-Kernel-FunktionCONFIG_KEYS
.
Dort steht für Ihr gewünschtes Anliegen ein Keyscript-Befehl zur Verfügung:
https://github.com/gebi/keyctl_keyscript
Es verwendet dieKernel-Schlüsselaufbewahrungsdienst(welches warschon lange da) mit dem Befehlkeyctl
um die Passphrase abzufragen und vorübergehend im Speicher zu speichern, falls sie noch nicht gefunden wurde, und sie für alle damit verbundenen Aufrufe mehrerer cryptsetup
Befehle zu verwenden. Es ist wahrscheinlich in den meisten Distributionen enthalten (z. B.: bei Debian das PaketVerschlüsselungssetuphat es als /lib/cryptsetup/scripts/decrypt_keyctl
).
/etc/crypttab
Normalerweise würden Sie es in die Distribution integriert und in einer Datei wie im folgenden Beispiel konfiguriert verwenden :
test1 /dev/sda1 test_pw luks,keyscript=decrypt_keyctl test2 /dev/sda2 test_pw luks,keyscript=decrypt_keyctl test3 /dev/sda3 test_other_pw luks,keyscript=decrypt_keyctl
Dies würde dazu führen, dass für Test1 eine Passphrase abgefragt wird, die Antwort für Test2 wiederverwendet wird (weil die Schlüssel-ID mit der vorherigen identisch ist und die Passphrase bereits angegeben wurde) und für Test3 eine neue Frage gestellt wird.
Wenn Sie dieses Tool nun direkt und nicht über die Systemintegration verwenden möchten, können Sie den Befehl ausführen und direkt an weiterleiten cryptsetup
.
AKTUALISIEREN: Geben Sie ein vollständiges Beispiel ein, das mit Ausnahme der wenigen Werte, die von der Umgebung abhängen (hier /dev/loop0
und 969933847
), reproduziert werden kann:
Erstellen Sie ein LUKS-Testgerät aus einer gefälschten Festplatte.Sei sehr vorsichtigDaslosetup
Genau genommendieses Beispiel zurückgegeben /dev/loop0
oder abgebrochen:
# dd if=/dev/zero seek=$(( 2 ** 30 - 1 )) bs=1 count=1 of=/tmp/block.img
1+0 records in
1+0 records out
1 byte copied, 6.0997e-05 s, 16.4 kB/s
# losetup --find --show /tmp/block.img
/dev/loop0
# echo -n goodpass | cryptsetup luksFormat /dev/loop0
# cryptsetup luksDump /dev/loop0
LUKS header information for /dev/loop0
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 256
MK digest: 4e 98 86 0b bf 63 3f 68 08 f5 cc 4f 61 ec 8c 19 71 c3 2a 33
MK salt: dc ce 7b a1 56 79 70 c5 02 ad ec 4c 85 c1 6f c1
af 50 f3 8c 89 b9 a9 3a 02 62 5c 2d 3f 7a 9d 52
MK iterations: 312000
UUID: 61a3a890-9564-4c98-866a-1216474b839e
Key Slot 0: ENABLED
Iterations: 2467468
Salt: 04 82 b5 b7 0b 90 e4 62 45 96 e3 c3 ef ba 6d 66
1d 93 6b e0 e9 03 40 3d 39 b9 fe 2c 6f 9e 46 e4
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Versuchen Sie nun, Operationen darauf auszuführen, indem Sie verwenden decrypt_keyctl
. Die Prassphrase ist wie zuvor festgelegt: goodpass
. Beachten Sie, dass dies /etc/crypttab
für dieses direkt ausgeführte Beispiel weder verwendet noch benötigt wird (auf der modifizierten Version von Debian 9, hier mit zwei Variablen, um eine harmlose Warnung zu vermeiden und trotzdem ein kosmetisches „Beispiel“ auszugeben, wenn es außerhalb der erwarteten Umgebung verwendet wird):
# echo -n securepass > /tmp/newkey
# export CRYPTTAB_TRIED=0 CRYPTTAB_SOURCE=example
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Caching passphrase for example: ********
# cryptsetup close test1
# cryptsetup status test1
/dev/mapper/test1 is inactive.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksAddKey /dev/loop0 /tmp/newkey
Using cached passphrase for example.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Using cached passphrase for example.
# cryptsetup status test1
/dev/mapper/test1 is active.
type: LUKS1
cipher: aes-xts-plain64
keysize: 256 bits
device: /dev/loop0
loop: /tmp/block.img
offset: 4096 sectors
size: 2093056 sectors
mode: read/write
Natürlich können Sie auch direkt verwenden keyctl
. Hier ist ein (wirklich schlechtes) Beispiel, das immer noch das vorherige Luks-Gerät verwendet und direkt im Anschluss ausgeführt werden kann:
# cryptsetup close test1
# echo -n goodpass | keyctl padd user lazy @u
969933847
# keyctl timeout 969933847 120
# keyctl pipe 969933847 | cryptsetup luksOpen /dev/loop0 test1 && echo OK
OK
# keyctl pipe 969933847 | cryptsetup luksAddKey /dev/loop0 /tmp/newkey && echo OK
OK
# keyctl clear @u
Aufräumen:
# cryptsetup close test1
# losetup -d /dev/loop0
# rm /tmp/block.img