Usando una sola frase de contraseña para desbloquear múltiples discos encriptados en el arranque

23

Mi máquina tiene una SSD, donde instalé el sistema y una HDD, que uso como almacenamiento para archivos grandes y / o de uso poco frecuente. Ambos están encriptados, pero elegí usar la misma frase de contraseña para ellos. SSD está montado en /y HDD en /usr/hdd(los usuarios individuales tienen un directorio y pueden crear enlaces simbólicos como quieran desde el directorio de inicio).

Cuando el sistema se inicia, inmediatamente solicita una frase de contraseña para el SSD, y solo un par de segundos más tarde para la del HDD (se monta automáticamente). Dado que ambas frases de contraseña son iguales, ¿hay alguna forma de configurar el sistema para que pregunte solo una vez?

doble
fuente
Posiblemente podría escribir un expectscript o similar que se llame para montar los discos en lugar de que el sistema lo haga. En cambio, el sistema llamará al script que solicitará la contraseña, la almacenará y la proporcionará a cada una de las operaciones de montaje.
h3rrmiller
Si entiendo su idea correctamente, no se puede aplicar a la SSD, ya que desde allí se inicia el sistema. Pero luego se vuelve inútil, ya que aún necesitaría escribir la frase de contraseña para el HDD por separado. ¿O no?
doublep
Puede usar /etc/crypttab para desbloquear la segunda unidad .
jasonwryan
1
@jasonwryan si eso se puede expandir a una respuesta, entonces ... las respuestas deben publicarse como respuestas, no como comentarios.
derobert
1
@derobert a veces las personas no tienen el tiempo o la inclinación para escribir una buena respuesta.
jasonwryan

Respuestas:

24

Distribuciones basadas en Debian:

Debian y Ubuntu envían un script de almacenamiento en caché de contraseña decrypt_keyctl con el paquete cryptsetup .

El script decrypt_keyctl proporciona la misma contraseña para múltiples objetivos LUKS encriptados, evitando que la escriba varias veces. Se puede habilitar en crypttab con la keyscript=decrypt_keyctlopción. La misma contraseña se utiliza para destinos que tienen el mismo identificador en el campo de archivo de claves . En el arranque se solicita una contraseña para cada identificador una vez.

Un ejemplo de crypttab :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

Después de actualizar su criptab , también deberá actualizar initramfs para aplicar los cambios. Uso update-initramfs -u.

El archivo Léame completo para decrypt_keyctl se encuentra en /usr/share/doc/cryptsetup/README.keyctl

Desafortunadamente, esto actualmente no funciona en los sistemas Debian que usan systemd init debido a un error (otros sistemas init no deberían verse afectados). La página de manual de Debian crypttab sugiere como una solución alternativa para usar la initramfsopción de forzar el procesamiento en la etapa initramfs de arranque.


Distribuciones que no proporcionan la secuencia de comandos decrypt_keyctl :

Si su distribución no proporciona decrypt_keyctrl , el dispositivo se puede desbloquear utilizando un archivo de claves en el sistema de archivos raíz cifrado. Esto cuando el sistema de archivos raíz se puede desbloquear y montar antes que cualquier otro dispositivo encriptado.

