Posso sobrescrever a partição LUKS com o conteúdo descriptografado?

5

Eu tenho HDD com meus dados (backup parcial dos dados mais importantes disponíveis em outro HDD), atualmente é formatado como Ext4 sobre LVM sobre LUKS. Desejo remover a camada LUKS, mas a reformatação e a restauração de dados do backup são muito longas / não são divertidas. Existe alguma possibilidade / chance de substituir a partição LUKS com seu conteúdo sem usar um buffer grande e sem corrupção de dados?

    
por avi9526 18.05.2014 / 16:20

3 respostas

3

Você terá que copiar todos os dados de qualquer maneira. Você definitivamente deveria ter um backup neste momento. A menos que seu dispositivo de backup seja significativamente mais lento que seu disco ativo, a restauração a partir do backup é tão rápida quanto possível.

Um volume LUKS começa com um cabeçalho ( até 2MB ). Se você perder o cabeçalho, os dados no volume serão perdidos. Enquanto o cabeçalho estiver intacto, você pode acessar dados em setores independentes de 512 bytes.

Uma estratégia como cat /dev/mapper/encrypted >/dev/sdz99 funcionará, porque o texto cifrado está localizado em um deslocamento positivo (o tamanho do cabeçalho) em relação ao texto simples. No entanto, isso pode ser mais lento do que restaurar a partir do backup, porque é uma cópia no mesmo disco (com uma cópia de disco para disco, a leitura e a gravação são feitas em paralelo). Para uma cópia do mesmo disco, dd com um tamanho de bloco grande é apenas um pouco mais rápido que cat . Há uma grande ressalva com esta estratégia: se houver uma falha de energia ou outro travamento do sistema durante a cópia, toda a sua partição será apagada, porque o cabeçalho foi sobrescrito logo de início.

Você pode salvar os primeiros 2 MB de dados em outro lugar e mover o restante:

dd if=/dev/mapper/encrypted of=/dev/sdz99 bs=2M skip=1 seek=1

Dessa forma, você pode continuar após uma interrupção (não tente montar o volume lógico, e muito menos montar o sistema de arquivos!); no entanto, isso requer saber de onde você parou. Isso é praticamente impossível de determinar (você teria que usar uma ferramenta de cópia que produza um rastro dos blocos que está copiando e os grava no disco, sincronicamente com as cópias de bloco).

Se o seu armazenamento de backup é muito lento, então você pode usar essa estratégia de mudança - o% normal que o cat irá fazer - e voltar a restaurar a partir do backup se algo de ruim acontecer.

Se o armazenamento de backup for realmente pesado, uma abordagem diferente seria:

  1. Diminuir o sistema de arquivos ( resize2fs ).
  2. Reduza o volume lógico ( lvreduce ).
  3. Diminuir o volume físico ( pvresize ).
  4. Encolher o volume criptografado .
  5. Reduza a partição ( fdisk ou gdisk ) e crie uma nova partição no espaço liberado.
  6. Crie um volume físico na nova partição ( pvcreate ) e adicione-o ao grupo de volumes ( vgextend ).
  7. Mova o máximo possível de extensões físicas para o volume criptografado ( pvmove ).
  8. Se o volume criptografado não estiver vazio, repita a partir da etapa 1.
  9. Livre-se do volume físico agora não utilizado ( vgreduce then pvremove ).

Longa e tortuosa? Sim. Mais uma vez, minha recomendação é restaurar a partir do backup.

    
por 19.05.2014 / 03:51
2

O LUKS coloca um cabeçalho em um volume que geralmente tem tamanho de 2MiB.

Assim, você pode copiar o conteúdo do volume aberto do LUKS para o volume base do LUKS usando dd .

Observe que, se você perder energia durante a cópia, ficará com dados indecifráveis, já que o cabeçalho do volume será perdido.

Se apenas uma pequena parte do volume for coberta com dados, pode ser mais rápido reduzir o volume do LUKS, criar um novo por trás dele e copiar os dados no nível do sistema de arquivos ( cp -a ).

    
por 18.05.2014 / 16:26
0

Resposta curta: É possível, mas eu não faria isso com meus dados devido a nenhuma garantia sobre segurança de dados e baixa velocidade (provavelmente levará ~ 10 horas para converter meu disco de 1 TB)

