Descriptografia do container LUKS no momento da inicialização do sistema

A todos um bom dia, boa noite! Este post será útil para aqueles que utilizam a criptografia de dados LUKS e desejam realizar a descriptografia de discos no Linux (Debian, Ubuntu) em estágio de descriptografia da partição root. E não consegui encontrar tais informações na internet.

Recentemente, com o aumento do número de discos nas prateleiras, enfrentei o problema de descriptografar discos usando o método bem conhecido através de /etc/crypttab. Pessoalmente, destaco alguns problemas no uso deste método, nomeadamente o fato de que o arquivo é lido apenas após o carregamento (mount) da partição root, o que afeta negativamente a importação do ZFS, especialmente se foram construídos a partir de partições em dispositivos *_crypt, ou em arrays mdadm, que também foram criados a partir de partições. Todos nós sabemos que é possível usar parted em contêineres LUKS? E também o problema do início precoce de outros serviços, quando os arrays ainda não estão prontos e utilizados já é necessário algo (eu trabalho com Proxmox VE 5.x clusterizado e ZFS sobre iSCSI).

Um pouco sobre ZFS sobre iSCSIiSCSI funciona para mim através do LIO, e quando o iscsi-target inicia e não vê os dispositivos ZVOL, eles simplesmente são removidos da configuração, o que não permite que as máquinas guest iniciem. Portanto, ou restauração do arquivo de backup json, ou adição manual de dispositivos com os identificadores de cada VM, o que é simplesmente horrível quando essas máquinas são dezenas e em cada configuração há mais de 1 disco.

E a segunda questão que vou abordar é como realizar a descriptografia (este é o ponto chave do artigo). E sobre isso vamos falar abaixo, venha conferir!

Na maioria das vezes, na vastidão da internet, utiliza-se um arquivo-chave (obviamente adicionado anteriormente ao slot com o comando — cryptsetup luksAddKey), ou em raras exceções (na internet de língua russa há informações muito escassas) — o script decrypt_derived, localizado em /lib/cryptsetup/script/ (claro, existem outros métodos, mas usei exatamente esses dois, que serviram como base para o artigo). Também busquei a ativação completa e autônoma após reinicializações, sem quaisquer comandos adicionais no console, para que tudo 'subisse' de uma vez. Então, por que esperar? —

Vamos começar!

Suponhamos um sistema, por exemplo, Debian, instalado na partição criptografada sda3_crypt e uma dezena de discos prontos para criptografia e criação do que desejar. Temos uma frase-chave (passphrase) para desbloquear sda3_crypt e é desta partição que iremos extrair o "hash" da senha em um sistema iniciado (descriptografado) e adicionar nos demais discos. Tudo é simples, execute no console:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

onde X é nossos discos, partições, etc.

Após criptografar os discos com o "hash" da nossa frase-chave, é necessário descobrir o UUID ou ID — dependendo do que cada um está acostumado. Vamos obter os dados de /dev/disk/by-uuid e by-id, respectivamente.

A próxima etapa é preparar arquivos e mini-scripts para executar as funções necessárias, vamos começar:

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/

em seguida

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Conteúdo ..../decrypt

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

em seguida

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Conteúdo ..../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"

mais um pouco

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Conteúdo ..../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

e por último, antes do update-initramfs, precisamos editar o arquivo /etc/initramfs-tools/scripts/local-top/cryptroot, a partir da linha ~360, o trecho de código abaixo

Original


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

e o transformamos nesse formato

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

Note que aqui podemos usar tanto UUID quanto ID. O importante é que os drivers necessários para os dispositivos HDD/SSD estejam adicionados em /etc/initramfs-tools/modules. Para saber qual driver está em uso, utilize o comando udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.

Agora que terminamos e todos os arquivos estão no lugar, vamos executar update-initramfs -u -k all -v, no log não deve haver erros na execução de nossos scripts. Reiniciamos, inserimos a frase-chave e esperamos um pouco, dependendo da quantidade de discos. Em seguida, o sistema será iniciado e na fase final de inicialização, ou seja, após o "montagem" da partição root, o comando partprobe será executado — ele localizará e conectará todas as partições criadas em dispositivos LUKS e quaisquer arrays, sejam ZFS ou mdadm, se conectarão sem problemas! E tudo isso antes do carregamento dos principais serviços e aplicações que necessitam desses discos/arrays.

update1: Como notou AEP, este método funciona apenas para LUKS1.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster