dm-crypt (Português)/Swap encryption (Português)

From ArchWiki

Status de tradução: Esse artigo é uma tradução de dm-crypt/Swap encryption. Data da última tradução: 2021-02-15. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Dependendo da necessidade, diferentes métodos podem ser usados para criptografar a partição swap. Uma configuração onde a partição swap é criptografada na inicialização oferece maior proteção dos dados, devido a evitar uma situação onde fragmentos de arquivos sensíveis colocados lá, e que não foram sobrescrevidos, estejam alcançáveis. No entanto, criptografar a swap em cada inicialização impossibilita a suspensão para o disco.

Sem suporte a suspender para o disco

Em sistemas onde suspender para o disco (hibernação) não é desejado, /etc/crypttab pode ser usado para abrir a partição swap com uma senha randômica com o modo plain do dm-crypt no tempo de inicialização. Ao desligar o sistema, a senha aleartória é descartada, fazendo os dados criptografados inacessíveis.

Para habilitar esta funcionalidade, simplesmente descomente a linha que começa com swap no /etc/crypttab. Mude o parâmetro <dispositivo> para seu dispositivo swap. Por exemplo, deve parecer com:

/etc/crypttab
# <name>  <device>    <password>     <options>
swap      /dev/sdX#   /dev/urandom   swap,cipher=aes-xts-plain64,size=256

Isto vai mapear /dev/sdX# para /dev/mapper/swap e assim esta pode ser adicionada em /etc/fstab como uma swap normal. Se você tinha uma partição swap não criptografada antes, não se esqueça de desabilitá-la - ou reutilizar sua entrada do fstab ao mudar o dispositivo para /dev/mapper/swap. As opções padrão devem ser o suficiente para a maioria dos usuários. Para outras opções e uma explicação de cada coluna, veja crypttab(5) e também 2.3 do FAQ do cryptsetup.

Atenção: Tudo que estiver dentro do dispositivo nomeado vai ser permanentemente deletado. É perigoso usar a nomeação simples do kernel para o dispositivo swap, desde que a ordem pode mudar a cada inicialização (exemplo, /dev/sda, /dev/sdb). Opções são:
Nota: A configuração da partição swap pode algumas vezes falhar, veja a issue do systemd 10179.

Para usar o nomeação persistente by-id, primeiro identifique o dispositivo swap:

# find -L /dev/disk -samefile /dev/sdX#
/dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX
/dev/disk/by-id/wwn-0x60015ee0000b237f-partX

Então o use como uma referência persistente para a partição (se dois resultados são retornados como acima, use qualquer um deles):

/etc/crypttab
# <name>  <device>                                                         <password>     <options>
swap      /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX  /dev/urandom   swap,cipher=aes-cbc-essiv:sha256,size=256

Depois de inicializar para ativar a swap criptografada, você vai notar que ao rodar swapon -s vai ser mostrado uma entrada arbitária para o dispositivo mapeado (exemplo, /dev/dm-1), enquanto o comando lsblk mostra crypt na coluna FSTYPE. Devido a cada inicialização ser criptografada novamente, o UUID de /dev/mapper/swap vai mudar toda vez.

Nota: Se a partição escolhida para swap foi antes uma partição LUKS, crypttab não vai sobrescrever esta partição. Isto é uma medida de segurança para prevenir perda de dados por acidental má-identificação da partição swap no crypttab. Para usar a partição o cabeçalho do LUKS deve ser sobrescrito uma vez.

UUID e LABEL

É perigoso usar a nomeação simples de dispositivos do kernel, como /dev/sdX# e /dev/disk/by-id/ata-SERIAL-partX, para criptografar a swap com o crypttab. Uma pequena mudança no nome dos dispositivos ou particionamento pode acarretar na perda de seus dados na próxima inicialização. O mesmo se você usar o PARTUUID e então usar esta partição para alguma outra coisa e se esquecer de remover a respectiva entrada do crypttab.

É mais confiável identificar a partição correta ao dar um genuíno UUID ou LABEL. Por padrão isto não funciona devido ao dm-crypt e mkswap sobrescreverem qualquer coisa presente na partição, incluindo o UUID e LABEL. No entanto é possível especificar o início (offset) da swap. Isto permite criar um minúsculo e vazio sistema de arquivos com o objetivo de prover um UUID ou LABEL persistente para a encriptação da swap.

Crie um sistema de arquivos, com uma LABEL de sua escolha:

# mkfs.ext2 -L cryptswap /dev/sdX# 1M

O parâmetro não usual depois do nome do dispositivo limita o tamanho do sistema de arquivos para 1 MiB, deixando espaço para a swap criptografada.

