🔒 Criptografando o disco inteiro, com headers separado e boot

Não sou um profissional na aŕea e faça por sua conta em risco.


Tutorial de como instalar o Linux com criptografia do disco e negação plausível.

As instalações de Linux convencionais têm um problema, ou contém o /boot e /boot/efi descriptografados ou têm o Headers do LUKS visíveis, isso protege contra acessos indesejados, mas o atacante ainda sabe que o disco está criptografado com LUKS, nesse método que eu mostrarei, no final o disco aparecerá assim:


Ou seja, vai parecer estar sem alocação.

Do que precisamos? Do disco interno e um dispositivo externo, como um cartão sd (se a bios conseguir dar boot por aqui) ou um pen-drive.

Nesse caso vou usar de exemplo: ssd interno /dev/sdb e pen-drive externo /dev/sdc.


1 Passo

Dar zero fill ou /dev/random nos dois discos.

2 Passo

Particionar os discos.

Eu escolhi fazer assim: /dev/sdb inteiro para o / e /dev/sdc1 com 200mb para /boot/efi e /dev/sdc2 com 3gb para o /boot. Os 2 em GPT.

3 Passo

Criar o arquivo de Headers separado

dd if=/dev/zero of=/root/header.img bs=1M count=32

isso vai criar um arquivo vazio de 32mb no home do root do sistema host, se quiser pode fazer no /tmp mas recomendo gravar no disco para ter um backup caso o pen drive se corrompa.

4 passo

Criar o dispositivo criptografado com LUKS

cryptsetup luksFormat --offset 32768 --header /root/header.img /dev/sdb

Não vou entrar aqui na diferença de LUKS2, KDF Argon2, etc.

esse --offset 32768 é recomendado pela wiki do Arch para colocar a chave de volta no disco se um dia quiser.

5 passo

Abrir o dispositivo criptografado

cryptsetup open --header /root/header.img /dev/sdb cryptroot

6 passo

Criar a partição ext4 (ou o que você preferir) dentro do dispositivo criptografado sdb

mkfs.ext4 /dev/mapper/cryptroot

7 Passo

Agora podemos montar os discos e instalar o sistema normalmente

mount /dev/mapper/cryptroot /mnt/

mkdir /mnt/boot

mount /dev/sdc2 /mnt/boot/

mkdir /mnt/boot/efi

mount /dev/sdc1 /mnt/boot/efi/

8 passo

Instalar o SIstema normalmente

No caso escolhi o Artix só porque estou no Artix no momento, mas poderia ser qualquer uma distro que tenha vergonha na cara e possibilite instalar via chroot, como Arch/Artix, Debian/vuan, Void ou Fedora.

No caso do Arch/tix:

pacstrap /mnt/ base

e depois instalar o restante do sistema.

9 passo

Instalar os pacotes necessários para o boot

São eles: cryptsetup efibootmgr grub mkinitcpio

10 passo (o mais importante)

Configurar o boot

O grub e initramfs por padrão não conseguem descriptografar um disco com headers separado, então vamos ter que criar um hook no mkinitcpio para que o initramfs faça isso.

O melhor de tudo é que com esse script não será necessário passar a partição de root para o GRUB, então nenhuma configuração extra no GRUB é necessária.

10.1

Passar o header.img para a partição boot

cp /root/header.img /mnt/boot/

10.2 Criar os arquivos

/usr/lib/initcpio/hooks/decrypt-interactive

#!/bin/sh
#GPLv3 only

# Configuração: ajuste conforme seu ambiente
# Se o header é um arquivo incluído no initramfs:
HEADER_PATH="/boot/header.img"      # caminho dentro do initramfs (via FILES=)
# Se o header está em um dispositivo/partição legível:
# HEADER_PATH="/dev/disk/by-uuid/AAAA-BBBB"

# Identificação do dispositivo de dados (onde estão os blocos criptografados)
#DATA_UUID="SUBSTITUA-PELO-UUID-DA-PARTICAO-DE-DADOS"
# Ou, se preferir explicitamente (evite se possível):
# DATA_DEV="/dev/sdb"

DATA_BYID="dispositivo-id"

