Bo día e noite a todos! Esta publicación será útil para aqueles que usan o cifrado de datos LUKS e queren descifrar discos en Linux (Debian, Ubuntu) en etapas de descifrado da partición raíz. E non puiden atopar esa información en Internet.
Máis recentemente, co aumento do número de discos nos andeis, topeime co problema de descifrar discos mediante o máis que coñecido método a través de /etc/crypttab. Persoalmente, destaco algúns problemas co uso deste método, é dicir, que o ficheiro está sendo lido só despois de cargar (montar) a partición raíz, que afecta negativamente ás importacións de ZFS, en particular se foron construídas a partir de particións no dispositivo *_crypt, ou as incursións de mdadm construídas tamén a partir de particións. Todos sabemos que podes usar parted nos contedores LUKS, non? E tamén o problema do inicio temperán doutros servizos, cando aínda non hai matrices, pero uso Xa necesito algo (traballo con Proxmox VE 5.x e ZFS agrupados sobre iSCSI).
Un pouco sobre ZFSoverISCSIiSCSI funciona para min a través de LIO e, de feito, cando o destino iscsi se inicia e non ve dispositivos ZVOL, simplemente elimínaos da configuración, o que impide que os sistemas convidados se inicien. Polo tanto, restaurar unha copia de seguridade de ficheiros JSON ou engadir manualmente dispositivos con identificadores para cada máquina virtual, o que é simplemente terrible cando hai decenas de máquinas deste tipo e cada configuración ten máis de 1 disco.
E a segunda cuestión que vou considerar é como descifrar (este é o punto clave do artigo). E disto falaremos a continuación, vai por debaixo do corte!
Na maioría das veces, en Internet utilízase un ficheiro de chave (engadido ao slot antes disto polo comando - cryptsetup luksAddKey), ou en raras excepcións (na Internet en ruso hai moi pouca información) - o script decrypt_derived situado en /lib/cryptsetup/script/ (por suposto, hai outras formas, pero usei estas dúas, que formaron a base do artigo). Tamén me esforcei por unha inclusión autónoma completa despois dos reinicios, sen ningún comando adicional na consola, para que todo "voase" á vez. Polo tanto, por que esperar? —
Comecemos!
Supoñamos un sistema, como Debian, instalado nunha partición criptográfica sda3_crypt e unha ducia de discos listos para ser cifrados e creados ao teu gusto. Temos unha frase de paso (frase de acceso) para desbloquear sda3_crypt, e é desde esta partición que eliminaremos o "hash" do contrasinal do sistema en execución (descifrado) e engadilo ao resto dos discos. Todo é elemental, na consola executamos:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX
onde X é os nosos discos, particións, etc.
Despois de cifrar os discos cun "hash" da nosa frase de paso, cómpre descubrir o UUID ou ID, dependendo de quen está afeito a que e a que. Tomamos datos de /dev/disk/by-uuid e by-id respectivamente.
O seguinte paso é preparar ficheiros e mini-scripts para as funcións que necesitamos para traballar, imos continuar:
cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/
máis
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt
Contido de ../decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"
máis
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy
O contido de ../partcopy
#!/bin/sh
cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"
un pouco máis
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe
Contido ../partprobe
#!/bin/sh
$DESTDIR/bin/partprobe
e por último, antes de update-initramfs, cómpre editar o ficheiro /etc/initramfs-tools/scripts/local-top/cryptroot, comezando pola liña ~360, fragmento de código a continuación
Orixinal
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
e traelo a esta forma
Editado
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*
message "cryptsetup ($crypttarget): set up successfully"
break
Teña en conta que aquí pódese usar o UUID ou o ID. O principal é que os controladores necesarios para os dispositivos HDD / SSD engádense a /etc/initramfs-tools/modules. Podes descubrir que controlador se está a usar co comando udevadm info -a -n /dev/sdX | egrep 'mirando|CONDUTOR'.
Agora que rematamos e todos os ficheiros están no seu lugar, executa actualizar-initramfs -u -k todo -v, no rexistro non debe ser erros de execución dos nosos scripts. Reiniciamos, introducimos a contrasinal e agardamos un pouco, dependendo do número de discos. A continuación, o sistema iniciarase e na fase final do lanzamento, é dicir, despois de "montar" a partición raíz, executarase o comando partprobe: atopará e recollerá todas as particións creadas nos dispositivos LUKS e calquera matriz, xa sexa ZFS ou mdadm, montarase sen problemas! E todo isto antes de cargar servizos e servizos fundamentais que precisan destes discos/matrices.
actualización1: Como
Fonte: www.habr.com