En corto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Respaldo del header (no hace falta abrir el volumen)
cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /root/sdb-luks-header.img

# Slots en uso
cryptsetup luksDump /dev/sdb

# Llaves
cryptsetup luksAddKey /dev/sdb                      # otra passphrase (pide una existente)
cryptsetup luksAddKey /dev/sdb /root/keyfile.bin    # un keyfile en un slot nuevo
cryptsetup luksChangeKey /dev/sdb                   # sustituir una passphrase por otra, mismo slot
cryptsetup luksRemoveKey /dev/sdb                   # quitar la passphrase que escribas
cryptsetup luksKillSlot /dev/sdb 2                  # quitar el slot 2 sin conocer su passphrase (pide otra)

# Restaurar el header
cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /root/sdb-luks-header.img

Después de cualquier cambio de llaves, respalda el header otra vez y destruye el backup anterior. Restaurar un backup viejo reactiva todas las passphrases que tenía en ese momento, incluidas las que quitaste.

Por qué el header lo es todo

LUKS no cifra los datos con tu passphrase: los cifra con una master key aleatoria, y esa master key va cifrada dentro del header, una copia por slot, cada una protegida por una passphrase o keyfile. El header ocupa los primeros 16 MiB del dispositivo en LUKS2 (2 MiB en LUKS1).

Si esos megabytes se dañan (un dd equivocado, un mkfs sobre el disco crudo, sectores muertos justo ahí), la master key desaparece y los datos se vuelven ruido irrecuperable, aunque sepas la passphrase. Un backup del header, guardado en otro sitio, es la única póliza. El archivo pesa lo mismo que el header y no contiene datos, solo la master key cifrada.

Respaldar y restaurar

1
2
cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /root/sdb-luks-header.img
cryptsetup luksDump /root/sdb-luks-header.img         # el backup se puede inspeccionar como un dispositivo

Guárdalo fuera de la máquina, cifrado (un gpg -c basta) y con nombre que diga de qué disco es. Restaurar:

1
cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /root/sdb-luks-header.img

Solo repara el header. Si el accidente pasó más allá de los primeros 16 MiB, lo que hubiera ahí sigue perdido.

Slots y llaves

LUKS2 tiene 32 slots (0–31); LUKS1, 8. Todos abren la misma master key, así que da igual con cuál entres:

1
2
cryptsetup luksDump /dev/sdb | sed -n '/^Keyslots:/,/^Tokens:/p'
cryptsetup open --test-passphrase -v /dev/sdb         # "Key slot 0 unlocked": qué slot usa tu passphrase

Keyfile para abrir sin teclear (típico en un disco de datos que arranca con el sistema):

1
2
3
dd if=/dev/urandom bs=32 count=1 of=/root/keyfile.bin
chmod 0400 /root/keyfile.bin
cryptsetup luksAddKey /dev/sdb /root/keyfile.bin

Y en /etc/crypttab:

1
datos  UUID=<uuid-del-luks>  /root/keyfile.bin  luks

Prueba sin reiniciar: systemctl daemon-reload && systemctl start systemd-cryptsetup@datos.service. El keyfile en /root solo tiene sentido si / también está cifrado o el disco es de una máquina que confías físicamente.

Quitar llaves:

  • luksRemoveKey pide la passphrase que quieres eliminar.
  • luksKillSlot <n> elimina un slot concreto y pide otra passphrase válida; sirve cuando la del slot ya nadie la recuerda.
  • luksChangeKey cambia una passphrase por otra en el mismo slot.

Trampas

  • El backup del header conserva las llaves viejas. Quitaste la passphrase de un ex compañero y el backup de antes sigue en un USB: ese USB abre el disco. Re-respalda tras cada cambio y destruye los anteriores (shred -u).
  • luksErase no es borrado seguro si existe un backup del header. Destruye todos los slots del disco, pero un luksHeaderRestore los devuelve. Para un borrado definitivo, además, destruye los backups.
  • No mates el último slot. cryptsetup avisa de que el dispositivo quedará inutilizable; si aceptas, ya está.
  • El backup en el mismo disco no es backup. Ni en el mismo servidor si lo que temes es perder el servidor.
  • Header separado (--header /ruta/header.img al formatear y al abrir) mueve el header fuera del disco por completo; entonces el “backup” es el propio header y perderlo equivale a perder los datos.
  • LUKS1 vs LUKS2: los comandos son los mismos; cryptsetup convert --type luks2 migra un LUKS1 (con backup antes, claro).

Referencia: man 8 cryptsetup, secciones luksHeaderBackup, luksHeaderRestore y luksKillSlot.