# blkid /dev/sdX#
/dev/sdX#: LABEL="cryptswap" UUID="b72c384e-bd3c-49aa-b7a7-a28ea81a2605" TYPE="ext2"

Com isso, /dev/sdX# agora pode facilmente ser identificada por ambos UUID ou LABEL, independente do nome do dispositivo ou até mesmo o número da partição que podem mudar no futuro. Modifique as entradas do /etc/crypttab e /etc/fstab:

/etc/crypttab
# <name> <device>             <password>    <options>
swap     LABEL=cryptswap      /dev/urandom  swap,offset=2048,cipher=aes-xts-plain64,size=512

Observe o offset: são 2048 setores de 512 bytes, então 1 MiB. Desta maneira a swap criptografada não vai afetar o LABEL/UUID do sistema de arquivos, e o alinhamento de dados vai funcionar também.

/etc/fstab
# <filesystem>     <dir>  <type>  <options>  <dump>  <pass>
/dev/mapper/swap   none   swap    defaults   0       0

Ao usar esta configuração, o cryptswap vai somente usar a partição com o LABEL correspondente, independente do que o nome do dispositivo pode ser. Se você decidir formatar e usar a partição para outra coisa, o LABEL vai ser perdido, logo, na próxima inicialização nada deve ser sobrescrito.

Desabilitando hibernação nos ambientes desktop

Ambientes desktop podem não detectar automaticamente que a partição swap é randomicamente criptografada e não pode ser usada para suspender para o disco.

Xfce pode ser configurado para esconder seu botão de Hibernação ao executar este comando:

$ xfconf-query -c xfce4-session -np /shutdown/ShowHibernate -t bool -s false

Com suporte a suspender para o disco

Para resumir depois de suspender o computador para o disco (hibernar), é necessário manter o espaço swap intacto. Por isso, tenha uma partição ou arquivo swap criptografada com LUKS, que pode ser guardada no disco ou colocada na inicialização.

Os três seguintes métodos são alternativas que possibilitam suspender para o disco. Se você aplicar qualquer uma delas, entenda que dados críticos podem ter sido colocados na swap e potencialmente permanecer por um longo período de tempo (até que sejam sobrescritos). Para reduzir o risco, considere montar um sistema que criptografa a swap novamente, por exemplo, a cada vez que o sistema é desligado normalmente, junto com o método de sua escolha.

LVM dentro do LUKS

Se o swap está no grupo de volumes lógicos que é ativado no initramfs, simplesmente siga as instruções em Hibernação.

Usando uma partição swap

Para resumir de uma partição swap criptografada, esta deve ser aberta durante o initramfs.

  • Quando usar o initramfs padrão baseado no busybox com o hook encrypt, siga as instruções em #Hook do mkinitcpio.
  • Quando usar o initramfs baseado no systemd com o hook sd-encrypt, adicione os parâmetros adicionais do rd.luks para abrir a partição swap.

Hook do mkinitcpio

