Configure o Ubuntu 22.04 (ZFS) para desbloqueio automático do LUKS na inicialização via unidade USB

Configure o Ubuntu 22.04 (ZFS) para desbloqueio automático do LUKS na inicialização via unidade USB

Instalei recentemente o Ubuntu 22.04 e usei a opção de criptografia de unidade completa ZFS + LUKS do instalador.

Tenho pesquisado na web uma maneira de configurar a unidade para desbloquear automaticamente na inicialização quando uma chave USB é detectada (chave de desbloqueio LUKS no pendrive) em vez de inserir uma senha de descriptografia toda vez que inicializo o sistema.

Encontrei vários guias, mas nenhuma de suas instruções parece ser aplicável à maneira como o 22.04 define as estruturas de particionamento na unidade ao usar o ZFS e o LUKS.

O guia mais próximo que estou seguindo está aqui: https://tqdev.com/2022-luks-with-usb-unlock

Tudo parece estar indo bem, até chegar ao ponto em que preciso adicionar a chave à unidade LUKS (etapa seis) - porque duas unidades estão listadas como unidades LUKS.

root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0

Não tenho certeza de como proceder a partir daqui!

Responder1

Passo a passo em vídeo:

Atualização: 20 de março de 2024:Quando o Ubuntu faz um lançamento pontual (por exemplo: 22.04.3> 22.04.4), essas alterações são redefinidas e exigem refazer a etapa 13 e a etapa 20 novamente.

  1. Instale o desktop Ubuntu 22.04 usando ZFS e criptografia usando o instalador do Ubuntu. Certifique-se de registrar a senha de criptografia com segurança para uso em uma etapa posterior. Não configurei uma chave de recuperação no instalador, portanto não sei se essas etapas funcionam ao usar uma chave de recuperação. YMMV.

  2. Após a instalação, formate um drive USB e crie uma nova partição usando o padrão ext4 (usei o utilitário de discos no Ubuntu). Chame a partição de 'linux-key'.

  3. Certifique-se de que a unidade USB esteja montada. Use o aplicativo 'arquivos' para verificar se o USB está montado na coluna esquerda da janela de arquivos.

  4. Inicie um terminal e digite os seguintes comandos para mudar para root e depois para a unidade USB:

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. Você deverá ver uma lista de diretórios vazia, mostrando que a unidade USB está vazia.

    root@ubuntu:/media/bob/linux-key$ ls -la
    total 29
    drwx------  3 bob  bob   4096 Jan 25 15:07 .
    drwxr-x---+ 3 root root     3 Jan 25 15:08 ..
    drwx------  2 root root 16384 Jan 25 15:07 lost+found
    
  6. Digite o seguinte para mostrar as partições LUKS em seu sistema. A partição padrão que precisamos modificar geralmente é /dev/zd0. Certifique-se de que seja mostrado ao executar o comando abaixo.

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. Crie o novo arquivo de chave de criptografia.

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. Certifique-se de que o arquivo-chave exista – você deverá ver o arquivo na listagem.

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. Configure o arquivo-chave para funcionar com a partição e insira a senha de descriptografia configurada anteriormente no instalador.

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. Verifique a inserção bem-sucedida da chave garantindo que o slot de chave 1 foi preenchido.

    cryptsetup luksDump /dev/zd0;
    
        ...
        Area offset:32768 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
      1: luks2 <------------- the key you just added
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        ...
    
  11. Ajustar permissões de arquivo-chave

    chmod 400 linux.key
    
  12. Em seguida, navegue até a pasta de scripts initramfs e abra o arquivo chamado ‘zfs’. Você pode usar qualquer editor de texto que desejar. (estou usando nanoneste exemplo)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. Encontre a linha a seguir e substitua-a pelo texto a seguir.

    Encontre esta linha

    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
    

    Substitua por isso

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. Salve e feche o arquivo.

  15. Crie um novo arquivo chamado ‘usb-unlock’ no mesmo diretório.

    nano usb-unlock
    
  16. Cole o script desta essência - isso verifica uma partição da unidade USB chamada 'linux-key', procura um arquivo chamado linux.key e tenta usá-lo para descriptografar a partição.

  17. Salve e feche o arquivo.

  18. Ajuste as permissões para o script usb-unlock

    chmod 755 usb-unlock
    
  19. Liste o diretório do script. Certifique-se de que os dois arquivos com os quais você acabou de trabalhar pertencem ao usuário root com um conjunto de permissões 755.

    $ ls -la  # you should see these files...
    -rwxr-xr-x  1 root root   550 Dec 22 20:38 usb-unlock
    -rwxr-xr-x  1 root root 31665 Dec 22 20:40 zfs
    
  20. Por fim, atualize o initramfs para que ele execute o script durante a inicialização.

    update-initramfs -u
    
  21. Reinicie sua máquina, garantindo que a unidade USB esteja inserida. Se estiver inserido, você não precisará digitar sua senha de descriptografia. Se estiver faltando, o script voltará a solicitar uma senha que você deverá digitar.

Responder2

Está escondido 'mágica' no initramfs - no pacote zfs-initramfspara ser exato.

Procure em /usr/share/initramfs-tools/script/zfs e encontre a seguinte linha:

# Open and mount luks keystore for any pools using one

O comportamento é o seguinte:

Depois de importar o pool (por exemplo, rpool) o volume não criptografado (zvol) nele fica disponível como /dev/zvol/rpool/keystore.

Este dispositivo zvol ainda está criptografado.

As entradas do crypttab para esses zvols criptografados com luks ( zfs list -t volume) são criadas dinamicamente durante o tempo de inicialização em /cryptroot/crypttab.

As senhas para essas entradas são então consultadas pelo usuário.

Os dispositivos são então desbloqueados e montados sem criptografia em /run/rpool/keystore.

Como o próprio rpool é criptografado e seu local de chave aponta para esse local, a chave do rpool pode ser carregada e o processo de inicialização pode continuar.

Provavelmente alguém deveria documentar isso corretamente;)


Quanto à sua pergunta original, você pode tentar ajustar o comportamento com os possíveis pontos de expansão do initramfs para /etc/initramfs-tools/scripts/local-*/fazer a mesma coisa e montar o zvol você mesmo com a senha do seu dispositivo USB ou fornecer a chave para o rpool de alguma forma diretamente.

informação relacionada