Criando volumes encriptados com LUKS no GNU/Linux
Publicado em GNU/Linux
cryptsetup encryption gnu linux luks
Esses dias eu precisei montar um volume encriptado para gravar algumas informações que achava interessante ficarem isoladas do restante do disco. Nada de teorias de conspiração (vocês sabiam que tenho interesse muito grande por ufologia? posso contar essa história qualquer dia ..) nem nenhum material de alguma bizarrice pornô, apenas algumas coisas que às vezes aparecem que não acho interessante gravar como de costume no Evernote ou armazenar no Google Drive. Criar o volume é um dos passos - fáceis - mas é muito importante outro passo que a gente sempre esquece. Importante: use esses procedimentos por sua conta e risco!.
Básico
Criando o volume
Primeiro vamos criar o volume usando o LUKS, que é uma especificação para encriptar discos que apesar de originalmente destinada para o GNU/Linux, roda até em sistemas com windows.
Para criar o volume, temos primeiro que estipular um tamanho bom para ele. Para nosso exemplo, vamos criar um volume com 100 Mb de tamanho, criando um novo arquivo com esse tamanho através do utilitário dd
, no diretório de sua preferência (aqui eu vou usar o /tmp
para o exemplo, mas nunca use esse diretório pois distribuições como o Ubuntu apagam o conteúdo do danado quando são reiniciadas):
dd if=/dev/zero of=secret.img bs=1M count=100
Explicando um pouco o comando:
-
Foi utilizado como input (através de
if
) dos bytes o device/dev/zero
, o que vai preencher o volume com um monte de zeros. Se você não estiver com pressa e tiver várias coisas rodando no computador, pode utilizar o/dev/random
, que vai deixar o volume mais seguro ainda). -
O output do comando foi para o arquivo
secret.img
, que pode ser dado qualquer nome (e extensão) que você quiser (gemeas_siamesas_e_bode.img
, por exemplo, se você for uma pessoa bem pervertida e ingênua). -
O block size, que são os tamanhos dos blocos a serem alocados, foi indicado como sendo 1 Mb (
bs=1M
). -
O total de blocos foi especificado como 100 (através de
count=100
), ou seja, se temos blocos de 1 Mb e queremos 100 blocos, vamos ter um arquivo de 100 Mb.
Esse comando deve rodar bem rápido e retornar algo similar à isso:
100+0 registros de entrada
100+0 registros de saída
104857600 bytes (105 MB) copiados, 0,0672096 s, 1,6 GB/s
Montando o volume como um dispositivo de bloco
Agora temos que "montar" esse arquivo criado como se fosse um dispositivo de blocos. Para isso, vamos utilizar o comando losetup
, mas antes de montar, vamos ver quais dispositivos de blocos que temos disponíveis (reparem que vamos começar a utilizar o sudo
para executar alguns comandos, alguns não precisam mas já fica garantido que se precisar, já tem autoridade):
$ sudo losetup -a
$
Aqui o resultado foi vazio, indicando que não existem nenhum dispositivos do tipo montados. Quando é vazio, podemos começar a montar nossos dispositivos a partir do 0
, aproveitando para listar novamente:
$ sudo losetup /dev/loop0 secret.img
$ sudo losetup -a
/dev/loop0: [2049]:1967672 (/tmp/secret.img)
Formatando o volume
Vamos formatar o volume indicando que deve usar o LUKS
, com o utilitário cryptsetup
:
$ sudo cryptsetup luksFormat /dev/loop0
WARNING!
========
Isto irá sobrescrever os arquivos em /dev/loop0 definitivamente.
Are you sure? (Type uppercase yes): YES
Informe a frase secreta:
Verify passphrase:
Ali é exibida uma parte muito importante do processo: a senha do volume. Se você perder a senha, já era, seus dados não vão estar mais acessíveis a não ser que você utilize uma senha muito fácil que possa ser quebrada por força bruta, mas senhas simples para um volume como esse não é o caso, não é mesmo? Utilize uma senha boa e que possa ser lembrada.
Abrindo o volume
Temos agora que abrir o volume encriptado, dando um nome à ele (eu costumo utilizar o mesmo nome do arquivo criado, sem a extensão, mas fica ao critério de cada um):
$ sudo cryptsetup luksOpen /dev/loop0 secret
Informe a frase secreta para /tmp/secret.img:
Criando o sistema de arquivos
Precisamos montar um sistema de arquivos no volume já aberto. Vamos utilizar o ext4 como sistema de arquivos e formatar utilizando o mkfs.ext4
(reparem que aqui utilizamos o mapper
):
$ sudo mkfs.ext4 /dev/mapper/secret
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 100352 1k blocks and 25168 inodes
Filesystem UUID: 5733fdf2-9ef9-444e-9da3-043f95943c54
Cópias de segurança de superblocos gravadas em blocos:
8193, 24577, 40961, 57345, 73729
Allocating group tables: pronto
Gravando tabelas inode: pronto
Creating journal (4096 blocks): concluído
Escrevendo superblocos e informações de contabilidade de sistema de arquivos: 0concluído
Montando o sistema de arquivos
Precisamos de algum local no sistema de arquivos atual para montar o volume já criado, formatado e com sistema de arquivos. Vamos criar um diretório novo e montar:
$ mkdir secret
$ sudo mount /dev/mapper/secret secret
Dando permissões no sistema de arquivos
O sistema de arquivos foi criado com permissões apenas para o usuário root
. Vamos corrigir isso entrando dentro do sistema de arquivos montado, ajustando as permissões para o usuário corrente e criando um arquivo novo para ver se ficou tudo ok:
$ cd secret/
[secret] $ ls
total 33K
drwxr-xr-x 3 root root 1,0K Jun 27 09:47 .
drwxrwxrwt 22 root root 20K Jun 27 09:58 ..
drwx------ 2 root root 12K Jun 27 09:47 lost+found
[secret] $ sudo chown -Rv taq.taq .
alterado o dono de “./lost+found” de root:root para taq:taq
alterado o dono de “.” de root:root para taq:taq
[secret] $ echo "oi" > teste.txt
[secret] $ cat teste.txt
oi
Fechando tudo
Agora que tudo o que precisávamos para o volume está feito, podemos "fechar o boteco" (vejam que inicialmente eu estava dentro do diretório do volume montado, por isso que utilizei o cd
para sair):
[secret] $ cd ..
$ sudo umount secret
$ sudo cryptsetup luksClose secret
$ sudo losetup -d /dev/loop0
$ sudo losetup -a
Como podemos ver no comando final, não existe mais nenhum dispositivo de blocos montado. Yay.
Extras muito importantes
Tudo lindo e maravilhoso, mas aí você, como eu, insere uma senha "hacker-muito-macho-nunca-vou-esquecer-essa-bodega" e ... esquece a dita cuja. Ou pior, você tem tudo certinho mas por alguma infelicidade do sistema de arquivos do seu disco rígido, o volume encriptado é corrompido, e aí?
Antes de acontecer alguma situação nada agradável como essas, podemos garantir algumas coisas.
Adicionando uma senha extra
O LUKS
permite que tenhamos até 8 senhas (!!!) para o volume criado. Vamos dar uma olhada no cabeçalho do arquivo criado:
$ sudo cryptsetup luksDump secret.img
LUKS header information for secret.img
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 22 a2 74 61 50 61 7a 36 d6 af 70 be ce ee 33 fe d1 af 4c c8
MK salt: 7b 73 18 d3 20 0b 75 ad 9f 7d c4 f1 56 2d f0 10
6e bd fe e5 e0 e9 8f 9d 9a 78 17 57 1c 9f 63 7d
MK iterations: 108000
UUID: 8f6d3b69-493a-4757-910b-5eba39b8a028
Key Slot 0: ENABLED
Iterations: 432431
Salt: 23 e9 5d f7 a4 e1 6d 6a 00 ba 33 d5 62 67 42 ab
fb c0 4c 20 43 be 4b cc ea 63 38 fe 75 b3 e6 cb
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Podemos ver ali que o slot 0 está sendo utilizado, que é onde inserimos a senha quando formatamos o volume. Vamos pedir para adicionar mais uma senha:
$ sudo cryptsetup luksAddKey --key-slot 1 secret.img
Enter any existing passphrase:
Digite nova frase secreta para porta:
Como podemos ver, alguma das senhas já armazenadas é requisitada quando pedimos para adicionar uma senha nova, então faça isso logo após criar o volume com a senha inicial! Dando uma olhada novamente no cabeçalho:
$ sudo cryptsetup luksDump secret.img
LUKS header information for secret.img
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 22 a2 74 61 50 61 7a 36 d6 af 70 be ce ee 33 fe d1 af 4c c8
MK salt: 7b 73 18 d3 20 0b 75 ad 9f 7d c4 f1 56 2d f0 10
6e bd fe e5 e0 e9 8f 9d 9a 78 17 57 1c 9f 63 7d
MK iterations: 108000
UUID: 8f6d3b69-493a-4757-910b-5eba39b8a028
Key Slot 0: ENABLED
Iterations: 432431
Salt: 23 e9 5d f7 a4 e1 6d 6a 00 ba 33 d5 62 67 42 ab
fb c0 4c 20 43 be 4b cc ea 63 38 fe 75 b3 e6 cb
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 407642
Salt: 3d c0 ea 6c df f3 f0 37 b0 0e df b0 24 e9 ce 97
9c e5 38 75 ba 84 68 91 30 91 19 ae f3 21 51 86
Key material offset: 264
AF stripes: 4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Perfeito, o slot 1 foi alocado. Vamos tentar abrir o volume agora com essa nova senha (fica a dica para a sequência de comandos, menos o ls
e o cat
, lógico, para a montagem dos volumes, utilizados ali somente para verificar se está tudo ok):
$ sudo losetup /dev/loop0 secret.img
$ sudo cryptsetup luksOpen /dev/loop0 secret
Informe a frase secreta para /tmp/secret.img:
$ sudo mount /dev/mapper/secret secret
$ ls secret
total 34K
drwxr-xr-x 3 taq taq 1,0K Jun 27 10:02 .
drwxrwxrwt 22 root root 20K Jun 27 10:18 ..
drwx------ 2 taq taq 12K Jun 27 09:47 lost+found
-rw-rw-r-- 1 taq taq 3 Jun 27 10:02 teste.txt
$ cat secret/teste.txt
oi
Senha extra funcionando corretamente.
Fazendo um backup do cabeçalho
Aí o seu disco rígido (interno, externo, pendrive ou onde seja que você armazenou o volume) dá algum tipo de problema e corrompe o seu arquivo. Vamos voltar no tempo e criar alguns resguardos em relação à isso. Antes de mais nada, vamos executar um teste para verificar se o cabeçalho do volume está ok:
$ sudo cryptsetup -v isLuks secret.img
Comando excutado com sucesso.
Aparentemente, tudo ok. Agora vamos fazer o backup do cabeçalho para um arquivo:
$ sudo cryptsetup luksHeaderBackup secret.img --header-backup-file secret.header
Isso gera um arquivo chamado secret.header
que pode ser mais tarde utilizado para recuperar o cabeçalho do volume. Armazene esse cabeçalho em um local seguro!
Removendo o cabeçalho
Mas que diabos, se logo ali acima estamos tentando dar um jeito de preservar o cabeçalho, para que remover o dito cujo? Simples: para que ninguém saiba que aquele volume é um volume LUKS
. :-)
Um cabeçalho LUKS
é facilmente identificável com os bytes logo no começo do volume:
$ hexdump -C secret.img | less
00000000 4c 55 4b 53 ba be 00 01 61 65 73 00 00 00 00 00 |LUKS....aes.....|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 78 74 73 2d 70 6c 61 69 |........xts-plai|
...
Podemos remover e depois restaurar com a cópia que fizemos acima. Para isso vamos apagar os primeiros bytes do arquivo, no tamanho do cabeçalho que foi salvo anteriormente, verificado no primeiro comando:
$ sudo wc -c secret.header | cut -f1 -d' '
1049600
$ dd conv=notrunc if=/dev/zero of=secret.img bs=1 count=1049600
1049600+0 registros de entrada
1049600+0 registros de saída
1049600 bytes (1,0 MB) copiados, 0,958486 s, 1,1 MB/s
Verificando novamente se é um volume LUKS
válido:
$ sudo cryptsetup -v isLuks secret.img
O dispositivo secret.img não é um dispositivo LUKS válido.
Falha no comando com código 22: O dispositivo secret.img não é um dispositivo LUKS válido
Restaurando o cabeçalho
Agora vamos restaurar o cabeçalho:
$ sudo cryptsetup luksHeaderRestore secret.img --header-backup-file secret.header
[sudo] password for taq:
WARNING!
========
Dispositivo secret.img não contém um cabeçalho LUKS. Substituindo o cabeçalho pode destruir os dados no dispositivo.
Are you sure? (Type uppercase yes): YES
Verificando novamente:
$ sudo cryptsetup -v isLuks secret.img
Comando excutado com sucesso.
$ sudo losetup /dev/loop0 secret.img
$ sudo cryptsetup luksOpen /dev/loop0 secret
Informe a frase secreta para /tmp/secret.img:
$ sudo mount /dev/mapper/secret secret
$ ls secret
total 34K
drwxr-xr-x 3 taq taq 1,0K Jun 27 10:02 .
drwxrwxrwt 22 root root 20K Jun 27 12:29 ..
drwx------ 2 taq taq 12K Jun 27 09:47 lost+found
-rw-rw-r-- 1 taq taq 3 Jun 27 10:02 teste.txt
$ cat secret/teste.txt
oi
Comentários
Comentários fechados.
Sem nenhum comentário.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300