LUKS admite múltiples ranuras de teclas. Esto le permite desbloquear alternativamente el dispositivo con contraseña si el archivo de clave no está disponible / se perdió.

  1. Genere la clave con datos aleatorios y configure sus permisos para que el propietario pueda leerlos solo para evitar filtrarlos. Tenga en cuenta que el archivo de clave debe estar en la partición raíz que se desbloquea primero.

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. Agregue la clave a su dispositivo LUKS

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. Configure crypttab para usar el archivo de clave. La primera línea debe ser el dispositivo raíz, ya que los dispositivos se desbloquean en el mismo orden que se enumera en crypttab . Use rutas absolutas para los archivos clave.

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    
sebasth
fuente
Desde las primeras líneas del archivo Léame parece muy prometedor, gracias. Comprobaré esto mañana (no quiero reiniciar ahora).
doublep
Desafortunadamente, no funciona (como en ningún cambio). Vea micrypttab (no toqué UUID=creado por el instalador del sistema, supongo que no debería importar) y las entradas resultantes/var/log/syslog . Los errores son algo comprensibles, pero no tengo idea de qué hacer con ellos. El archivo /lib/cryptsetup/scripts/decrypt_keyctlexiste, así que no sé por qué se queja de una opción desconocida. También tengo ni idea de lo que vaya a especificar como archivo de claves, no veo ninguna explicación en cualquier lugar ...
doublep
¿Verificó que decrypt_keyctl se incluye en initramfs? Verifíquelo usando la opción detallada al actualizar la imagen: update-initramfs -u -k $(uname -r) -vdebería salir Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth
1
Para ver qué contiene initramfs:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth
3
Uh, lo siento, ahora que he pagado más atención a lo update-initramfsdicho, me di cuenta de esto: E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. Después de buscar un poco en Google, descubrí que probablemente necesito un keyutilspaquete (realmente no estaba instalado). Ahora update-initramfstiene éxito y lsinitramfslo menciona decrypt_keytls. Se actualizará después del próximo arranque (probablemente mañana).
doublep
3

Aquí está mi solución en Debian, dado el error al que hace referencia anteriormente @sebasth.

Mi configuración es ligeramente diferente. Tengo una partición raíz encriptada y un montón de discos RAID. Para mí, tuve que agregar una opción initramfs al crypttab:

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

Esto le dice a update-initramfs que quiero tener estas entradas crypttab montadas en initramfs. Verifiqué mi ficha de cifrado ejecutando

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

Tenga en cuenta que mis discos de incursión son simples dm-crypt. Esto significaba que no podía usar el método de archivo de claves de luks que funciona alrededor del error del script del sistema. Para dm-crypt simple, tendría que almacenar la frase de contraseña en texto sin formato.

Los discos cifrados deben montarse antes de update-initramfsejecutarse; de lo contrario arrojará errores. Tuve que buscar las siguientes líneas cuando se creó mi initramfs:

update-initramfs -k -u -v | grep 'keyctl'

que mostró los siguientes dos archivos:

/bin/keyctl
cryptkeyctl

siendo agregado a initramfs.

Finalmente, tuve que deshabilitar systemd manejando mi crypttab, para lidiar con el error mencionado anteriormente: systemd no soporta la opción keycript en crypttab. Para esto, agregué la opción de kernel

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

a / etc / default / grub y se ejecutó update-grub. systemd ahora ignora crypttab, y todas las particiones encriptadas se cargan en initramfs.

Debido a que tengo una partición raíz encriptada, cryptroot no parece almacenar en caché mi clave. Esto significa que tengo que ingresar mi contraseña dos veces; uno para la partición raíz y una vez para mi matriz de incursiones.

usuario128063
fuente
1

Otra opción es usar el /lib/cryptsetup/scripts/decrypt_derivedscript, que también es parte de cryptsetup en Debian / Ubuntu.

En lugar de almacenar en caché la clave, utiliza la clave de volumen de un disco como contraseña adicional para el segundo disco. Esto requiere agregar una segunda contraseña al segundo disco cifrado (y tercero, etc.), pero LUKS lo admite. Por lo tanto, esta solución también funciona si sus múltiples discos encriptados no usan la misma contraseña.

Ejemplo para agregar la clave de sda6crypt a sda5:

Agregue la clave de volumen de sda6crypt como contraseña adicional para sda5:

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

Configure sda5crypt para que se desbloquee automáticamente en /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

Esto usa una tubería con nombre ( fifo) para pasar la clave para evitar tener que almacenar la clave de volumen en un archivo temporal en el disco.

La keyscriptopción solo funciona si crypttabes procesada por las herramientas de configuración de cifrado originales de Debian, la reimplementación systemd actualmente no es compatible. Si su sistema usa systemd (que es la mayoría de los sistemas), necesita la initramfsopción de forzar el procesamiento en el initrd por las herramientas cryptsetup, antes de que se inicie systemd.

Basado en /unix//a/32551/50793

JanKanis
fuente
Debo decir que esta es una solución hermosa. ¡Funcionó desde el principio sin problemas en Debian 10 Buster!
Janus