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 comandokeyctl
para 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 cryptsetup
comandos. 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/crypttab
archivo 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/loop0
y 969933847
):
Cree un dispositivo LUKS de prueba a partir de un disco falso.Ten mucho cuidadoesolosetup
de hechodevolvió /dev/loop0
o 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/crypttab
no 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