Descriptografando um contêiner LUKS no momento da inicialização do sistema

Bom dia e noite a todos! Este post será útil para quem usa criptografia de dados LUKS e deseja descriptografar discos no Linux (Debian, Ubuntu) em estágios de descriptografia da partição raiz. E não consegui encontrar essas informações na Internet.

Mais recentemente, com o aumento do número de discos nas prateleiras, me deparei com o problema de descriptografar discos usando o método mais do que conhecido através de /etc/crypttab. Pessoalmente, destaco alguns problemas com o uso desse método, ou seja, que o arquivo está sendo lido somente após carregar (montar) a partição raiz, que afeta negativamente as importações do ZFS, em particular se elas foram construídas a partir de partições no dispositivo *_crypt, ou raids mdadm construídas a partir de partições também. Todos nós sabemos que você pode usar parted em containers LUKS, certo? E também o problema do início antecipado de outros serviços, quando ainda não há arrays, mas usar Já preciso de algo (trabalho com Proxmox VE 5.x em cluster e ZFS sobre iSCSI).

Um pouco sobre o ZFSoverISCSIO iSCSI funciona para mim por meio do LIO e, de fato, quando o destino iscsi é iniciado e não vê os dispositivos ZVOL, ele simplesmente os remove da configuração, o que impede a inicialização dos sistemas convidados. Portanto, restaurar um backup de arquivo json ou adicionar dispositivos manualmente com identificadores para cada VM, o que é simplesmente terrível quando existem dezenas dessas máquinas e cada configuração possui mais de 1 disco.

E a segunda questão que considerarei é como descriptografar (este é o ponto-chave do artigo). E falaremos sobre isso abaixo, vá por baixo do corte!

Na maioria das vezes, na Internet, um arquivo de chave é usado (adicionado automaticamente ao slot antes disso pelo comando - cryptsetup luksAddKey) ou em raras exceções (na Internet em russo há muito pouca informação) - o script decrypt_derived localizado em /lib/cryptsetup/script/ (claro que existem outras formas, mas usei essas duas, que formaram a base do artigo). Também me esforcei para uma inclusão totalmente autônoma após as reinicializações, sem nenhum comando adicional no console, para que tudo “voasse” para mim de uma vez. Portanto, por que esperar? —

Vamos começar!

Vamos supor um sistema, como o Debian, instalado em uma partição de criptografia sda3_crypt e uma dúzia de discos prontos para serem criptografados e criados para o conteúdo do seu coração. Temos uma frase secreta (senha) para desbloquear sda3_crypt, e é dessa partição que removeremos o “hash” da senha no sistema em execução (descriptografado) e adicioná-lo ao restante dos discos. Tudo é elementar, no console executamos:

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

onde X são nossos discos, partições, etc.

Depois de criptografar os discos com um "hash" de nossa senha, você precisa descobrir o UUID ou ID - dependendo de quem está acostumado com o quê e o quê. Pegamos dados de /dev/disk/by-uuid e by-id, respectivamente.

O próximo passo é preparar arquivos e mini-scripts para as funções que precisamos para trabalhar, vamos prosseguir:

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/

далее

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

Conteúdo de ../descriptografar

#!/bin/sh

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

далее

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

O conteúdo 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"

um pouco mais

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 de atualizar-initramfs, você precisa editar o arquivo /etc/initramfs-tools/scripts/local-top/cryptroot, começando na linha ~360, 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 trazê-lo para este formulário

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

Observe que UUID ou ID podem ser usados ​​aqui. O principal é que os drivers necessários para dispositivos HDD / SSD sejam adicionados a /etc/initramfs-tools/modules. Você pode descobrir qual driver está sendo usado com o comando udevadm info -a -n /dev/sdX | egrep 'olhando | DRIVER'.

Agora que terminamos e todos os arquivos estão no lugar, execute atualizar-initramfs -u -k all -v, em log não deveria ser erros de execução de nossos scripts. Reiniciamos, digitamos a senha e esperamos um pouco, dependendo do número de discos. Em seguida, o sistema será iniciado e no estágio final do lançamento, ou seja, após “montar” a partição raiz, o comando partprobe será executado - ele encontrará e selecionará todas as partições criadas nos dispositivos LUKS e quaisquer matrizes, seja ZFS ou mdadm, será montado sem problemas! E tudo isso antes de carregar serviços principais e serviços que precisam desses discos/arrays.

update1: Quão notado AEP, esse método funciona apenas para LUKS1.

Fonte: habr.com

Adicionar um comentário