AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1546576
Accepted
Nullcaller
Nullcaller
Asked: 2025-04-27 01:08:22 +0800 CST2025-04-27 01:08:22 +0800 CST 2025-04-27 01:08:22 +0800 CST

Criptografia do sistema de arquivos raiz sem cabeçalho no RPi 5 e no Ubuntu Server 24.04 LTS

  • 772

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.

24.04
  • 1 1 respostas
  • 37 Views

1 respostas

  • Voted
  1. Best Answer
    Nullcaller
    2025-04-27T01:08:22+08:002025-04-27T01:08:22+08:00

    Tenho lutado para encontrar uma maneira de fazer isso, até que me lembrei da existência de , dropbear-initramfspor meio desta resposta . Esta parece ser, de longe, a solução mais fácil. Basta instalar um servidor SSH em initramfs. Aqui estão os passos que segui para fazer funcionar.

    Todos os comandos devem ser executados como superusuário, sudo -spara 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.

    Preparandoinitramfs

    1. Instale o sistema no cartão SD (usei o Raspberry Pi Imager), insira-o no seu RPi e ligue-o. Atualize-o executando

      apt update
      apt upgrade
      reboot
      
    2. Instalar dropbear-initramfse busybox:

      apt update
      apt install dropbear-initramfs busybox
      
    3. █ Adicione sua chave pública SSH para /etc/dropbear/initramfs/authorized_keyspoder acessar o servidor SSH quando ele estiver em execução. Você pode copiar a chave da sua máquina:

      cat ~/.ssh/id_rsa.pub
      

      E cole-o no arquivo apropriado no RPi:

      vi /etc/dropbear/initramfs/authorized_keys
      
    4. █ Edite /etc/initramfs-tools/initramfs.confpara que o initramfs obtenha um endereço IP do DHCP. Localize o final do arquivo e adicione:

      IP=::::<hostname>::dhcp:::
      

      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.

    5. Edite /etc/initramfs-tools/modulespara adicionar os módulos do kernel necessários para LUKS e criptografia initramfs. Adicione o seguinte no final do arquivo:

      algif_skcipher
      aes_arm64
      aes_ce_blk
      aes_ce_ccm
      aes_ce_cipher
      sha256_arm64
      cbc
      dm-crypt
      
    6. Adicione as ferramentas para trabalhar com sistemas de arquivos initramfscriando /etc/initramfs-tools/hooks/luks_hookscom o seguinte conteúdo:

      #!/bin/sh -e
      PREREQS=""
      case $1 in
              prereqs) echo "${PREREQS}"; exit 0;;
      esac
      
      . /usr/share/initramfs-tools/hook-functions
      
      copy_exec /sbin/e2fsck /sbin
      copy_exec /sbin/resize2fs /sbin
      copy_exec /sbin/fdisk /sbin
      copy_exec /sbin/cryptsetup /sbin
      

      Não se esqueça de torná-lo executável:

      chmod +x /etc/initramfs-tools/hooks/luks_hooks
      
    7. Atualize initramfspara aplicar todas essas alterações:

      update-initramfs -u
      
    8. █ Você pode verificar se initramfspossui todas as ferramentas e módulos necessários usando os seguintes comandos.

      lsinitramfs /boot/initrd.img-<...> | grep -P "sbin/(cryptsetup|resize2fs|fdisk|e2fsck)"
      

      Deve imprimir:

      usr/sbin/cryptsetup
      usr/sbin/e2fsck
      usr/sbin/fdisk
      usr/sbin/resize2fs
      

      E

      lsinitramfs /boot/initrd.img-<...> | grep -P "(algif_skcipher|aes-arm64|sha256-arm64|cbc|dm-crypt)"
      

      deve imprimir:

      usr/lib/modules/<...>/kernel/arch/arm64/crypto/aes-arm64.ko.zst
      usr/lib/modules/<...>/kernel/arch/arm64/crypto/sha256-arm64.ko.zst
      usr/lib/modules/<...>/kernel/crypto/algif_skcipher.ko.zst
      usr/lib/modules/<...>/kernel/crypto/pcbc.ko.zst
      usr/lib/modules/<...>/kernel/crypto/xcbc.ko.zst
      usr/lib/modules/<...>/kernel/drivers/md/dm-crypt.ko.zst
      

      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

    1. Gere uma chave para usar na criptografia e coloque-a em /boot/firmware, pois este é um local de fácil acesso a partir de initramfs:

      apt update
      apt install uuid
      cd /boot/firmware
      dd if=/dev/random bs=512 count=4 of=$(uuid).lek
      
    2. Edite /etc/fstabpara usar o volume criptografado que criaremos em poucos passos. Altere a primeira linha para:

      /dev/mapper/rootfs  /   ext4    defaults    0   0
      
    3. Atualização initramfs, ignorando seus terríveis avisos:

      update-initramfs -u
      
    4. Editar /boot/firmware/cmdline.txt:

      • mudar root=LABEL=writablepararoot=/dev/mapper/rootfs
      • adicionar cryptdevice=/dev/mmcblk0p2:rootfsno final da linha

      Alguns artigos pedem que você também adicione " break=initno final da linha", mas se fizer isso, ele vai te derrubar initramfsduas 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 splashargumentos em cmdline.txt, que devem ser removidos, pois a tela inicial não ajudará em nada nessa tarefa.

    5. Agora você pode finalmente reiniciar:

      reboot
      

    Criptografando rootfsno local deinitramfs

    1. █ Seu Pi agora deve ser inicializado initramfscom 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:

      ssh -i ~/.ssh/id_rsa root@<Pi's IP address>
      

      (Se sua chave privada SSH estiver armazenada em algum outro local, certifique-se de ajustar o comando)

    2. Uma vez em initramfs, monte a system-bootpartição:

      mkdir -p /mnt/boot
      mount /dev/mmcblk0p1 /mnt/boot
      
    3. Verifique e repare rootfscom e2fsck(esta etapa é necessária ):

      e2fsck -f /dev/mmcblk0p2
      
    4. Reduza rootfspara abrir espaço para o cabeçalho LUKS:

      resize2fs -M /dev/mmcblk0p2
      
    5. █ Criptografe rootfsno local usando cryptsetup 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):

      cryptsetup reencrypt --new --reduce-device-size=16M --type=luks2 -c aes-xts-plain64 -s 256 -h sha256 --use-urandom --key-file /mnt/boot/<key file name>.lek /dev/mmcblk0p2
      
    6. █ Assim que a criptografia estiver concluída, desbloqueie o criptografado rootfs:

      cryptsetup luksOpen --key-file /mnt/boot/<key file name>.lek /dev/mmcblk0p2 rootfs
      
    7. Expanda rootfspara preencher a partição inteira:

      resize2fs /dev/mapper/rootfs
      

      Neste ponto, você pode tentar montar o rootfspara ver se tudo está funcionando corretamente:

      mkdir -p /mnt/root
      mount /dev/mapper/rootfs /mnt/root
      cd /mnt/root
      ls -la
      

      Refaça seus passos se a saída de qualquer um desses comandos não estiver correta.

    8. █ Neste ponto, apesar de /dev/mapper/rootfsexistir, o Pi não fará nenhuma tentativa de alternar para ele. Para isso, primeiro reinicie o Pi:

      reboot -f
      

      Então, sem esperar muito tempo, conecte-se a ele como você fez na etapa 1 desta seção e desbloqueie rootfsnovamente:

      mkdir -p /mnt/boot
      mount /dev/mmcblk0p1 /mnt/boot
      cryptsetup luksOpen --key-file /mnt/boot/<key file name>.lek /dev/mmcblk0p2 rootfs
      

      Você deve obter algo parecido com

      Connection to <IP> closed by remote host.
      

      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á em rootfs.

    Restaurando a inicialização normal

    1. 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/unlockcom o seguinte conteúdo:

      #!/bin/sh
      set -e
      if [ ! -e /sdboot ]; then
        mkdir -p /sdboot
        sleep 3
      fi
      if mount /dev/mmcblk0p1 /sdboot >/dev/null; then
        if [ -e /sdboot/$CRYPTTAB_KEY.lek ]; then
          cat /sdboot/$CRYPTTAB_KEY.lek
          umount /sdboot
          exit
        fi
        umount /sdboot
      fi
      /lib/cryptsetup/askpass "Insert key or enter passphrase: "
      

      Este script tentará montar a system-bootpartição do cartão SD /sdboote usará o nome do arquivo de chave, que será passado a ele por crypttab, para encontrar a chave correta na system-bootpartiçã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 /sdbootponto de montagem existirá apenas dentro de , initramfse não fará parte de rootfs.

      Não se esqueça de torná-lo executável:

      chmod a+x /lib/cryptsetup/scripts/unlock
      
    2. █ Adicione uma entrada para /etc/crypttabdesbloquear rootfsautomaticamente na inicialização:

      rootfs  /dev/mmcblk0p2  <key file name (without the .lek extension)>    luks,initramfs,keyscript=unlock
      
    3. Atualizar initramfspara aplicar alterações:

      update-initramfs -u
      
    4. Reinicie para testar:

      reboot
      

    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.

    • 0

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

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve