해독된 콘텐츠로 LUKS 파티션을 덮어쓸 수 있나요?

해독된 콘텐츠로 LUKS 파티션을 덮어쓸 수 있나요?

내 데이터는 내 하드 드라이브(다른 하드 드라이브에서 사용할 수 있는 가장 중요한 데이터의 부분 백업)에 있고 현재 LUKS를 통한 LVM을 통한 Ext4로 포맷되어 있습니다. LUKS 레이어를 제거하고 싶은데 백업에서 데이터를 다시 포맷하고 복원하는 작업이 너무 길어서 재미가 없습니다. 큰 버퍼를 사용하지 않고 데이터를 손상시키지 않고 LUKS 파티션을 해당 내용으로 덮어쓸 가능성/기회가 있습니까?

답변1

어쨌든 모든 데이터를 복사해야 합니다. 이 시점에서는 반드시 백업이 있어야 합니다. 백업 장치가 활성 디스크보다 훨씬 느리지 않는 한 백업에서 복원하는 속도는 최대한 빠릅니다.

LUKS 볼륨은 헤더(최대 2MB). 헤더가 손실되면 볼륨의 데이터도 손실됩니다. 헤더가 손상되지 않는 한 개별 512바이트 섹터의 데이터에 액세스할 수 있습니다.

이와 같은 전략은 cat /dev/mapper/encrypted >/dev/sdz99암호문이 일반 텍스트에 비해 양의 오프셋(헤더 크기)에 있기 때문에 작동합니다. 그러나 이는 동일한 디스크에 있는 복사본이기 때문에 백업에서 복원하는 것보다 느릴 수 있습니다(읽기 및 쓰기는 디스크 간 복사를 사용하여 병렬로 수행됨). 동일한 디스크 복사본의 경우dd블록 크기는 다음보다 빠릅니다.cat. 이 전략에는 한 가지 중요한 주의 사항이 있습니다. 복사하는 동안 정전이나 기타 시스템 충돌이 발생하면 헤더가 먼저 덮어쓰기되었기 때문에 전체 파티션이 플러시됩니다.

처음 2MB의 데이터를 다른 곳에 저장하고 나머지는 이동할 수 있습니다.

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

이 방법을 사용하면 중단 후에 다시 시작할 수 있습니다(그러나 파일 시스템을 마운트하는 것은 말할 것도 없고 논리 볼륨을 조립하려고 시도하지 마십시오!). 그러나 이를 위해서는 중단한 위치를 알아야 합니다. 이는 사실상 확인하기가 불가능합니다(복제 도구를 사용하여 복사 중인 블록의 추적을 출력하고 이를 블록 복사와 동시에 디스크에 써야 함).

백업 스토리지가 매우 느린 경우에는 이 전송 전략을 사용할 수 있으며(간단한 cat전송이면 충분함) 문제가 발생하면 백업에서 복원으로 돌아갈 수 있습니다.

백업 스토리지의 용량이 매우 큰 경우 다른 접근 방식은 다음과 같습니다.

  1. 파일 시스템을 축소합니다( resize2fs).
  2. 논리 볼륨( lvreduce)을 축소합니다.
  3. 물리적 크기를 줄입니다( pvresize).
  4. 암호화된 볼륨 축소.
  5. 파티션을 축소( fdisk또는 gdisk)하고 여유 공간에 새 파티션을 만듭니다.
  6. 새 파티션( pvcreate)에 물리 볼륨을 생성하고 이를 볼륨 그룹( vgextend)에 추가합니다.
  7. 볼륨 밖으로 가능한 한 많은 물리적 확장 영역을 이동합니다( pvmove).
  8. 암호화된 볼륨이 비어 있지 않으면 1단계부터 반복하십시오.
  9. 현재 사용하지 않는 물리 볼륨을 제거합니다( vgreduce그런 다음 pvremove).

길고 구불구불한가요? 예. 다시 한 번 말씀드리지만, 백업에서 복원하라는 조언을 드립니다.

답변2

LUKS는 일반적으로 크기가 2MiB인 볼륨에 헤더를 배치합니다.

따라서 열려 있는 LUKS 볼륨의 내용을 LUKS 기본 볼륨에 복사하는 방법을 사용할 수 있습니다 dd.

복사 프로세스 중에 전원이 꺼지면 볼륨 헤더가 손실되므로 해독할 수 없는 데이터가 남게 됩니다.

볼륨의 작은 부분만 데이터로 덮여 있는 경우 LUKS 볼륨을 축소하고 그 뒤에 새 볼륨을 생성한 다음 파일 시스템 수준에서 데이터를 복사하는 것이 더 빠를 수 있습니다( cp -a).

답변3

짧은 답변:가능하지만 데이터 보안이 보장되지 않고 속도도 낮기 때문에 데이터를 사용하지 않을 것입니다. (1TB 디스크를 변환하는 데 약 10시간 정도 걸릴 것입니다.)

간단히 말해서:

VirtualBox 가상 머신에서 이를 확인하기로 결정하고 2GB 가상 HDD 볼륨을 /dev/sdb로 연결했습니다. 파일 시스템 스택에서 LUKS 계층 제거를 테스트하기 위해 몇 가지 스크립트(답변 끝 참조)를 작성했습니다. 두 번째로 중요한 것(첫 번째는 데이터의 전체 백업을 만드는 것)은 LUKS 헤더를 외부 저장소에 덤프하고 해당 외부 헤더로 LUKS 볼륨을 여는 것입니다(볼륨의 헤더를 덮어쓰게 되므로). 그렇지 않으면 실패율은 약 50%입니다(4번 테스트 중 2번 실패). 외부 헤더 4/4로 성공적으로 테스트되었습니다. 어쨌든 저는 너무 게으른 나머지 더 많은 확인을 할 수 없어(대형 파일의 md5sum만 확인했습니다) 데이터가 안전하다고 보장할 수 없습니다. 이를 사용하려면 스크립트를 편집해야 할 수도 있습니다(다음 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

관련 정보