Понимание простого 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Инг не меняет результат для моего жесткого диска. Поэтому я попробовал то же самое на файле. Здесь все, кажется, работает как ожидалось. Так что мне интересно...


Мой (главный) вопрос:

  1. Где моя ошибка, я делаю что-то не так? Я предполагал шифрование по секторам, так что в первом случае 3 не должно обнуляться, а во втором случае 2 должно быть рандомизировано.

Это автоматически и неизбежно приводит к последующему вопросу

  1. Тогда даже безопасно предположить, что вы можете безопасно протереть диск, используя этот метод?

Что может помочь на пути туда добраться:

  • Разве не отображается отображение простого устройства 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.

Другие вопросы по тегам