Decodificando o contêiner LUKS no momento da inicialização

Bom dia noite Esta publicação será útil para quem usa a criptografia de dados LUKS e deseja descriptografar os discos descriptografados no Linux (Debian, Ubuntu) no estágio de descriptografar a partição raiz . E não consegui encontrar essa informação na Internet.

Mais recentemente, com o aumento do número de discos nas prateleiras, encontrei o problema de descriptografar discos usando o método mais conhecido via / etc / crypttab. Pessoalmente, destaco vários problemas ao usar esse método, a saber, que o arquivo é lido somente após a montagem da partição raiz (montagem) , o que afeta negativamente a importação do ZFS, principalmente se eles foram coletados de partições no dispositivo * _crypt ou mdadm raids coletados também das seções. Todos nós sabemos que você pode usar parted em contêineres LUKS? E também o problema do início precoce de outros serviços quando ainda não há matrizes, mas algo precisa ser usado (eu trabalho com o Proxmox VE 5.xe o ZFS em cluster e o ZFS sobre o iSCSI).

Um pouco sobre o ZFSoverISCSI
O iSCSI funciona para mim através do LIO e, na verdade, quando o destino iscsi é iniciado e não vê os dispositivos ZVOL, ele simplesmente os remove da configuração, o que impede o carregamento dos sistemas convidados. Portanto, restaurando um backup de arquivo json ou adicionando manualmente dispositivos com os identificadores de cada VM, o que é horrível quando existem dezenas dessas máquinas e há mais de um disco na configuração de cada uma.

E a segunda pergunta que considerarei é como descriptografar (este é o ponto principal do artigo). E falaremos sobre isso abaixo, vamos ao que interessa!

Geralmente, na Internet, eles usam um arquivo de chave (o comando cryptsetup luksAddKey adicionado ao slot antes de si) ou em raras exceções (o idioma russo é uma informação muito escassa) - o script decrypt_derived, que está em / lib / cryptsetup / script / (é claro, ainda existem maneiras, mas eu usei essas duas, que formaram a base do artigo). Também busquei a inclusão autônoma completa após a reinicialização, sem nenhum comando adicional no console, para que tudo "decolasse" de uma só vez. Então, por que esperar? -

Vamos começar!

Assumimos que um sistema, por exemplo, Debian, esteja instalado na partição criptografada sda3_crypt e uma dúzia de discos prontos para criptografia e criação do que você quiser. Temos uma senha para desbloquear o sda3_crypt e é nesta seção que removeremos o "hash" da senha no sistema em execução (descriptografado) e o adicionaremos às outras unidades. Tudo é elementar, no console que executamos:

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

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

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

A próxima etapa é a preparação de arquivos e mini-scripts para as funções necessárias para o trabalho, prosseguimos:

 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/ 

além disso

 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" 


além disso

 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" 


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 o initramfs, você precisa editar o arquivo / etc / initramfs-tools / scripts / local-top / cryptroot, iniciando na linha ~ 360, um código abaixo

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


e trazer 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 pode ser usado aqui. O principal é que os drivers necessários para os dispositivos HDD / SSD sejam adicionados ao / etc / initramfs-tools / modules. Você pode descobrir qual driver usar pelo udevadm info -a -n / dev / sdX | egrep 'procurando | DRIVER' .

Agora que terminamos e todos os arquivos no lugar, execute update-initramfs -u -k all -v , não deve haver erros na execução de nossos scripts no log. Reiniciamos, inserimos a senha e esperamos um pouco, dependendo do número de discos. Em seguida, o sistema será iniciado e no estágio final da inicialização, ou seja, depois de "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, sejam ZFS ou mdadm, serão montadas sem problemas! E tudo isso antes de carregar os serviços e serviços básicos que precisam desses discos / matrizes.

update1 : Como o AEP observou , esse método funciona apenas para LUKS1.

Source: https://habr.com/ru/post/pt457260/


All Articles