TL; DR:

Eu decidi verificar isso na máquina virtual do VirtualBox com um volume de HDD virtual de 2GB anexado como / dev / sdb. Eu escrevo algum script (veja o final da resposta) para testar a remoção da camada LUKS da pilha do sistema de arquivos. A segunda coisa importante (a primeira é ter backup completo de seus dados) é despejar o cabeçalho LUKS no armazenamento externo e abrir o volume LUKS com esse cabeçalho externo (porque o cabeçalho no volume será sobrescrito). Sem taxa de falha é ~ 50% (2 teste de 4 falhou). Com o cabeçalho externo 4 de 4 teste foi bem sucedido ... Enfim, eu estava com preguiça de fazer mais verificações (eu só verifiquei md5sum de um arquivo grande), então não há garantia para seus dados estarem seguros. Você, provavelmente, precisará editar o script se quiser brincar com ele (linha com Disk=/dev/sdb )

#!/bin/bash

Disk=/dev/sdb

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root. Exit"
   exit 1
fi
echo ----------------------------------------------------
echo "Removing old test data"
echo ----------------------------------------------------
vgremove test -f
umount -l /mnt/old
rm -rf /mnt/old
mkdir /mnt/old
umount -l /mnt/new
rm -rf /mnt/new
mkdir /mnt/new
rm -f /tmp/header
rm -f /tmp/key
echo ----------------------------------------------------
DiskCrypt="$(basename $Disk)_crypt"
echo "Creating LUKS device with name $DiskCrypt for disk $Disk"
echo ----------------------------------------------------
echo "password" > /tmp/key
cryptsetup -q luksFormat -c aes-xts-plain64 -s 512 -d /tmp/key $Disk
cryptsetup -q luksHeaderBackup $Disk --header-backup-file /tmp/header
cryptsetup -q luksOpen --header /tmp/header -d /tmp/key $Disk $DiskCrypt
echo ----------------------------------------------------
echo "Creating LVM volume group and logical volume"
echo ----------------------------------------------------
vgcreate test /dev/mapper/$DiskCrypt
lvcreate -n test -l 100%FREE test
pvdisplay
echo ----------------------------------------------------
echo "Format volume to Ext4"
echo ----------------------------------------------------
mkfs.ext4 /dev/mapper/test-test
mount /dev/mapper/test-test /mnt/old
chmod o+rwx /mnt/old
cd /mnt/old
rm -f ./test-file
echo ----------------------------------------------------
echo "Create file with random content to fill entire volume"
echo ----------------------------------------------------
dd if=/dev/urandom of=./test-file bs=64M
stat ./test-file
echo ----------------------------------------------------
echo "Checking MD5 sum"
echo ----------------------------------------------------
md5old=$(md5sum ./test-file)
# cp ./test-file /tmp/
cd /
umount -l /mnt/old
echo ----------------------------------------------------
echo "Disabling and exporting LVM volume group"
echo ----------------------------------------------------
vgchange -an test
vgexport test
echo ----------------------------------------------------
echo "Moving data using dd"
echo ----------------------------------------------------
dd if=/dev/mapper/$DiskCrypt of=$Disk bs=64M
cryptsetup -q luksClose $DiskCrypt
echo ----------------------------------------------------
echo "Importing LVM volume group and check file system"
echo ----------------------------------------------------
pvscan
vgimport test
vgchange -ay test
pvdisplay
# Device may be not ready yet
sleep 5
fsck -f /dev/test/test
resize2fs /dev/test/test
echo ----------------------------------------------------
echo "Checking MD5 sum"
echo ----------------------------------------------------
mount /dev/mapper/test-test /mnt/new
cd /mnt/new
stat ./test-file
md5new=$(md5sum ./test-file)
echo ====================================================
echo "Old File MD5 sum:"
echo "$md5old"
echo ====================================================
echo "New File MD5 sum:"
echo "$md5new"
echo ====================================================
if [ "$md5old" == "$md5new" ]
then
    echo "<< SUCCESS >>"
else
    echo ">> FAILED <<"
fi
echo ====================================================
cd /
umount -l /mnt/new
    
por 19.05.2014 / 19:47