Wie kann ich ein Passwort einmal lesen und es dann wiederholt an den Befehl cryptsetup weitergeben?

Wie kann ich ein Passwort einmal lesen und es dann wiederholt an den Befehl cryptsetup weitergeben?

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 Befehlkeyctlum 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 cryptsetupBefehle 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/crypttabNormalerweise 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/loop0und 969933847), reproduziert werden kann:

Erstellen Sie ein LUKS-Testgerät aus einer gefälschten Festplatte.Sei sehr vorsichtigDaslosetup Genau genommendieses Beispiel zurückgegeben /dev/loop0oder 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/crypttabfü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

verwandte Informationen