Nota: Esta seção é somente aplicável quando usar o hook encrypt, que pode abrir somente um dispositivo (FS#23182). Com o hook sd-encrypt múltiplos dispositivos podem ser abertos, veja dm-crypt/Configuração do sistema#Usando o hook sd-encrypt.

Se o swap está em um dispositivo diferente do sistema de arquivos da partição raiz, este não vai ser aberto pelo hook encrypt, o resume vai tomar lugar antes que o /etc/crypttab seja lido, por isso é necessário criar um hook e colocá-lo em /etc/mkinitcpio.conf para abrir o dispositivo swap criptografado com LUKS antes dessa situação.

Se você deseja usar a partição que é atualmente usada pelo sistema, você vai ter que desativá-la primeiro:

# swapoff /dev/<dispositivo>

Tenha certeza de remover qualquer linha em /etc/crypttab apontando para este dispositivo.

Se você está usando uma partição swap existente, e esta está numa tabela de partição GPT, você vai precisar usar o gdisk para definir o atributo de partição 63 "do not automount" ("não monte automaticamente") nela. Isto vai prevenir o systemd-gpt-auto-generator de descobrir e habilitar a partição na inicialização.

A seguinte configuração tem a desvantagem de inserir manualmente uma senha adicional para a partição swap toda vez que ligar o sistema.

Atenção: Não use esta configuração com uma keyfile se /boot não está criptografado. Leia sobre o problema reportado aqui (em inglês). Alternativamente, use uma keyfile criptografada com gnupg, de acordo com esta página no forum (em inglês).

Formate o container criptografado para a partição swap, crie um espaço de chave para uma senha memorizável.

# cryptsetup luksFormat /dev/<dispositivo>

Abra a partição em /dev/mapper:

# cryptsetup open /dev/<dispositivo> dispositivoSwap

Crie o sistema de arquivos para a swap dentro da partição mapeada:

# mkswap /dev/mapper/dispositivoSwap

Agora faça um hook para abrir a swap na inicialização. Você pode instalar e configurar o mkinitcpio-openswapAUR, ou seguir as seguintes instruções. Crie um arquivo contendo o seguinte comando de abertura:

/etc/initcpio/hooks/openswap
run_hook ()
{
    cryptsetup open /dev/<dispositivo> dispositivoSwap
}
Atenção: Montar o sistema de arquivos é perigoso e destrutivo. A keyfile não deve ser lida de um sistema de arquivos que estava montado quando o sistema foi suspenso.

This article or section needs expansion.

Reason: Adicionar instruções que não levam a perda de dados. (Discuss in talk:dm-crypt/Swap encryption)

Para abrir o dispositivo swap ao digitar a senha ou

/etc/initcpio/hooks/openswap
run_hook ()
{
    ## opcional: Para evitar condição de corrida
    x=0;
    while [ ! -b /dev/mapper/<dispositivo-raiz> ] && [ $x -le 10 ]; do
       x=$((x+1))
       sleep .2
    done
    ## Fim do opcional

    mkdir dispositivo_da_chave
    mount /dev/mapper/<dispositivo-raiz> dispositivo_da_chave
    cryptsetup open --key-file dispositivo_da_chave/<caminho-para-a-chave> /dev/<dispositivo> dispositivoSwap
    umount dispositivo_da_chave
}

Para abrir o dispositivo swap com uma keyfile do dispositivo raiz criptografado.

Em alguns computadores, condições de corrida podem ocorrer quando o mkinitcpio tenta montar o dispositivo antes dele ser aberto e a enumeração de dispositivos ainda está incompleta. O bloco opcional vai atrasar o processo de inicialização em 2 segundos até que o dispositivo raiz esteja pronto para ser montado.

Nota: Se a swap está em um SSD e Discard/TRIM é desejado, a opção --allow-discards precisa ser adicionada para a linha do cryptsetup no hook openswap acima. Veja Dm-crypt/Specialties#Discard/TRIM support for solid state drives (SSD) ou SSD para mais informações sobre discard. Também adicione a opção de montagem 'discard' para a entrada do dispositivo swap no fstab.

Crie e edite o arquivo de configuração do hook:

/etc/initcpio/install/openswap
build ()
{
   add_runscript
}
help ()
{
cat<<HELPEOF
  Isto abre a partição swap criptografada /dev/<dispositivo> em /dev/mapper/dispositivoSwap
HELPEOF
}

Adicione o hook openswap no vetor HOOKS no /etc/mkinitcpio.conf, entre encrypt e filesystems. Não se esqueça de adicionar o hook resume depois de openswap

HOOKS=(... encrypt openswap resume filesystems ...)

Gere novamente o initramfs.

Coloque a partição mapeada no /etc/fstab ao adicionar a seguinte linha:

/dev/mapper/dispositivoSwap swap swap defaults 0 0

Configure seu sistema para resumir com o /dev/mapper/dispositivoSwap. Por exemplo, se você usa GRUB com suporte a hibernação do kernel, adicione o parâmetro do kernel resume=/dev/mapper/dispositivoSwap na variável GRUB_CMDLINE_LINUX_DEFAULT em /etc/default/grub. Uma linha do kernel com a raiz e swap criptografada pode parecer com isso:

kernel /vmlinuz-linux cryptdevice=/dev/sda2:raiz root=/dev/mapper/raiz resume=/dev/mapper/dispositivoSwap ro

Na inicialização, o hook openswap vai abrir a partição swap para que o kernel possa usá-la. Se você usar hooks especiais para resumir da hibernação, tenha certeza de que eles estão depois do openswap no vetor HOOKS. Note que devido ao initrd abrir a swap, não é necessário ter uma entrada para dispositivoSwap em /etc/crypttab.

Usando um arquivo swap

Um arquivo swap pode ser usado para reservar um espaço swap dentro de uma partição existente e isto também pode ser feito dentro de uma partição criptografada.

Siga as instruções para criação do arquivo swap em Swap#Arquivo swap e configure a hibernação de acordo com Suspensão e hibernação#Adquirindo o offset de um arquivo swap.

Nota: Quando resumir de um arquivo swap, o parâmetro resume deve apontar para o dispositivo aberto/mapeado que contém o sistema de arquivos com o arquivo swap.

Problemas conhecidos