# Nome do mapeamento a ser criado
MAPPER_NAME="cryptroot"

# Número de tentativas de senha
RETRIES=3

run_hook() {
    udevadm settle

    # Resolve o device dos dados
    if [ -n "$DATA_DEV" ]; then
        data_dev="$DATA_DEV"
    else
        data_dev="/dev/disk/by-id/$DATA_BYID"
    fi

    if [ ! -e "$data_dev" ]; then
        echo "decrypt-interactive: dispositivo de dados não encontrado: $data_dev" >&2
        return 1
    fi

    # Verifica header
    if [ ! -e "$HEADER_PATH" ]; then
        echo "decrypt-interactive: header LUKS não encontrado em $HEADER_PATH" >&2
        return 1
    fi

    echo "decrypt-interactive: abrir LUKS (data=$data_dev, header=$HEADER_PATH, name=$MAPPER_NAME)"
    echo "Digite a senha do LUKS para o root. Pressione Enter após digitar."

    tries=0
    while [ "$tries" -lt "$RETRIES" ]; do
        # Garantir que tty e teclado estejam prontos (hook keyboard deve estar ativo)
        # Prompt interativo padrão do cryptsetup via stdin da console
        if cryptsetup --header "$HEADER_PATH" luksOpen "$data_dev" "$MAPPER_NAME"; then
            break
        fi
        tries=$((tries + 1))
        echo "Senha incorreta ou falha ao abrir. Tentativa $tries de $RETRIES."
    done

    if ! [ -e "/dev/mapper/$MAPPER_NAME" ]; then
        echo "decrypt-interactive: não foi possível abrir o LUKS após $RETRIES tentativas." >&2
        return 1
    fi

    export root="/dev/mapper/$MAPPER_NAME"
    ln -sf "$root" /dev/root
    echo "decrypt-interactive: root definido para $root"
}

Tá vendo ali DATA_BYID="dispositivo-id" ? ENtão vamos ter que trocar pelo id do dispositivo ls -l /dev/disk/by-id/ pegue o id do seu dispositivo, no meu caso /dev/sdb ata-CT240BX500SSD1-xxxxxxxx.

Também preste atenção no diretório do header.img

/usr/lib/initcpio/install/decrypt-interactive

#!/bin/bash

build() {
    add_binary cryptsetup
    add_binary blkid
    add_runscript
}

help() {
    cat <<'EOF'
decrypt-interactive: solicita a senha do LUKS no boot e abre o root com header separado.
Configure HEADER_PATH e DATA_UUID/DATA_DEV no hook runtime.
Inclua o arquivo de header no initramfs via FILES= se for um arquivo.
EOF
}

com isso o initramfs conseguirá descriptografar o disco com headers separado e jogará a partição descriptografada para o kernel continuar o boot.

10.3

chmod +x /usr/lib/initcpio/hooks/decrypt-interactive

chmod +x /usr/lib/initcpio/install/decrypt-interactive

10.4

Editar o arquivo /etc/mkinitcpio.conf

EM FILES colocar FILES=(/boot/header.img)

Em HOOKS colocar decrypt-interactive depois de keyboard mas antes de block e colocar encrypt depois de block mas antes de filesystems. Sim, a ordem importa aqui.

10.5

mkinitcpio -P + instalar o grub (sem modificações adicionais necessárias) + configurar o fstab (também nada de extra necessário).


E com isso você terá um sistema com criptografia e negação plausível, ou seja, não só estará criptografado, mas também sem saber que está criptografado.

Mas… como usar isso?

Esse setup é mais útil em notebooks que você usa fora de casa, então sempre que for sair com o notebook, guarde o cartão sd ou pen-drive em outro lugar separado do notebook e apenas quando for usar junte os dois, caso alguém tenha acesso ao disco do notebook, aparecerá como um disco com dados aleatórios.


Dica extra: não use o fstrim

Em ssd modernos o fstrim serve para melhorar a longevidade / performance do disco, mas isso revela quais blocos estão vazios, o que pode gerar um possível enfraquecimento da criptografia, como não hjá consenso sobre isso, na dúvida se seguraça > desempenho no seu caso de uso, não use o trim.


Qualquer dúvida/correção, comente!