Eu tinha uma configuração em que meu dispositivo removível continha uma única partição com dados criptografados e nada mais para distingui-la dos dados aleatórios. Em um dispositivo fisicamente separado, eu tinha um par de scripts que abria / fechava o dispositivo usando uma chave criptografada por GPG:
#!/bin/bash
# The crypt UUID is hard-coded. That way it will not try to decrypt the wrong
# device.
cryptuuid='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# The UUID of the decrypted device is hard-coded. This is currently how the
# script knows what to mount after decrypting.
deviceuuid='yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
# The encrypted key bits are fed to cryptsetup with specific parameters to
# decrypt the crypt.
gpg2 --decrypt <<- END | sudo cryptsetup --offset 0 --cipher aes-xts-plain64 --key-size 256 --hash sha256 --key-file - open --type plain "/dev/disk/by-partuuid/$cryptuuid" Secrets
-----BEGIN PGP MESSAGE-----
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzz
-----END PGP MESSAGE-----
END
# A small delay is necessary to give time for the decrypted device to show up.
sleep 1
# Mount the decrypted device as if the user did it using the GUI.
gvfs-mount -d $(readlink -f $(blkid -U "$deviceuuid"))
#!/bin/bash
# The UUID of the decrypted device is hard-coded. This is currently how the
# script knows what unmount.
deviceuuid='yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
# Find all processes using the decrypted device and issue a “friendly” kill
# signal.
sudo lsof -t $(findmnt -rn -S UUID="$deviceuuid" -o TARGET) | while read process; do kill -HUP $process; done
# Try to unmount the decrypted device and then close it with cryptsetup. findmnt
# identifies the path which the device is mounted. lsblk finds the decrypted
# device (minus “/dev/” from the UUID). dmsetup finds the decrypted device name
# given the block device name from before.
gvfs-mount -u $(findmnt -rn -S UUID="$deviceuuid" -o TARGET) && sudo cryptsetup close $(sudo dmsetup info --columns --noheadings --options Name --select BlkDevName=$(lsblk --raw --noheadings --output KNAME,UUID | awk '{if ($2=="'"$deviceuuid"'") { print $1}}'))
Os scripts funcionaram, mas, idealmente, eu gostaria de aproveitar o máximo possível do suporte à GUI interno para partições criptografadas, diminuindo o uso do terminal.
Na minha tentativa de me aproximar desse objetivo, dei uma olhada no Logical Volume Manager (LVM) para seu recurso JBOD. A idéia era ter uma partição LUKS que aparecesse no gerenciador de arquivos, mas também manter o cabeçalho LUKS longe dos dados criptografados, deixando os dados criptografados indistinguíveis dos dados aleatórios.
Para conseguir isso, eu empreguei 2 volumes:
header.imgcontémumapartiçãoGPT,quehospedaumPVdoLVMapenasgrandeosuficienteparacontertodoocabeçalhoLUKS./dev/sdxcontémumapartiçãoGPTquehospedaumPVdoLVMcontendoosdadoscriptografados.
Elessãocriadosusandoestasetapas:
fallocate-l2139648header.img
criaumaimagemparaarmazenaroprimeiroPV.sudopvcreate--labelsector0--metadatatype2--pvmetadatacopies1--metadatasize32768b--dataalignment512b/dev/disk/by-partuuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
criaovolumefísicodocabeçalho.sudopvcreate--labelsector0--pvmetadatacopies0--metadatasize0b--dataalignment512b'/dev/disk/by-partuuid/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
criaumvolumefísicoapenascomocabeçalhoLVM,massemmetadados.vgcreate--metadatacopiesunmanaged--physicalextentsize512bSecrets'/dev/disk/by-partuuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''/dev/disk/by-partuuid/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
criaumgrupodevolumesemcimadessesdoisvolumesfísicos.lvcreate--contiguousn--extents100%FREESecrets--nameCrypt
criaumúnicovolumelógicoqueocupatodooespaçolivrenogrupodevolumes.vgcfgbackup-fmetadata.txtSecrets
.logical_volumes
,devehaverdoissegmentoscomnomes:segment1
esegment2
.Vocêprecisaráeditarosvaloresstart_extent
eextent_count
emcadaumdeles.segment1
deveterstart_extent=0
eextent_count=4040
.Esegment2
deveterstart_extent=4040
eextent_count
igualaope_count
dovolumefísicomaior-quevocêpodeencontrarnaseçãophysical_volumes
.Vocêpodeprecisartrocarpv0
epv1
,masverifiqueasdefiniçõesdevolumeparasecertificardequeestãosão.vgcfgrestore-fmetadata.txtSecrets
aplicarásuasalteraçõesaogrupodevolumes.cryptsetup--verbose--cipheraes-xts-plain64--key-size512--hashsha512--align-payload1luksFormat/dev/Secrets/Crypt
criaovolumecriptografadodoLUKS.vgchange-anSecrets
.Vocêpodeentãoseparare/ouejetarosvolumesfísicos.Quando/dev/sdxéinseridoeheader.imgémontadousandooUtilitáriodeDisco,umíconeéexibidonoIniciadorque,quandoclicado,solicitaumsenhaparadesbloquearovolume;oterminalnãoénecessárioemnenhumadasetapas,excetonaocasiãoaleatóriaemqueovolumelógiconãoregistra.Emseguida,aexecuçãodevgscan --mknodes
e udevadm trigger
parece corrigir o problema.
O problema é que ao desmontar o volume, eu também tenho que usar o terminal para desativar o grupo de volume LVM (VG) antes de remover o dispositivo de loop e ejetar o armazenamento criptografado. Remover fisicamente a mídia de armazenamento não parece fazer com que o grupo de volumes desapareça e os dispositivos de loop sejam impedidos de serem desmontados.
Eu ficaria satisfeito em apenas resolver o problema de remoção de dispositivo, mas acho que estou complicando demais as coisas apenas criando e mantendo essa configuração.
Alguma distribuição Linux suporta hoje uma criptografia de múltiplos fatores e fácil de usar?
Tags lvm luks ubuntu disk-encryption dm-crypt