復号化されたコンテンツでLUKSパーティションを上書きできますか?

復号化されたコンテンツでLUKSパーティションを上書きできますか?

私のデータは私のハードドライブ(他のハードドライブで利用可能な最も重要なデータの部分バックアップ)にあり、現在LUKS経由のLVM経由のExt4としてフォーマットされています。 LUKSレイヤーを削除したいのですが、バックアップからデータを再フォーマットして復元する作業が長すぎて面白くありません。大きなバッファを使用せずにデータを破損することなく、LUKSパーティションをその内容で上書きする可能性/機会はありますか?

答え1

とにかくすべてのデータをコピーする必要があります。この時点では必ずバックアップが必要です。バックアップデバイスがアクティブディスクよりはるかに遅くない限り、バックアップから復元する速度はできるだけ速くなります。

LUKSボリュームはヘッダー(最大2MB)。ヘッダーが失われると、ボリュームのデータも失われます。ヘッダーが破損しない限り、個々の512バイトセクタのデータにアクセスできます。

この戦略は、cat /dev/mapper/encrypted >/dev/sdz99暗号文がプレーンテキストと比較して正のオフセット(ヘッダーサイズ)にあるために機能します。ただし、これは同じディスク上のコピーなので、バックアップから復元するよりも遅くなる可能性があります(読み取りと書き込みはディスク間コピーを使用して並列に実行されます)。同じディスクコピーの場合ddブロックサイズは次よりも高速です。cat。この戦略には1つの重要な注意事項があります。コピー中に停電やその他のシステムクラッシュが発生すると、ヘッダーが最初に上書きされたため、パーティション全体がフラッシュされます。

最初の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レイヤーの削除をテストするためにいくつかのスクリプト(答えの終わりを参照)を作成しました。 2番目に重要なこと(最初はデータの完全バックアップを作成すること)は、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

関連情報