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.

  1. Crie um container encriptado temporário para o disco desejado (ex: /dev/sdb):
1
# cryptsetup open --type plain /dev/sdb container
  1. Verifique que ele existe (ou seja, se /dev/mapper/container é listado):
1
# fdisk -l
  1. 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
  1. 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

  1. 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.

  1. 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)

  1. 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:

  1. Crie um physical volume no container descriptografado:
1
# pvcreate /dev/mapper/container-destravado
  1. Crie um volume group, e adicione o physical volume previamente criado:
1
# vgcreate nome-do-vg /dev/mapper/container-destravado
  1. Crie um logical volume no volume group:
1
# lvcreate -l +100%FREE nome-do-vg -n nomeDoLg
  1. 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/
    • 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 caso dev/sdb1).

    O arquivo /etc/crypttab contém uma lista de blockdevices encriptados (aka containers) que são destravados no boot. O crypttab é lido antes do fstab e portanto destrava o container antes que os filesystems dentro dele sejam montados.