dm-crypt (Português)/Swap encryption (Portuguê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.
/dev/sda
, /dev/sdb
). Opções são:
- Usar caminhos do
by-id
eby-path
. No entanto, estes dois são sucetíveis a mudanças no hardware. Veja nomeação persistente de dispositivo de bloco#by-id e by-path. - Usar um nome do volume lógico do LVM.
- Usar o método descrito em #UUID e LABEL. Labels e UUIDS não podem ser usados diretamente devido a criação e encriptação do dispositivo swap a cada inicialização com
mkswap
, veja o FAQ do cryptsetup.
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.
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
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.
/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 }
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.
--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 ...)
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.
resume
deve apontar para o dispositivo aberto/mapeado que contém o sistema de arquivos com o arquivo swap.Problemas conhecidos
-
Stopped (with error) /dev/dm-1
nos logs. Veja a issue do systemd 1620.