
Я читал о том, как сделать жесткие диски безопасными для шифрования, и один из шагов — это записать на диск случайные биты, чтобы сделать зашифрованные данные неотличимыми от остальных данных на жестком диске.
Однако, когда я пытался использовать dd if=/dev/urandom of=/dev/sda
в прошлом, ETA выглядело как в порядке дней. Я видел что-то об использовании badblocks
вместо urandom, но это, похоже, не очень помогло. Я просто хотел бы узнать, есть ли какие-либо способы, которые могли бы помочь мне ускорить это, например, варианты dd
или что-то еще, что я мог упустить, или скорость является просто ограничением HD.
решение1
dd if=/dev/urandom of=/dev/sda
, илипросто cat /dev/urandom >/dev/sda
, не самый быстрый способ заполнить диск случайными данными. Linux — /dev/urandom
не самый быстрый криптографический ГСЧ.Есть ли альтернатива /dev/urandom?есть некоторые предложения. В частности, OpenSSL содержит более быстрый криптографический PRNG:
openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda
Обратите внимание, что в конечном итоге улучшение или его отсутствие зависит от того, какая часть является узким местом: процессор или диск.
Хорошей новостью является то, что заполнение диска случайными данными в основном бесполезно. Во-первых, чтобы развеять распространенный миф,затирание нулями так же эффективно на современном оборудовании. С технологией жестких дисков 1980-х годов перезапись жесткого диска нулями оставляла небольшой остаточный заряд, который можно было восстановить с помощью довольно дорогого оборудования; требовалось несколько проходов перезаписи случайными данными («очистка Гутмана»). Сегодня даже один проход перезаписи нулями оставляет данные, которые невозможно реально восстановить даже в лабораторных условиях.
При шифровании раздела заполнение диска случайными данными не является необходимым для конфиденциальности зашифрованных данных. Это полезно только в том случае, если вам нужно сделать пространство, используемое зашифрованными данными, неотличимым от неиспользуемого пространства. Создание зашифрованного тома поверх нерандомизированного контейнера показывает, какие блоки диска когда-либо использовались зашифрованным томом. Это дает хорошую подсказку относительно максимального размера файловой системы (хотя со временем это будет становиться все худшим и худшим приближением), и немного больше.
решение2
Вы можете заставить OpenSSL шифровать данные /dev/zero
с помощью случайного пароля, что позволит очень быстро получить приличные псевдослучайные данные (если ваш процессор поддерживает ускорение).
openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda
Вы можете передать это, pv
чтобы получить прогресс/ETA. Команды, которые я запускаю прямо сейчас (в оболочке root), следующие:
DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
-pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
< /dev/zero |
pv --progress --eta --rate --bytes --size "$DISKSIZE" |
dd of=/dev/"$DISK" bs=2M
Эту идею я позаимствовал уэтот ответ, после того как у меня возникла та же проблема, что и уиррациональный Джон, ВОЗпрокомментировална ответ Жиля выше. Это увеличило скорость стирания моего нового массива RAID с 11 МБ/с до примерно 300 МБ/с, сократив то, что должно было занять неделю, до 10 часов.
Я добавлю, что вы должны иметь возможность использовать вместо более сложного оператора выше, но есть ошибка, которая позволит создать только 16 МБ вывода. (Эта ошибка была зарегистрирована в январе 2016 г.)openssl rand #of_bytes
openssl enc ...
ssl
И, согласно ответу наэтот вопроси продолжая предполагать, что узким местом является ЦП, можно еще больше увеличить скорость, запустив несколько параллельных openssl
процессов на отдельных ядрах, объединив их с помощью FIFO.
решение3
OpenSSL, похоже, не сработал у меня. Я получил "неизвестные параметры" и другие проблемы с предоставленными решениями. Поэтому я в конечном итоге выбрал программу fio.
fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
Что, похоже, занимает 3 часа, чтобы обработать 19 ТБ на 24 жестких дисках. То есть примерно 1800 МБ/с
smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes
smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]
Надеюсь, это действительно случайные данные. На странице руководства написано fio "По умолчанию: заполнить буферы случайными данными".http://linux.die.net/man/1/fio
Я не делаю этого в целях безопасности/шифрования, просто пытаюсь убедиться, что мои последующие тесты чтения представляют собой реальные данные, а не просто нули. Эту же команду fio можно использовать для предварительной подготовки SSD/NVMe. Так как простое использование /dev/zero может привести к тому, что сжатие на уровне диска «обманет» объем фактически записанной информации. Хотя я бы добавил -loops=2
к нему флаг, если это новый SSD для бенчмаркинга.
Если вы хотите, чтобы все было безопасно, вы можете использовать эту -randrepeat=bool
опцию, так как она переключает «Задавать генератор случайных чисел предсказуемым образом, чтобы результаты были повторяемыми при разных запусках. По умолчанию: true.», но я все еще не уверен, насколько это будет безопасно.
Кроме того, некоторые жесткие диски корпоративного класса оснащены функцией SED (самошифрующиеся диски) и позволяют вам использовать ключ шифрования для мгновенного и безопасного стирания всех записанных данных.
Наконец, в прошлом я использовал DBAN (он же Darik's Boot and Nuke), который имеет возможность загрузки с CD и USB и «является проектом с открытым исходным кодом, размещенным на SourceForge. Программа предназначена для безопасного стирания жесткого диска до тех пор, пока данные на нем не будут окончательно удалены и не смогут быть восстановлены».
решение4
Завершая ответ Марко, вам нужен более быстрый генератор случайных чисел.
Вы используете простую программу, которая выводит случайные числа из хорошей библиотеки, например, boost::random
и используете ее в dd
.
Если вы выберете усиление, вы можете использоватьэтотнапример, изменение experiment
функции в соответствии с вашими потребностями.