Quero criptografar o sistema de arquivos raiz de uma instalação do Ubuntu Server 24.04 no meu Raspberry Pi 5. Não tenho cabos para o conector microHDMI estranho que eles usam nos novos Pis, então seria legal fazer isso sem o headless. O sistema de arquivos raiz está localizado em um cartão SD, e eu gostaria de usar arquivos de chave para criptografia em vez de senhas. Há esta resposta e este guia , mas nada sobre como fazer isso sem o headless, infelizmente.
relate perguntas
-
Problemas ao instalar 24.04
-
Nenhum clique pode ser feito em todo o canto superior direito de um aplicativo maximizado no Ubuntu 24.04
-
Tenho uma dúvida sobre como baixar a versão do Ubuntu entre LTS e básica
-
24.04 Textos LTS não aparecem até passar o mouse
-
A boutique de software não pode ser iniciada no Ubuntu24.04 LTS
Tenho lutado para encontrar uma maneira de fazer isso, até que me lembrei da existência de ,
dropbear-initramfs
por meio desta resposta . Esta parece ser, de longe, a solução mais fácil. Basta instalar um servidor SSH eminitramfs
. Aqui estão os passos que segui para fazer funcionar.Todos os comandos devem ser executados como superusuário,
sudo -s
para abrir o shell root.Etapas marcadas com █ podem exigir a alteração de comandos ou conteúdos de arquivos com dados específicos para sua situação.
Preparando
initramfs
Instale o sistema no cartão SD (usei o Raspberry Pi Imager), insira-o no seu RPi e ligue-o. Atualize-o executando
Instalar
dropbear-initramfs
ebusybox
:█ Adicione sua chave pública SSH para
/etc/dropbear/initramfs/authorized_keys
poder acessar o servidor SSH quando ele estiver em execução. Você pode copiar a chave da sua máquina:E cole-o no arquivo apropriado no RPi:
█ Edite
/etc/initramfs-tools/initramfs.conf
para que o initramfs obtenha um endereço IP do DHCP. Localize o final do arquivo e adicione:Substitua
<hostname>
pelo nome do host que o Pi deve ter.O SSH pode estar irritado com a constante mudança de assinatura do Pi. Use esta resposta se estiver desesperado.
Edite
/etc/initramfs-tools/modules
para adicionar os módulos do kernel necessários para LUKS e criptografiainitramfs
. Adicione o seguinte no final do arquivo:Adicione as ferramentas para trabalhar com sistemas de arquivos
initramfs
criando/etc/initramfs-tools/hooks/luks_hooks
com o seguinte conteúdo:Não se esqueça de torná-lo executável:
Atualize
initramfs
para aplicar todas essas alterações:█ Você pode verificar se
initramfs
possui todas as ferramentas e módulos necessários usando os seguintes comandos.Deve imprimir:
E
deve imprimir:
Para mim,
<...>
é6.8.0-1020-raspi
, que suponho ser a versão do kernel. Provavelmente será diferente para você. Certifique-se de substituí-lo pela sua versão em todos os comandos acima.Preparando a inicialização
Gere uma chave para usar na criptografia e coloque-a em
/boot/firmware
, pois este é um local de fácil acesso a partir deinitramfs
:Edite
/etc/fstab
para usar o volume criptografado que criaremos em poucos passos. Altere a primeira linha para:Atualização
initramfs
, ignorando seus terríveis avisos:Editar
/boot/firmware/cmdline.txt
:root=LABEL=writable
pararoot=/dev/mapper/rootfs
cryptdevice=/dev/mmcblk0p2:rootfs
no final da linhaAlguns artigos pedem que você também adicione "
break=init
no final da linha", mas se fizer isso, ele vai te derrubarinitramfs
duas vezes, primeiro porque não consegue inicializar e depois porque você pediu. O problema é que o dropbear não inicia na segunda vez. Então não faça isso se estiver fazendo isso sem o comando headless.Parece também que as versões Desktop do Ubuntu também têm
splash
argumentos emcmdline.txt
, que devem ser removidos, pois a tela inicial não ajudará em nada nessa tarefa.Agora você pode finalmente reiniciar:
Criptografando
rootfs
no local deinitramfs
█ Seu Pi agora deve ser inicializado
initramfs
com um endereço IP obtido do seu roteador via DHCP. Se você não sabe qual é esse endereço IP, faça login no seu roteador para verificar. Depois disso, basta usar SSH para fazer login no initramfs:(Se sua chave privada SSH estiver armazenada em algum outro local, certifique-se de ajustar o comando)
Uma vez em
initramfs
, monte asystem-boot
partição:Verifique e repare
rootfs
come2fsck
(esta etapa é necessária ):Reduza
rootfs
para abrir espaço para o cabeçalho LUKS:█ Criptografe
rootfs
no local usandocryptsetup reencrypt
(isso levará algum tempo, dependendo do tamanho do cartão SD e sua classe de desempenho. No meu caso, levou 40 minutos para 64 GB):█ Assim que a criptografia estiver concluída, desbloqueie o criptografado
rootfs
:Expanda
rootfs
para preencher a partição inteira:Neste ponto, você pode tentar montar o
rootfs
para ver se tudo está funcionando corretamente:Refaça seus passos se a saída de qualquer um desses comandos não estiver correta.
█ Neste ponto, apesar de
/dev/mapper/rootfs
existir, o Pi não fará nenhuma tentativa de alternar para ele. Para isso, primeiro reinicie o Pi:Então, sem esperar muito tempo, conecte-se a ele como você fez na etapa 1 desta seção e desbloqueie
rootfs
novamente:Você deve obter algo parecido com
em 2 a 3 segundos após o desbloqueio
rootfs
. Se não funcionar, tente novamente, mas mais rápido. Depois disso, o Pi inicializará emrootfs
.Restaurando a inicialização normal
Como a implementação do crypttab no Debian parece não suportar a leitura de arquivos de chave diretamente dos dispositivos, você pode usar um "keyscript" para fazer isso. Crie
/lib/cryptsetup/scripts/unlock
com o seguinte conteúdo:Este script tentará montar a
system-boot
partição do cartão SD/sdboot
e usará o nome do arquivo de chave, que será passado a ele porcrypttab
, para encontrar a chave correta nasystem-boot
partição. Em seguida, ele despejará o conteúdo do arquivo na saída padrão, que será interpretada como o conteúdo do arquivo de chave. O/sdboot
ponto de montagem existirá apenas dentro de ,initramfs
e não fará parte derootfs
.Não se esqueça de torná-lo executável:
█ Adicione uma entrada para
/etc/crypttab
desbloquearrootfs
automaticamente na inicialização:Atualizar
initramfs
para aplicar alterações:Reinicie para testar:
Neste ponto, você pode modificar a configuração conforme desejar. Por exemplo, você pode querer mover o arquivo da chave para um pendrive e modificar o script de acordo. Eu tenho um Gist no GitHub com instruções detalhadas sobre como fazer exatamente isso. Ou você pode alternar para o desbloqueio por senha usando a chave como backup. A questão é que agora você tem um sistema funcional que inicializa e com o qual você pode fazer o que quiser.
Minha recomendação seria alterar a chave de criptografia se você alternar para o desbloqueio baseado em unidade USB (já que a chave gravada no cartão SD ainda poderá ser lida se for apagada incorretamente) e usar UUIDs de dispositivo (você pode visualizá-los com
blkid
) em vez da/dev/<whatever>
especificação de dispositivo de bloco no estilo , já que UUIDs não dependem do sistema.