Criando partições encriptadas (LVM sobre LUKS)
Nesse post veremos como adicionar novos HDs à sistemas GNU/Linux com os dados criptografados utilizando um mix de LVM e LUKS.
Dessa forma, se o FBI obter aquele seu HD com todas as séries de Hollywood … não poderá acessar o conteúdo dele :D. E nem bisbilhoteiros em caso de perca ou roubo de seus HDs.
Não é um post teórico, mas sim de receita de bolo. A teoria, entretanto, é essencial para saber o que está acontencendo e conhecer melhor as possibilidades e limitações do setup escolhido. Essa teoria, porém, não cabe no escopo de um post e nem tenho competência (e paciência) para abordá-la. Por isso, coloquei os melhores links que encontrei sobre a mesma no final do post. Recomendo fortemente a leitura dos links (não é da boca para fora, li e aprendi bastante - e o conteúdo não é excessivamente técnico).
As únicas pinceladas teóricas seguem abaixo:
O LVM (se você não sabe o que é, pare e se informe antes) não é essencial para criptografar um disco, mas utilizamos o mesmo para termos flexibilidade na criação/destruição/modificação de partições no interior do disco criptografado.
O LVM em nosso setup é utilizado numa camada acima do LUKS (tecnologia para criptografia), assim necessitamos de apenas uma password para destravar todas as partições no HD … e eliminamos possíveis complicações para suspender e etc. O lado negativo é que o layout do LVM não é transparente (está dentro do blockdevice encriptado usando LUKS) e por isso não é possível extender volumes lógicos através de outros discos.
=>AVISO<=: Não é um post para iniciantes. Assim, por exemplo, não será explicado quando usar root, como utilizar o gparted ou mesmo o que é /etc/fstab
.
Preparando o disco e criando o container encriptado
Nesse passo preparemos o disco (apagaremos de forma a dificultar a quebra da criptografia) e criaremos o container criptografado. É aqui que reside a parte que realmente diz respeito à criptografia.
Obs: No post supomos que o HD utilizado é /dev/sdb
.
1. Escreva o disco inteiro com dados aleatórios
Motivo: dificultar o deciframento ao garantir que o espaço vazio é indistinguível dos dados escritos sob criptografia.
- Crie um container encriptado temporário para o disco desejado (ex:
/dev/sdb
):
1 | # cryptsetup open --type plain /dev/sdb container |
- Verifique que ele existe (ou seja, se
/dev/mapper/container
é listado):
1 | # fdisk -l |
- Limpe o disco com dados pseudoaleatórios (aleatórios pq são escritos no container encriptado) [demora muito]:
1 | # dd if=/dev/zero of=/dev/mapper/container |
- Feche o container:
1 | # cryptsetup close container |
Fonte: https://wiki.archlinux.org/index.php/Dm-crypt/Drive_preparation#dm-crypt_wipe_before_installation
2. Crie o container encriptado
- Crie uma partição do tipo 8E00 (LVM2 PV) para abrigar o container criptografado:
A partição pode ser criada no fdisk, cfdisk, parted ou gparted. No gparted, basta criar uma partição do tipo “lvm2 pv”.
Em nosso caso, a nova partição é /dev/sdb1
.
- Crie o container criptografado LUKS (usando opções default):
1 | # cryptsetup luksFormat /dev/sdb1 |
Confirme com YES
e digite uma senha duas vezes (essa senha será usada p/ destravar o container, sem ela … não temos acesso aos dados)
- Destrave o container (disponibiliza de forma não criptografada):
1 | # cryptsetup open --type luks /dev/sdb1 container-destravado |
O container destravado está disponível em /dev/mapper/container-destravado
.
Pronto, a parte relativa à criptografia está feita. O motivo de destravarmos o container é que criaremos no próximo passo a estrutura LVM dentro do container (e consequentemente as partições).
Criando estrutura LVM e seu(s) volume(s) lógico(s)
Com o container criptografado criado e destravado, é hora de criarmos a estrutura LVM segundo nossas preferências.
O procedimento agora não diz respeito à criptografia, mas ao manuseio normal de partições.
Vejamos um caso utilizando 1 physical volume (PV), dentro de 1 volume group (VG), contendo 1 logical volume (LV) ocupando todo o espaço disponível no disco. Ou seja, utilizamos um arranjo básico de LVM que implicará numa partição (em nosso caso, EXT4) ocupando todo o disco.
Procedimento:
- Crie um physical volume no container descriptografado:
1 | # pvcreate /dev/mapper/container-destravado |
- Crie um volume group, e adicione o physical volume previamente criado:
1 | # vgcreate nome-do-vg /dev/mapper/container-destravado |
- Crie um logical volume no volume group:
1 | # lvcreate -l +100%FREE nome-do-vg -n nomeDoLg |
- Formate o logical volume com um filesystem:
1 | # mkfs.ext4 /dev/mapper/nome--do--vg-nomeDoLg |
Pronto, agora temos um arranjo LVM com uma partição EXT4 dentro de um container criptografado. Mas … como montamos e desmontamos essa partição no uso diário? Vejamos o último passo :D,
Montando e desmontando
Para acessarmos o conteúdo das partições dentro do container criptografado … basta destravarmos o container e montar normalmente as partições. Vejamos como fazer isso manualmente e automaticamente.
Manualmente:
Montando:
- Destrave a container:
1
# cryptsetup open --type luks /dev/sdb1 container-destravado
- Monte a partição desejada:
1
# mount -t ext4 /dev/mapper/nome--do--vg-nomeDoLg /mnt/nomeDoLg/
- Destrave a container:
Desmontando:
Desmonte a partição:
1
# umount /mnt/nomeDoLg/
Feche o container:
1
# cryptsetup close container-destravado
Automaticamente:
- Adicione uma entrada para a partição em
/etc/fstab
. Exemplo:
/dev/mapper/nome--do--vg-nomeDoLg /mnt/nomeDoLg/ ext4 defaults 0 2
- Adicione uma entrada para o container em
/etc/crypttab
. Exemplo:
container-destravado UUID=4fdc96a2-5f97-44a5-783d-dcd0d0658fdd none luks
Obs: O UUID informado é o da partição utilizada para criar o container (em nosso casodev/sdb1
).
O arquivo
/etc/crypttab
contém uma lista de blockdevices encriptados (aka containers) que são destravados no boot. Ocrypttab
é lido antes dofstab
e portanto destrava o container antes que os filesystems dentro dele sejam montados.- Adicione uma entrada para a partição em
Links:
- Disk encryption - ArchWiki: O que é e como funciona criptografia em discos, partições, etc. Tipos de criptografia no GNU/Linux, soluções utilizadas, etc. Recomendado
- dm-crypt/Encrypting a non-root file system - ArchWiki: Documentação suscinta e clara sobre como criar e montar partições criptografadas non-root.
- dm-crypt/Encrypting an entire system - ArchWiki: Documentação sobre diversas estratégias para criptografar o sistema inteiro.
- Adding an external encrypted drive with LVM to Ubuntu Linux | Earl C. Ruby III: Post sobre como criar e montar partições criptografadas non-root. A documentação do Arch é melhor, o destaque desse post é seu estilo simples e direto que serviu como inspiração para essas palavras.
- Documentação Oficial Debian - Instalação c/ criptografia: