Понимание простого dm-crypt, cryptsetup, mapping; безопасное стирание данных с использованием простого dm-crypt
Я наткнулся на это, пытаясь стереть весь мой диск, используя обычный dm-crypt, как предложено, например, здесь (arch linux wiki):
# cryptsetup open --type plain -d /dev/urandom /dev/sda to_be_wiped
# dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress
РЕДАКТИРОВАТЬ: см. Ниже, я проверил, что все настроено правильно
Я проверил первые несколько байтов моего диска /dev/sda
и нашел некоторые старые данные на нем, поэтому я попробовал следующее (после запуска выше dd
команда на 2 часа):
A.1 Стирание первой части диска вручную с помощью /dev/zero
:
dd if=/dev/zero of=/dev/sda bs=512 count=2
А.2 Чтение первой части диска, чтобы убедиться, что оно обнулено. Это:
dd if=/dev/sda bs=512 count=2 | xxd
А.3 Чтение первой части сопоставленного устройства. (Это, кажется, также обнулено - ПОЧЕМУ? Разве это не должны быть "дешифрованные нули"?)
dd if=/dev/mapper/to_be_wiped bs=512 count=2 | xxd
После этого я сделал следующее:
B.1 Обнуление сопоставленного устройства /dev/mapper/to_be_wiped
:
dd if=/dev/zero of=/dev/mapper/to_be_wiped bs=512 count=2
Б.2 Чтение /dev/sda
как A.2 выше - все еще нули (ПОЧЕМУ? это не должно быть зашифрованными нулями, то есть случайными данными?).
B.3 Считывание зашифрованного устройства как A.3 выше - также нули (как ожидалось).
Четное sync
Инг не меняет результат для моего жесткого диска. Поэтому я попробовал то же самое на файле. Здесь все, кажется, работает как ожидалось. Так что мне интересно...
Мой (главный) вопрос:
- Где моя ошибка, я делаю что-то не так? Я предполагал шифрование по секторам, так что в первом случае 3 не должно обнуляться, а во втором случае 2 должно быть рандомизировано.
Это автоматически и неизбежно приводит к последующему вопросу
- Тогда даже безопасно предположить, что вы можете безопасно протереть диск, используя этот метод?
Что может помочь на пути туда добраться:
- Разве не отображается отображение простого устройства dm-crypt по секторам, как указано в руководстве?
- Есть ли разница между использованием файла для dm-crypt, а не диска?
РЕДАКТИРОВАТЬ: я проверил, как предложил Xen2050, что все настроено правильно:
# cryptsetup -v status to_be_wiped
/dev/mapper/to_be_wiped is active.
type: PLAIN
cipher: aes-cbc-essiv:sha256
keysize: 256 bits
key location: dm-crypt
device: /dev/sda
sector size: 512
offset: 0 sectors
size: 976773168 sectors
mode: read/write
Command successful.
# dmsetup ls --target crypt
to_be_wiped (254, 0)
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 487.9M 1 loop /run/archiso/sfs/airootfs
sda 8:0 0 465.8G 0 disk
└─to_be_wiped 254:0 0 465.8G 0 crypt
[...]
Устройство loop - из арки linux live stick, которую я использую, я удалил другие существующие диски из lsblk
,
EDIT2: краткий пример с добавленным выводом (ниже). Разве dm-crypt не записывает на диск, если его не закрыть? Если да, то почему и как это изменить? Посмотрите на следующее:
root@archiso ~ # dd if=/dev/zero of=/dev/sda bs=8 count=2 status=none
root@archiso ~ # xxd -l 16 /dev/sda
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # cryptsetup open --type plain -d /dev/urandom /dev/sda to_be_wiped
root@archiso ~ # xxd -l 16 /dev/mapper/to_be_wiped
00000000: df52 0cc9 082a 0de2 1df7 b55f 7626 c45b .R...*....._v&.[
root@archiso ~ # dd if=/dev/zero of=/dev/mapper/to_be_wiped bs=8 count=1 status=none
root@archiso ~ # xxd -l 16 /dev/mapper/to_be_wiped
00000000: 0000 0000 0000 0000 1df7 b55f 7626 c45b ..........._v&.[
root@archiso ~ # xxd -l 16 /dev/sda
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # sync
root@archiso ~ # grep -e Dirty: -e Writeback /proc/meminfo
Dirty: 0 kB
Writeback: 0 kB
WritebackTmp: 0 kB
root@archiso ~ # cat /sys/dev/block/8:0/stat
1153 0 49276 19035 9 0 72 6763 0 19010 25747 0 0 0 0
root@archiso ~ # xxd -l 16 /dev/sda
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # cryptsetup close to_be_wiped
root@archiso ~ # xxd -l 16 /dev/sda
00000000: c6d2 1e9b abf4 16a2 7d1a b1bd 8a28 63d8 ........}....(c.
EDIT3: я провел такой же тест, как и в EDIT2, с большим количеством данных и обнаружил следующее: кажется, что обычный dm-crypt не записывает первую половину мегабайта, пока не будет закрыт. Если я закрою подключенное устройство (cryptsetup close to_be_wiped
) все рандомизировано. Странные вещи без каких-либо объяснений, особенно потому, что файлы, кажется, обрабатываются правильно / немедленно - кто-нибудь есть?
EDIT4: я использовал cryptsetup 2.0.6
на арке iso 2019.02.01
с февраля.
3 ответа
Кажется, это проблема кеширования, как показано ниже:
root@archiso ~ # dd if=/dev/zero of=/dev/sda bs=32 count=2 % zeroing sda
2+0 records in
2+0 records out
64 bytes copied, 0.75095 s, 0.1 kB/s
root@archiso ~ # dd if=/dev/sda bs=32 count=2 status=none | xxd % verify result
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # cryptsetup open --type=plain -d /dev/urandom /dev/sda to_be_wiped % open as plain dm-crypt
root@archiso ~ # dd if=/dev/mapper/to_be_wiped bs=32 count=2 status=none | xxd % show to_be_wiped
00000000: 747a 1b84 3847 b8f2 7bae ec41 a302 05d2 tz..8G..{..A....
00000010: c866 4305 7293 4765 99eb c88b a0da 2548 .fC.r.Ge......%H
00000020: c866 4305 7293 4765 99eb c88b a0da 2548 .fC.r.Ge......%H
00000030: c866 4305 7293 4765 99eb c88b a0da 2548 .fC.r.Ge......%H
root@archiso ~ # dd if=/dev/zero bs=32 count=2 of=/dev/mapper/to_be_wiped % zeroing to_be_wiped
2+0 records in
2+0 records out
64 bytes copied, 0.749869 s, 0.1 kB/s
root@archiso ~ # dd if=/dev/mapper/to_be_wiped bs=32 count=2 status=none | xxd % verify result
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # dd if=/dev/sda bs=32 count=2 status=none | xxd % sda should be randomized, check that
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
root@archiso ~ # dd of=/dev/sda oflag=nocache conv=notrunc,fdatasync count=0 % since sda is not randomized, drop cache manually
0+0 records in
0+0 records out
0 bytes copied, 0.000501071 s, 0.0 kB/s
root@archiso ~ # dd if=/dev/sda bs=32 count=2 status=none | xxd % check sda again
00000000: 077d 0039 4781 2f67 a50c 413f 8ad7 b06d .}.9G./g..A?...m
00000010: 99b2 2517 04cc 04e6 69a5 e806 44ba f902 ..%.....i...D...
00000020: 4208 ff50 72d7 225b e0ce 0346 a1c6 3ac0 B..Pr."[...F..:.
00000030: fab3 b9f9 5218 faf3 4392 50ad 8c71 1f37 ....R...C.P..q.7
Итак, после сброса кеша отображаются рандомизированные данные. Я не знаю, почему кеш сбрасывается после выдачи cryptsetup close
хоть.
Первые команды должны были сработать, они такие же, как и в cryptsetup faq (2.19). Использование файла вместо устройства использует файл промежуточного цикла, но в остальном он такой же.
Но я подозреваю, что произошла ошибка с именем сопоставленного устройства. dd
с радостью создаст новый файл в /dev/mapper/
если ничего не существует, и кажется, что ничего не было записано на ваш жесткий диск.
- Что в папке сейчас, как в
ls -al /dev/mapper/
? После выполнения начальной команды cryptsetup вы проверили:
sudo cryptsetup -v status to_be_wiped
sudo dmsetup ls --target crypt
lsblk
Вы контролировали жесткий диск, чтобы увидеть, действительно ли что-то было написано первым
dd
(используя системный монитор, который различает записи на ваш диск sda, и/
, Я знаюconky
Можно)? Диск sda или системный диск шумели или загорались, если это заметно?
[ Просто интересно, но sda
разве не системный диск? ]
В вашем первом 3. вопросе (к вашему сведению, нумерация вопросов проблематична, есть три отдельных "2"). Вы только что написали нули в начале sda, так что ожидается чтение нулей назад.
Во втором примере dd
пытается написать /dev/mapper
а не файл внутри, но это должно было ошибиться с dd: failed to open '/dev/mapper': Is a directory
так что я предполагаю, что это опечатка в Q.
После обновления EDIT2 & 3
Хм, все выглядит так, как будто должно было сработать, но просто не... команда закрытия afaik cryptsetup не должна ничего писать (просто "забыть" ключ и прекратить шифрование / дешифрование). Только смутно связаны, но LUKS обычно резервирует первые 1M или 2M, если там используется заголовок.
Начиная выглядеть как ошибка в чем-то... Я бы попробовал другой живой ISO / ядро / дистрибутив, чтобы хотя бы сузить, если это просто конкретный живой ISO или ваш диск.
Я столкнулся с аналогичной проблемой сcryptsetup
обычная протирка. Судя по всему, таблица разделов диска осталась нетронутой.lsblk
.
hdparm -z
Кажется, это исправили, хотя я не уверен, как.
-z Force a kernel re-read of the partition table of the specified device(s).
Это был Seagate 2TB, вероятно, с SMR.