¿Cómo puedo leer una contraseña una vez y luego pasarla al comando cryptsetup repetidamente?

¿Cómo puedo leer una contraseña una vez y luego pasarla al comando cryptsetup repetidamente?

Cuando ejecuto el comando cryptsetup, responde con una salida de línea de comando: "Ingrese cualquier frase de contraseña existente:".

Quiero leer esto desde la consola en mi secuencia de comandos y pasar la frase de contraseña desde la secuencia de comandos, ya que estoy descifrando muchas particiones y no es factible pedirle al usuario que ingrese la frase de contraseña cada vez.

Ejecución de comando:

cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile

Ingrese cualquier frase de contraseña existente:

Agradecemos cualquier ayuda sobre esto.

Respuesta1

Mi respuesta se basa en la característica necesaria del kernel de Linux.CONFIG_KEYS.

Hay un comando de secuencia de comandos destinado a lo que desea disponible allí:

https://github.com/gebi/keyctl_keyscript

Utiliza elServicio de retención de claves del kernel(que ha sidoalrededor por mucho tiempo) con el comandokeyctlpara solicitar y almacenar temporalmente la frase de contraseña en la memoria si aún no se encuentra, y utilizarla para cualquier invocación relacionada de múltiples cryptsetupcomandos. Probablemente esté incluido en la mayoría de las distribuciones (por ejemplo: en Debian, el paqueteconfiguración de criptalo tiene como /lib/cryptsetup/scripts/decrypt_keyctl).

Normalmente lo usarías integrado dentro de la distribución y configurado en un /etc/crypttabarchivo como el ejemplo dado:

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

Lo que provocaría que se solicite una frase de contraseña para la prueba1, se reutilice la respuesta en la prueba2 (porque su ID de clave es la misma que la anterior y la frase de contraseña ya se proporcionó) y se haga una nueva pregunta para la prueba3.

Ahora, si desea utilizar esta herramienta directamente, no junto con la integración del sistema, puede ejecutar el comando y canalizarlo directamente a cryptsetup.

ACTUALIZAR: Ponga un ejemplo completo que se pueda reproducir excepto por unos pocos valores que dependerán del entorno (aquí /dev/loop0y 969933847):

Cree un dispositivo LUKS de prueba a partir de un disco falso.Ten mucho cuidadoesolosetup de hechodevolvió /dev/loop0o abortó este ejemplo:

# 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

Ahora intente realizar operaciones en él usando decrypt_keyctl. La frase es la establecida anteriormente: goodpass. Tenga en cuenta que /etc/crypttabno se usa ni es necesario para que este ejemplo se ejecute directamente (en la versión modificada de Debian 9, aquí con dos variables para evitar una advertencia inofensiva y aun así imprimir un "ejemplo" cosmético cuando se usa fuera del entorno esperado):

# 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

Por supuesto, incluso podrías usarlo directamente keyctl, aquí hay un ejemplo siguiente (realmente malo) que aún usa el dispositivo luks anterior, que se puede hacer inmediatamente después:

# 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

Limpiar:

# cryptsetup close test1
# losetup -d /dev/loop0    
# rm /tmp/block.img

información relacionada