"Вечное" выолпнение dd if=/dev/urandom of=/dev/sdX


Решил переформатировать HDD в криптованный диск для бэкапов.
Следуя советам, данным на форуме, для перезаписи данных на диске дал команду:
[code]dd if=/dev/urandom of=/dev/sdX[/code]
Сначала думал сделать что-то типа [code]sfill -vl[/code] или [code]sfill -vll[/code], но что-то подумалось мне, что это делается на текущую mount point, и – не знаю, прав я или нет, но мне показалось, что дать команду на раздел безопаснее.
И вот уже полсуток продолжается работа dd и нет ей ни конца, ни краю... Причем, sfill по одному разу или по два раза, имхо, давно бы уже прошла вся (обычно на такой же объем уходило неск. часов, но не полсуток, если конечно не делать sfill без аргументов -l или -ll, когда оно будет 30 с гаком раз перезаписывать.
И только сейчас сообразил, что /dev/urandom генерит данные постоянно, это же не клонирование с диска на диск, если его не остановить, то он будет делать это вечно, или пока компьютер/диск не сломаются :)
Мне кажется, что полсуток достаточно для 300-гигового диска, что называется, с "головой".
Как правильно определить/задать время для данной работы?
И еще возник вопрос, почему здесь рекомендуется юзать /dev/urandom, а не /dev/random?
Я посмотрел, это разные устройства, а не ссылки одного на другого. Согласно манам, /dev/random генерит еще более "случайные" данные. Разве он не лучше?
Или для этой цели такой необходимости нет, а времени/ресурсов займет больше?



Комментарии
Гость (24/01/2011 12:04)   
Блин, прервал его, написало, что скопировано только 93 Гб, пришлось снова начать, ппц почему так долго? и видимо начнет по новой писать с первых секторов?
— unknown (24/01/2011 13:01)   
И еще возник вопрос, почему здесь рекомендуется юзать /dev/urandom, а не /dev/random?

Размер буфера /dev/random фиксирован, его можно посмотреть в /proc/sys/kernel/random. Если он не слинкован с аппаратным генератором энтропии, то по исчерпании этой энтропии, он ждёт наполнения её из буфера. Предположим, что для этого нужно в течении минуты непрерывно печатать на клавиатуре, а размер буфера — 4096 байт. Тогда для заполнения 300 Гигабайт уйдёт (300 * 230 )/ (2 12) = 78643200 заполнений буфера. В году 365 * 24 * 60 = 525600 минут.
78643200 / 525600 ~ 150 лет. Печатать надо непрерывно.
— SATtva (24/01/2011 13:20)   
Блин, прервал его, написало, что скопировано только 93 Гб, пришлось снова начать, ппц почему так долго?

Потому что, в отличие от /dev/zero, это ГПСЧ. Смотрите нагрузку процессора.

и видимо начнет по новой писать с первых секторов?

Можно начать писать с нужного оффсета: man dd, параметр seek.
— unknown (24/01/2011 13:28, исправлен 24/01/2011 13:32)   

А если вот так kill -USR1 `pidof dd`, то можно посмотреть сколько там, но не прерывать.


Есть конечно опция skeep. SATtva уже поправил: offset


Самый быстрый способ такой. Поднять шифрованный раздел, пароль ввести. Файловую систему не создавать. Сделать dd if=/dev/zero bs=1M of=/шифрованный_раздел


Можете bs указать побольше.


Если считать используемый шифр идеальным, то знание противником наличия на разделе в открытом тексте большого числа нулей не поможет в криптоанализе. А с нулями всё пойдёт быстрее.


На случай криптопаранойи после того, как отработается заполнение нулями, можно сменить пароль диска, стерев старый. Можно даже заголовок стереть тем же dd и заново его создать с новым паролем. Получится контейнер, снаружи заполненный случайными числами, внутри которого когда-то были нули на неизвестном пароле. Стойкость такого генератора равна по криптостойкости использованному шифру на неизвестном пароле (ключе), в режиме шифрования нулей.

— SATtva (24/01/2011 13:33)   
Самый быстрый способ такой. Поднять шифрованный раздел, пароль ввести. Файловую систему не создавать. Сделать dd if=/dev/zero bs=1M of=/шифрованный_раздел

Отличная идея. Если ещё и процессор имеет инструкции AES-NI, то скорость затирки будет ограничена только скоростью записи физического носителя.
Гость (24/01/2011 14:25)   
SATtva, unknow
Большущее спасибо за ответы/советы.
А вот еще такой вопрос, этот hdd изначально был размечен как имеющий физический раздел /dev/sdb1, аналогичный по размеру /dev/sdb, на нем, как обычно, была ntfs.
Когда я сделал dd if=/dev/urandom of=/dev/sdb (а не dd if=/dev/urandom of=/dev/sdb1), он, конечно, уконтропупил sdb1.
Если не размечать устройство по разделам типа /dev/sdbX, создавать криптораздел непосредственно в /dev/sdb, а не в /dev/sdbX, это может как-то негативно сказаться на HDD или еще в каком-то отношении?
Или все-таки лучше поиграться с fdisk и создать /dev/sdb1? (Я не собираюсь на устройстве делать несколько разделов, мне нужен собственно только один раздел).
И второй вопрос. Очень хочется скинуть туда бэкапы и спокойно делать другие дела.
Если я сейчас (после такого завершения перезаписи данных) смонтирую криптораздел, запишу туда все, что надо, а потом натравляю на точку монтирования этого раздела sfill -vl, это разве не тот же результат будет?! Понятно, что создавать большой файл, наполняемый всяким shit, она будет на смонтированной ФС, но физически будут те же блоки юзаться, где все остальное лежит, и оно должно будет затереть все старые данные вне криптораздела, не?
Гость (24/01/2011 14:40)   
А если вот так kill -USR1 `pidof dd`, то можно посмотреть сколько там, но не прерывать.


А почему dd не прерывается так и показывает, что сделалось? А когда такое же делаешь,например, на tar, прерывается?

P.S. Вообще можно и скриптик написать, чтобы остановилось, когда все пройдет, видимо.
— SATtva (24/01/2011 14:50, исправлен 24/01/2011 14:50)   
А почему dd не прерывается так и показывает, что сделалось? А когда такое же делаешь,например, на tar, прерывается?

Потому что каждая программа вольна по-своему трактовать специальные сигналы. Иногда они описаны в мане.


Вообще можно и скриптик написать, чтобы остановилось, когда все пройдет, видимо.

Для dd? Он сам остановится, когда либо а) дойдёт до конца дискового раздела, либо б) запишет заданное число байт (параметры count, bs и др.).

— sentaus (24/01/2011 14:54)   
Кстати, затирать ещё можно используя shred.


Если не размечать устройство по разделам типа /dev/sdbX, создавать криптораздел непосредственно в /dev/sdb, а не в /dev/sdbX, это может как-то негативно сказаться на HDD или еще в каком-то отношении?

Нет, во всяком случае не при "затирке".

Понятно, что создавать большой файл, наполняемый всяким shit, она будет на смонтированной ФС, но физически будут те же блоки юзаться, где все остальное лежит, и оно должно будет затереть все старые данные вне криптораздела, не?


В данном случае это будет зависеть ещё и от самой ФС. Если ФС журналируемая, то на это полагаться 100% не стоит.


Мне кажется, что полсуток достаточно для 300-гигового диска, что называется, с "головой".


Мой штатный телепат предполагет, что скорость записи у этого диска около 80-90 Мб/сек, поэтому однократное затирание должно быть сделано примерно за час.
— sentaus (24/01/2011 14:57)   

Потому что каждая программа вольна по-своему трактовать специальные сигналы. Иногда они описаны в мане.

Да, название программы kill сбивает очень многих :)
Гость (24/01/2011 15:05)   
Для dd? Он сам остановится, когда либо а) дойдёт до конца дискового раздела, либо б) запишет заданное число байт (параметры count, bs и др.).

То есть, а) касается не только устройства которое if, но и то, которое of? Значит, это я зря испугался, что будет писаться постоянно, пока /dev/urandom генерит псевдослучайные числа.

Кстати, затирать ещё можно используя shred.


В данном случае это будет зависеть ещё и от самой ФС. Если ФС журналируемая, то на это полагаться 100% не стоит.


Затираемые старые данные были под nffs, которую я снес и на место которой я ставлю ext3 под крипторазделом.
Как я понимаю, криптораздел в процессе эксплуатации затирать нет особой необходимости, так как он создается для того, чтобы противник изначально не имел к нему доступа.

Файлы или разделы? Если shred на раздел натравить, разве он просто не удалит файл устройства /dev/sdX?!

Если не размечать устройство по разделам типа /dev/sdbX, создавать криптораздел непосредственно в /dev/sdb, а не в /dev/sdbX, это может как-то негативно сказаться на HDD или еще в каком-то отношении?

Нет, во всяком случае не при "затирке".


Я имел ввиду, при функционировании устройства?

Мой штатный телепат предполагет, что скорость записи у этого диска около 80-90 Мб/сек, поэтому однократное затирание должно быть сделано примерно за час.


Почему-то почти за 12 часов затерлось из /dev/urandom только треть диска...

Вот сейчас по методике unknown из /dev/zero – скорость всего 2 Мб/с.
(Тут надо иметь ввиду, что это внешний HDD, подключенный через USB).
Гость (24/01/2011 15:34)   
Вот сейчас по методике unknown из /dev/zero – скорость всего 2 Мб/с.


Ааа, просто я дебил! Я забыл задать bs=1M. Сейчас с bs=1M скорость правда не 80 – 90 Мб/с, но половину от этого.
А если сделать bs=1G? Или чем больше блок, тем хуже затираются старые данные?

И еще такой вопрос, согласно man dd

Если же задано просто bs, то seek берет за основу bs, поскольку согласно мануалу "данная опция перекрывает опции ibs и obs? Или нет?
— sentaus (24/01/2011 15:42, исправлен 24/01/2011 15:43)   
Если shred на раздел натравить, разве он просто не удалит файл устройства /dev/sdX?!

По умолчанию shred просто затирает указанный файл, который может быть и блочным устройством. Для удаления нужно ещё ключ -u указать, но я не знаю, что он сделает в случае, если затираемый файл – болчное устройство.


которую я снес и на место которой я ставлю ext3 под крипторазделом.

sfill работает с примонтированными ФС и не затрёт блоки, которые ext3 отвела "под себя". В лучшем случае они будут затёрты однократно при форматировании раздела в ext3, в худшем – не перезаписаны ни разу.


Я имел ввиду, при функционировании устройства?

Здесь проблем не будет.


(Тут надо иметь ввиду, что это внешний HDD, подключенный через USB).

Тогда больше 30 Мб/сек не получить никак. По крайней мере, не на USB 2.0. Промерьте скорость чтения/записи тем же dd, если она сильно ниже, то для начала попробуйте заменить usb-кабель.

— sentaus (24/01/2011 15:48)   
Сейчас с bs=1M скорость правда не 80 – 90 Мб/с, но половину от этого.

А, ну вот всё и выяснилось.

А если сделать bs=1G? Или чем больше блок, тем хуже затираются старые данные?

dd сохраняет весь блок в памяти, а потом сбрасывает его на диск, т.е. это просто такой самопальный кэш. Больше десятка мегабайт ставить никакого смысла нет, скорость уже не вырастет. А уж если вы ещё и превысите объем доступной памяти, то это блок будет вообще в своп сбрасываться :)
— unknown (24/01/2011 15:53)   
Вообще давно назрело[link1].
Гость (24/01/2011 15:54)   
Я имел ввиду, при функционировании устройства?
Здесь проблем не будет.


А почему флешки и внешние HDD всегда выглядят как минимум как устройства sdX с как минимум одним разделом sdX1?
Или это чисто виндовые "примочки", которые мы так видим под линуксом?!
Гость (24/01/2011 15:55)   
В смысле вновь приобретенные, неформатированные пользователем.
— unknown (24/01/2011 16:01, исправлен 24/01/2011 16:01)   

Их обычно форматируют на заводе.

Гость (24/01/2011 16:10)   
Вообще давно назрело.


Не понял, это я ступил не прочитал (вроде ночью этого не было,если я не слепой и не тупой), или это ты дополнил после сегодняшнего моего постинга?
Гость (24/01/2011 16:35)   
Их обычно форматируют на заводе.


Я это понимаю. Я имею ввиду, какую цель они преследуют, создавая раздел типа /dev/sdX1, равный размеру диска/флешки? Если можно просто /dev/sdX юзать в этих случаях?
— unknown (24/01/2011 16:39, исправлен 24/01/2011 16:41)   

После. Иначе сразу бы дал ссылку.

Я имею ввиду, какую цель они преследуют, создавая раздел типа /dev/sdX1, равный размеру диска/флешки? Если можно просто /dev/sdX юзать в этих случаях?

Какие-то версии винды вроде-бы от такого тупили и не могли увидеть флэшак. А юзерам приходилось набирать страшные команды в страшной виндовой консоли со страшным виндовым fdisk'ом. И они от такого тоже тупили. Поэтому производители решили, что лучше форматить по стандарту.

Гость (24/01/2011 16:44)   
После. Иначе сразу бы дал ссылку.


Большущее пасибо! А я почему-то думал, что такой раздел есть, и вчера ночью его усиленно искал, и не нашел.
Значит, все-таки <a href="http://www.pgpru.com/forum/sod.....Comment44113">ресурс не загибается</a> :-)
— unknown (24/01/2011 17:06)   
Я же говорю, назрело :-)
— sentaus (24/01/2011 17:39)   

А почему флешки и внешние HDD всегда выглядят как минимум как устройства sdX с как минимум одним разделом sdX1?
Или это чисто виндовые "примочки", которые мы так видим под линуксом?!


Да, старые версии Windows иначе их не опознавали.
Гость (25/01/2011 01:02)   
Кстати, обсуждалось отсюда[link2] и ниже по треду.
Гость (09/05/2012 06:15)   
Терабайтовый диск. Полевые условия. Затирать его долго, приходиться отключаться.
Как правильно начать с того места, с которого еще не записано, при каждом очередном включении затирки?
?
А counts_of_blocks соответствует "записей написано" из вывода:

полученного с помощью ?
Гость (09/05/2012 17:20)   
Ну в man dd же написано как offset задавать. Можете для пущей убедительности записать фиксированные байты в нужное место, а потом считать их, чтобы проверить, что всё работает правильно.
Гость (24/07/2012 06:50)   
Что-то не могу найти в man dd опцию offset
Debian Squeeze
— SATtva (24/07/2012 07:26)   
Никто не говорил про опцию offset. Смещение задаётся следующими параметрами (для входного и выходного файлов):
Гость (24/07/2012 13:05)   
Так надо использовать, как я понимаю, skip, а не seek – какой прок давать seek для /dev/urandom или /dev/zero? Или все-таки обе?
И, соответственно, надо явно определять параметры ibs и obs или, при их равенстве, достаточно определить bs?
— SATtva (24/07/2012 13:20)   
Так надо использовать, как я понимаю, skip, а не seek

Наоборот.

И, соответственно, надо явно определять параметры ibs и obs или, при их равенстве, достаточно определить bs?

Второе.
— unknown (06/11/2012 15:13, исправлен 06/11/2012 15:14)   

Хотелось бы вернуться к обсуждению "Как быстро заполнить раздел/том случайными данными в Unix, чтобы подготовить его к шифрованию?[link1]".


И предложить чуть более удобный вариант:


  1. Отформатируем диск под криптоконтейнер: cryptsetup -s 256 luksFormat /dev/[name]. Использовать стойкий пароль в этой методике необязательно, лучше легкозапоминаемый. Можно использовать "qwertyuiop".
  2. Откроем контейнер: cryptsetup luksOpen /dev/[name] /dev/[name_open]
  3. Поставим на заполнение нулями dd if=/dev/zero bs=1M of=/dev/[name_open]. Вариант с прогресс-баром: dd if=/dev/zero bs=1M | pv -s[device_size_in_gigs]G | cat – > /dev/[name_open]. Придумайте кто-нибудь, как совместить прогресс-бар от pv и оффсет при записи, например через второй dd вместо cat.
  4. После завершения закрываем контейнер: cryptsetup luksClose /dev/[name_open]
  5. Смотрим на список слотов cryptsetup luksDump /dev/[name]. Вспоминаем пароль "qwertyuiop" и удаляем все слоты (в нашем случае единственный нулевой): cryptsetup luksKillSlot /dev/[name] 0. Ещё раз смотрим, что ничего не осталось: cryptsetup luksDump /dev/[name].
  6. Этот пункт необязателен, но при желании можно дополнительно стереть заголовок, если контейнер не будет использоваться как LUKS: for a in $(seq 4); do dd if=/dev/urandom bs=1M count=4 of=/dev/[name]; done
  7. Заново отформатируем диск под криптоконтейнер: cryptsetup -s 256 luksFormat /dev/[name]. Теперь уже со стойким паролем для реального использования.
Гость (06/11/2012 18:24)   
Вариант имеет ряд сущностных ограничений.

  1. Забудьте про /dev/[name], DOSовские разделы диска — прошлый век, LVM позволяет использовать диск без разбития на разделы. Противнику не надо знать, как он разбит. Мы хотим получить полный диск случайных данных: никаких сигнатур, никаких заголовков LUKS, никаких таблиц разделов, никаких указний ничего и ни на что.
  2. cryptsetup пишет сигнатуры. Чтобы этого избежать, надо использовать либо старый интерфейс[link3] к нему, куда сразу указывать ключ, либо добавлять LUKS-заголовок через dm[link4]. Идея: через dd считываем нужные сектора диска в файл в tmpfs, запиливем ему magic и расшифровываем OpenSSL'ем[link5]. Это будет LUKS-заголовок. Далее подключаем его через dm[link4] как часть общего диского пространства. В конце применяем к полученному виртуальному устройству LUKS (cryptsetup) стандартным образом (сигнатуры теперь будут, но они не записываются на диск).

Что это даёт: никаких сигнатур, расшифровывается в любом Linux.
— SATtva (06/11/2012 21:17)   
В огороде бузина, в Киеве — дядька.
Гость (06/11/2012 21:33)   
Не, ну если таблица разделов не смущает, то вперёд. А если смущает, то прийдётся дядьке бузину поесть.
Гость (06/11/2012 21:45)   
Точнее, если в Linux можно работать непосредственно с /dev/sda вместо /dev/sda{N}, то для зачистки диска методика unknown'а работать будет. Для шифрования я бы предпочёл иное, а не дефолтный метод.
— unknown (06/11/2012 22:07, исправлен 06/11/2012 22:11)   

  1. В FAQ сейчас так и есть. Где вы здесь увидели именно разделы диска? Пришлось даже давать пояснение[link6] по поводу LVM. Но здесь была задача ничего не навязывать. Если /dev/mapper/[name], то это м.б. логический том, может быть всё устройство, м.б. физический том, м.б. "старый досовский раздел", как кому удобно, может кто-то cd-дисками ещё пользуется и исошки для них шифрует. В /dev лежат и UID'ы томов и указания на всё устройство целиком, под [name] ничего конкретного специально не имелось ввиду.
  2. Безсигнатурное шифрование — отдельная и не такая простая задача. Кому-то она критична, может городить велосипед уже сейчас, но раз это не внедрили в стандартную поставку, то тому есть объективные причины — трудно соблюсти баланс между гибкостью и теоретической безопасностью и сокрытием, как требованием практической безопасности.

Это не полная инструкция, а частный вопрос, поэтому навязывание LVM и бессигнатурное шифрование решено исключить.


P.S. Есть идея собрать "продвинутые методы использования cryptsetup и пр." в один раздел, по аналогии с Tor[link7].


Пока есть три наработки, при чём это не велосипеды и не костыли, а чуть допиленные стандартные (хотя и малораспространённые) решения:


  1. Сравнительно безопасное (на уровне разумных компромиссов) использование гибернейта в шифрованный своп с возможностью при желании быстрого уничтожения ранее накопленной в нём информации без его размонтирования (на живой рабочей системе).
  2. Использование продвинутых опций помещения скриптов в crypttab для цепочечной генерации ключей: открытие одного контейнера даёт доступ к другим контейнерам. На самих контейнерах никаких промежуточных файлов с ключами не лежит, применяется хэширование ключа, полученного из пароля и висящего в памяти, для вывода другого ключа.
  3. Использование специального интерфейса ядра для безопасной работы с ключами и паролями (это вместо извращений с fifo и tmpfs): распределение по слотам, кэширование, деактивирование по таймауту, повторное использование одного пароля (ключа) ко многим контейнерам по дескриптору его слота в ядре.

Все эти варианты:


  1. Повышают гибкость.
  2. Потенциально снижают безопасность (больше для любителей экспериментировать).
  3. Никак не связаны с задачей сокрытия или отрицания факта работа с шифрованными FS.

Если у кого-то уклон больше на сокрытие и бессигнатурное шифрование, то приветствуется публикация своих инструкций для совместного развития.

— SATtva (06/11/2012 22:14)   
Использование специального интерфейса ядра для безопасной работы с ключами и паролями

Это модуль ядра ENCRYPTED_KEYS?
— unknown (06/11/2012 22:26, исправлен 06/11/2012 22:29)   

Да, оно:


Linux Key Management Utilities
Keyutils is a set of utilities for managing the key retention facility in the kernel, which can be used by filesystems, block devices and more to gain and retain the authorization and encryption keys required to perform secure operations.
Homepage: http://people.redhat.com/~dhowells/keyutils/
Гость (06/11/2012 22:29)   
раз это не внедрили в стандартную поставку, то тому есть объективные причины
Не думаю. Ряд программ шифрования в UNIX сигнатур не имеют, но в LUKS это не так, потому что, как всегда, "удобство" (возможность определить что на разделе) и "незачем скрывать наличие шифрованных данных". действительно, как юзерофильные рюшечки в гноме будут определять, что раздел шифрован, если у него нет сигнатур? А тут всё юзерофильненько: всунул диск, всплыло окошко с вводом пассфразы.

Если у кого-то уклон больше на сокрытие и бессигнатурное шифрование, то приветствуется публикация своих инструкций для совместного развития.
Это всё понятно. Как появится время добразобраться, напишу инструкцию, хотя на уровне proof of concept уже сейчас очевидно, что это будет работать. Ряд извращений с device mapper уже тестировался.
— unknown (06/11/2012 22:39)   

Как-то натыкался, что если например в gnupg отрезать все заголовочные байты в самом простом симметричном шифровании, то посредством дописывания этих байтов при помощи самого gnupg можно различать такой файл от полученного из /dev/urandom. Где гарантия, что другие программы при "бессигнатурном" шифровании не сохраняют специфический формат пакетов?


Опционально могли бы сделать, как в Truecrypt. Проблемы в надёжности при смене форматов, при долговременном хранении с целью прочитать на всех последующих версиях системы, при необходимости обеспечить равнозначную стойкость к перебору по словарю, при условии, что от противника не скрыли таки факт шифрования и он заведомо знает, что это не белый шум, а контейнер и в каком он формате, проблема с управлением ключами в слотах и др.
Гость (06/11/2012 23:32)   
Самый короткий способ заполнения устройства случайными данными



ABCDEF – ключ и пароль в 16-ричном виде, можно использовать $(hexdump -e '1/1 "%02x"' /dev/urandom). Для избежания несущественной ошибки в конце записи можно заменить



Вместо openssl можно использовать любую другую программу шифрующую stdin на stdout. Например gpg с отключением сжатия (хотя в начале будет двоичная pgp-сигнатура). Поточный шифр наверное будет быстрее работать.

Для отображения прогресса в более распространённом способе, описанном unknown-ом, удобна также команда mbuffer



В новых версиях cryptsetup заголовок luks вроде бы можно вынести в файл на другом устройстве (об этом писал разработчик в рассылке), поэтому в хитростях связанных с использованием dmsetup больше нет необходимости. Хотя возможно удобнее использовать cryptsetup без расширения luks с явно заданным ключом (или dmsetup с целью crypt). Ключ поместить на другой носитель и защитить паролем с помощью самописного скрипта. Тогда есть возможность самому выбрать и настроить алгоритм расширения пароля – pbkdf2, scrypt и т.п.

Если вся система на одном диске то в использовании lvm нет особого смысла, только лишнее усложнение. Таблицу разделов не создавать, всю систему зашифровать на /dev/sda, а swap, если нужен, разместить в файле (предварительно заполненном до нужного размера, например нулями), а не создавать под него раздел. Учитывая что при современных объёмах оперативной памяти он почти не используется, на производительности это не сказывается, swap нужен только для подстраховки. Если и использовать lvm для объединения дисков, то поверх их шифрования.
Гость (07/11/2012 02:50)   

Всюду советуется разбивать дисковое пространство на разделы, чтобы на разных разделах были разные ФС. Это для устойчивости к сбоям ФС. Если на диске будет крутиться несколько гостевых ОС, то и файловые системы для них должны быть разными. Ну, и про стратегическое удобство на будущее не забываем.


Да, это интересно. Не помню, чтобы вы об этом писали ранее (в отличие от пунктов 1 и 2).


Потненциально в смысле «а вдруг мы что-то не учли»?


За счёт чего так получается? Информация об имеющихся сигнатурах и форматах является внешней по отношению к предложенным методам бессигнатурного шифрования. Да, такую информацию надо откуда-то брать и тщательно проверять. Или вы намекаете, что там отличие чисто криптографическое? Сам криптотекст должен быть неотличим от /dev/urandom, иначе это ненадёжное шифрование. Потенциально можно иметь формат с сигнатурами во многих местах, т.к. пространство может шифроваться кусками, каждое начало/конец которых каким-то образом отмечены (но я про такое не слышал); хотя для современных файловых систем это действительно так: при форматировании диска определённые данные записываются не только в заголовок, но и в ряд мест на файловой системе.


Обратная совместимость — фича программного функционала, а не интерфейса. Все претензии к разработчикам.


Пусть заголовок шифруется каким-то универсальным стандартным образом. Спрашиваем у пользователя пароль, расшифровываем в память этим паролем бессигнатурный заголовок (он будет неотличим от случайных данных, когда записан на диск), а далее, раз заголовок есть, делаем всё то, что и сейчас: смену ключей, алгоритмов, слоты, перешифрование ФС на лету... да всё, что угодно. Всё упирается в волевое решение разработчиков и в
"удобство" (возможность определить что на разделе) и "незачем скрывать наличие шифрованных данных"

Нормальное шифрование под винду с хорошими фичами тоже было "невозможно", но потом пришёл ntldr и всё сделал. Linux же пока так и не нашёл своего ntldr'а.

P.S: Вроде бы у OpenBSD'шного vnconfig и NetBSD'шного cgd сигнатур нет. Т.е. отродясь не было. Никогда. Про FreeBSD'шный geli не знаю (т.е., возможно, также). У cgd ключевой файл всегда есть и всегда внешний по отношению к ФС, хранит salt. У LUKS ограниченное количество слотов, а у cgd из одного можно нагенерить хоть миллион разных salt-файлов, где каждый будет замапплен на свою пассфразу для одного и того же криптораздела. Мастер-ключ при этом не меняется, как и в LUKS. Чем интерфейс к cgd[link8] хуже LUKS, кроме как удобства «воткнул диск — и сразу рут и оно автоматически распозналось»? Всё, как всегда, упирается во всё то же:
"незачем скрывать наличие шифрованных данных"
Гость (07/11/2012 08:35)   
незачем скрывать наличие шифрованных данных

Честному человеку нечего скрывать!
— unknown (07/11/2012 10:15, исправлен 07/11/2012 10:57)   
Или вы намекаете, что там отличие чисто криптографическое? Сам криптотекст должен быть неотличим от /dev/urandom, иначе это ненадёжное шифрование.

Контрольные суммы пакетов, в GnuPG они называются MDC. Если к файлу из /dev/urandom дописать заголовок GnuPG, то GnuPG пишет, что в файле непонятный формат пакетов. Если вернуть заголовок настоящему файлу, то даже при неправильно введённом пароле он напишет, что пакеты MDC есть, но они битые.


Сам шифртекст может и не быть случайным. Поверх шифрования ("снаружи") м.б. слой коррекции ошибок или ещё какая вспомогательная информация. Например, чисто умозрительно, идут рэндомные блоки IV1, IV2, C1 а затем IV3 = Hash( IV1 || IV2 || C1 ), затем IV3, IV4, C2 и т.д. с целью защиты от каких-нибудь ошибок или манипуляций. По отдельности случайно, а вместе — нет. В недисковом шифровании такая избыточность может встречаться.


ABCDEF – ключ и пароль в 16-ричном виде, можно использовать $(hexdump -e '1/1 "%02x"' /dev/urandom).

В том то и дело, что нужно, иначе при отключенном IV один и тот же пароль будет давать всегда одинаковый шифртекст, да и сам пароль в этом методе должен быть стойким. В отличие от метода с cryptsetup, где можно использовать известный противнику пароль


Вместо openssl можно использовать любую другую программу шифрующую stdin на stdout.

Напугали же[link2]. Теперь все боятся полагаться на какую-либо внешнюю программу.


Она, помимо всего прочего, может оказаться ненамного быстрее dd if=/dev/urandom и уж всяко не быстрее шифрования нулей самим cryptsetup.


Просто, использование только самого cryptsetup:


  1. Заведомо самое надёжное. Получаем заполнение на том же режиме шифрования, который и будет использоваться.
  2. Самое быстрое. Всё таки исполняется на уровне модулей ядра.
  3. При наличии AES-криптоакселератора в проце и его поддержки ядром, п.2 особенно актуален.
  4. Если криптоакселератор поддерживает быстрый ГСЧ и ядро может заворачивать его в /dev/random или /dev/hwrandom, тогда лучше использовать его вместо всех этих комманд. Так и проще, и надёжнее.
Гость (07/11/2012 18:31)   
Всюду советуется разбивать дисковое пространство на разделы, чтобы на разных разделах были разные ФС. Это для устойчивости к сбоям ФС. Если на диске будет крутиться несколько гостевых ОС, то и файловые системы для них должны быть разными.

В смысле, если разбить систему на пять разделов, то фс будет в пять раз устойчивей? Не производит сильного впечатления. Для устранения сбоев фс ежедневное резервное копирование намного надёжней (которое в любом случае необходимо). Если есть несколько физических дисков, тогда действительно размещение разных каталогов (/home, /var и т.д.) на разных дисках может дать заметную прибавку к скорости и надёжности. Это обычно используют на серверах, а не домашнем ПК. Про гостевые системы на виртуальной машине может вы и правы, я в них не разбираюсь.

В том то и дело, что нужно, иначе при отключенном IV один и тот же пароль будет давать всегда одинаковый шифртекст, да и сам пароль в этом методе должен быть стойким. В отличие от метода с cryptsetup, где можно использовать известный противнику пароль

ABCDEF – это был пример, понятно что нужно использовать произвольное число. А в чём смысл стойкости ключа при шифровании нулей – то что их расшифруют и смогут отделить используемые блоки от неиспользуемых? Это можно применить только как косвенное доказательства наличия осмысленных (ненулевых) шифрованных данных.

Она, помимо всего прочего, может оказаться ненамного быстрее dd if=/dev/urandom и уж всяко не быстрее шифрования нулей самим cryptsetup

На моём компьютере: urandom 4.9 MB/s, openssl 51 MB/s, dmcrypt 65 MB/s. Скорость ненамного ниже, а команд вводить намного меньше. С вашими аргументами в пользу dmcrypt согласен, сам пользуюсь только им.
Гость (08/11/2012 00:04)   
В недисковом шифровании такая избыточность может встречаться.

А в дисковом нет? Мало ли в каком проекте как реализовано...

Теперь все боятся полагаться на какую-либо внешнюю программу.

Почему? По ссылке рассмотрен OpenSSL, про другие программы молчок.

В смысле, если разбить систему на пять разделов, то фс будет в пять раз устойчивей?

Слом одной файловой системы не повелечёт за собой (по крайней мере, автоматически) слом других файловых систем. При инсталляции всегда советовалось использовать для /var, /tmp, /home и т.д. разные разделы и разные файловые системы (тип файловых систем может быть один — например, ext3). К примеру, у меня однажды грохнулся диск, я его понёс в сервис и там восстановили, что могли. Итог: файловая система на /usr не монтировалась, но я на неё забил, а все остальные ФС смонтировались на ура. Была бы одна ФС на весь диск — потерял бы кучу данных. Про резервное копирование согласен, но тем не менее.
— unknown (08/11/2012 10:33, исправлен 08/11/2012 10:34)   
В недисковом шифровании такая избыточность может встречаться.
А в дисковом нет? Мало ли в каком проекте как реализовано...

Можно почти с полной уверенностью сказать, что нет. Потому что в дисковом шифровании есть жёсткое требование на необходимость равенства размеров открытого текста шифртексту. Лишние служебные заголовки внутрь самого шифртекста там уже не впихнуть.

В смысле, если разбить систему на пять разделов, то фс будет в пять раз устойчивей?
Слом одной файловой системы не повелечёт за собой (по крайней мере, автоматически) слом других файловых систем.

И ещё так балансируют нагрузку у высокопроизводительных серверов, предусматривают возможность более удобного изменения разделов и др.

А в чём смысл стойкости ключа при шифровании нулей – то что их расшифруют и смогут отделить используемые блоки от неиспользуемых? Это можно применить только как косвенное доказательства наличия осмысленных (ненулевых) шифрованных данных.

Если только затирать данные, которые лежали на носителе раньше, то конечно без разницы. А так, всё верно, чтобы не различали испольуемые и неиспользуемые блоки. Не только для доказательства факта шифрования, но и затруднения косвенного анализа содержимого (насколько заполнен контейнер?).

Гость (08/11/2012 18:52)   
Можно почти с полной уверенностью сказать, что нет. Потому что в дисковом шифровании есть жёсткое требование на необходимость равенства размеров открытого текста шифртексту. Лишние служебные заголовки внутрь самого шифртекста там уже не впихнуть.

Служебные заголовки всё равно есть (хидеры того же LUKS, к примеру) вопрос лишь куда их писать. Наверно, про существование отличимости данных от случайных надо всё равно в каждом случае уточнять у авторов шифровальной программы или внимательно читать официальную полную спецификацию на неё. «Требование на необходимость равенства размеров открытого текста шифртексту» — не концептуальное, а скорее техническое. Потенциально можно как угодно реализовать, даже так, что равными не будут (встроить ту же коррекцию ошибок поверх шифротекста, например...).
Гость (09/11/2012 01:34)   

Почему OpenSSL'евский ГПСЧ настолько быстрее?


Гость выше предложил[link9] вариант с mbuffers, он чем-то хуже? Там dd с обоих сторон, можно второму dd задать оффсет.


Что конкретно имелось в виду? Можно поподробнее? От cold boot attack это всё равно не спасёт, впрочем.


unknown, по вашей ссылке только список файлов на скачку, а цитаты этой нет.


В начале записи, всё ж таки(?), т.е.


Нужный скрипт можно поместить в любое свободное место на диске на том же носителе, извлекать его по dd в память и расшифровывать с помощью openssl (команду прийдётся выучить наизусть). Извлечение/подключение всего остального с диска можно запихнуть в этот скрипт и запоминать не надо.


Хоть здесь и критикуется шифрование загрузчика в grub, но там идеологически сделали как-то так, да. Пусть это не идеальная защита, но выносить загрузчик на внешний носитель после этого стало, полагаю, проще, особенно по сравнению с выносом туда ядра, корневой файловой системы, init-скриптов...


MDC можно считать частью заголовка файла? Или они принципиально по всему PGP-файлу разбросаны? Если кто-то недоизучил формат и обрезал половину заголовка, дело в обрезальщике, а не в подходе.


Как называются объекты IVk и Ck? Вектор инициализации и ещё что-то? Что означает индекс k?
Смешно признаться, но только сейчас понял, что вектор инициализации обозначают как IV, потому что Initialization Vector. Раньше я думал, что его почему-то решили обозначать римской четвёркой. Начинаю подозревать, что точки обмена интернет-трафиком (IX) — это тоже не девятки...


Действительно ли шифрование нулей с рандомно выбранным IV намного хуже того, как сейчас генерируется urandom? Если нет, то почему для генерации urandom используется не шифрование нулей, а что-то иное? Была бы скорость повыше...
— unknown (09/11/2012 10:29, исправлен 09/11/2012 10:49)   

Потому что он не полноценный ГПСЧ, а в приведённом примере блочный шифр AES в режиме CBC, шифрующий нули. В отличие от /dev/urandom, который на хэшах и который полноценный ГПСЧ, с непредсказуемостью влево за счёт перетирания внутренних состояний и с непредсказуемостью вправо при условии подкачки энтропии — наперёд заданной секретностью. AES-CBC с фиксированным IV, ключом и шифртекстом не имеет непредсказуемости влево или вправо, стоит только один раз восстановить ключ и вся сгенерированная им гамма восстанавливается. Но для затирания носителя или контейнера такие свойства по стойкости не нужны, поскольку атаки с утечками внутреннего состояния исключаются моделью угрозы. В отличие от /dev/urandom, к выходу которого (и отчасти входу) одновременно может иметь доступ масса пользователей, в т.ч. и недоверяемых.


Действительно ли шифрование нулей с рандомно выбранным IV намного хуже того, как сейчас генерируется urandom? Если нет, то почему для генерации urandom используется не шифрование нулей, а что-то иное? Была бы скорость повыше...

См. выше про непредсказуемость влево-вправо и атаки недоверяемых пользователей, пытающихся восстановить внутренние состояния. Плюс реализация /dev/urandom исторически сложилась задолго до появления AES. Плюс для такой непредсказуемости нужно большее внутреннее состояние, чем может обеспечить AES за один проход, если всё-таки попытаться переделывать на него. Вот внедрят SHA3/Keccak и всё ускорится и упростится. И доказуемость безопасности улучшится. Или везде (кроме виртуалок?) будет быстрый аппаратный ГСЧ, как в последних версиях процов. Но в нём извечный вопрос о доверяемости к железке, хотя для затирания места подойдёт.



Хороший вариант, что-то протупил и не додумался на счёт такого очевидного решения — использовать дважды dd вместо cat, а посредине неважно что, pv или mbuffers.


Использование специального интерфейса ядра для безопасной работы с ключами и паролями

Что конкретно имелось в виду? Можно поподробнее? От cold boot attack это всё равно не спасёт, впрочем.

Это не от этого. Хотя эти эти утилиты, кажется, могут работать и с TPM. Вообще, это самое спорное решение, потенциально снижающее безопасность в обмен на удобство, когда нужно управлять очень большим количеством шифрованных разделов (например, на RAID-массивах, подключаемых носителях). Может произойти утечка пароля в своп (маловероятно, плюс он шифрованный) или лишний процесс с правами рута может подсмотреть пароль (это всё равно компрометация системы, dmsetup --showkeys table и так покажет все ключи).


Если любопытно, откуда взялись идеи по "продвинутому" использованию cryptsetup/dmcrypt, то в Debian (в других дистрах этого может не быть) с пакетом cryptsetup, в каталоге /lib/cryptsetup/scripts ставится набор скриптов decrypt_derived, decrypt_gnupg, decrypt_keyctl, decrypt_openct, decrypt_opensc, decrypt_ssl. Их можно запихать в /etc/crypttab и/или в initrd или позаимствовать оттуда кое-какие идеи. В доках описаны примеры использования.



Из описания пакета keyutils в системе.



Ключ.



Они самые[link10], Internet EXchange Points.

Гость (09/11/2012 23:21)   
Нужный скрипт можно поместить в любое свободное место на диске на том же носителе, извлекать его по dd в память и расшифровывать с помощью openssl (команду прийдётся выучить наизусть). Извлечение/подключение всего остального с диска можно запихнуть в этот скрипт и запоминать не надо.

Не понял зачем грузить скрипт в память. Его дело – получить из пароля ключ и передать его dmcrypt. Создаётся виртуальное шифрованное устройство и соответствующий ему ключ хранится в памяти. Скрипт может храниться где угодно, защита ключа обеспечивается стойкостью алгоритмов, а не сокрытием скрипта. Основной секрет – это пароль и он хранится в голове.
Гость (09/11/2012 23:51)   

Подумалось: фишеры через n лет: «откройте терминал, сделайте su -l root sudo bash, введите dmsetup --showkeys table, скажите получившиеся цифры...»
Гость (09/11/2012 23:59)   
Не понял зачем грузить скрипт в память.

Мы о разных задачах с вами говорим. Я — про бессигнатурное шифрование. Цель скрипта — подмонтировать всё, что нужно (а там прийдётся область секторов на диске явно указывать и т.д.) с нужными режимами, заголовками, выводом ключей, возможностью интерактивного выбора, что подключать и т.д. Но сам скрипт надо откуда-то брать, вот его и можно записать на диск так, как я выше написал. Кроме того, один из секретов при выводе ключа — файл с солью (salt). Чтобы salt отрицаемо скрывать, лучше использовать бессигнатурное шифрование на том же (или другом) носителе, куда эта salt будет отрицаемо записана. Метод извлечения salt с диска тот же: dd в файл в память, расшифровать openssl'ем.
— unknown (10/11/2012 16:54)   
Чтобы было понятно, такого рода нестандартные решения нужно публиковать со списком требований: что хотим получить + зачем это нужно, достоинства. недостатки и др.

А то, те, кто с этим не сталкивался или не задумывался, не понимают, о чём речь, зачем это нужно или понимают неправильно, или относятся предвзято.
Гость (10/11/2012 22:08)   
Когда будет исчерпывающий пост на тему, там будет всё: и мотивация, и список требований, и пошаговые команды. Сейчас же времени писать на эту тему развёрнутый пост нет, как и времени экспериментировать с такими методиками, из-за чего приходится ограничиваться плохо структурированными постами в тематические топики. Опытным пользователям этих обрывочных указаний, впрочем, уже достаточно, чтобы довести идею до исчерпывающего поста на тему или начать использовать метод для себя.
— unknown (10/11/2012 23:00)   
Прекрасно понимаю. У самого до многого руки не доходят.
— unknown (11/11/2012 21:45)   
2 /comment57499[link9]:

Подумалось ещё на счёт этого:

Чтобы не вспоминать тонкости режимов шифрования можно использовать только openssl enc -aes-256-cbc и задать неслучайный пароль. Вектор инициализации при этом будет случайный, а при использовании в аналогичных целях gnupg, ещё и случайный ключ, зашифрованный на пароль. После окончания можно просто затереть из /dev/urandom начало диска, куда попал заголовок.

Ещё надёжнее вообще не записывать заголовок на диск, отрезав его вторым dd:

Гость (12/11/2012 00:10)   
Да, вашим способом наверное проще обеспечить стойкость шифрования.
— unknown (12/11/2012 11:13)   
Оказалось, что skip на STDIN не работает.
Гость (12/11/2012 19:07)   
Приведённый вами пример у меня работает
Гость (13/11/2012 04:31)   
«Команда выполняется без сообщений об ошибках» «работает», если что.
Вы проверяли, что skip корректно отработал?
Гость (13/11/2012 06:42)   
Если бы не проверял, то не написал бы. Правда опцию skip без буквы M использовал (подумал что опечатка), может в этом загвоздка? На петлевом устройстве /dev/loop0 удобно тестировать.
— unknown (13/11/2012 10:05, исправлен 13/11/2012 10:16)   

Сначала у меня не сработало из-за того, что в первом dd задал ещё и count. При этом, какой бы большой count не задавать, получалось


А теперь, сравните без skip:


и со skip:


Со skip не работает второй dd и ничего не выдаёт на выход, в то время как из первого dd всё проходит через openssl и pv (или mbuffer), вот только куда?

Гость (13/11/2012 19:30)   
В сообщении comment57746[link11] я уже привёл причину: вы используете букву M после количества пропускаемых блоков stdin задаваемого в skip. Это множитель 1024*1024=1048576, поэтому при bs=1M skip=4M соответствует сдвигу равному 4 терабайтам (1M x 4M = 4T). Это также объясняет вывод ошибки при задании числа блоков в 1-м dd (cannot skip to specified offset), поскольку смещение skip превышает размер stdin.

Попробуйте



Хотя мне кажется что достаточно пропустить один блок: skip=1.
Гость (14/11/2012 00:00)   
Кстати, таким же способом можно очищать CD



Но только перед каждым циклом очистки нужно готовить CD для перезаписи.

— unknown (14/11/2012 10:08)   
На первый взгляд это работает:

Но только если не использовать count, даже со множителем.
И опять же, просто при таком выводе маскируется ошибка dd: `standard input': cannot skip to specified offset:

Можно перенаправить её в файл даже из "работающей" команды:
Гость (14/11/2012 17:01)   
Похоже что эта ошибка связана с проходом потока через команду (openssl, mbuffer или др.) между двумя dd. Появляется начиная с определённого размера блока. При bs=1k и менее ошибка не появляется. Если первый dd передаёт поток напрямую второму (между ними нет команды), то ошибка отсутствует при любом размере блока, в том числе 1M и 1G. На случайность генерируемой последовательности данная ошибка видимо не влияет, может быть даже результат не искажает.
— unknown (14/11/2012 17:56)   
На случайность генерируемой последовательности данная ошибка видимо не влияет, может быть даже результат не искажает.

С gpg -c возникает такая же ошибка на dd, он ещё и заметно медленнее.
С другой стороны, ещё один повод задуматься, стоит ли доверять внешним командам в нестандартных вариантах использования, когда дело касается не наглядных результатов, а безопасности. Как бы такой, доведённый до абсурда Unix-way, не вышел боком. Может надёжнее всё-таки нулями в сам LUKS-контейнер? Все команды LUKS легко запомнить.
Гость (14/11/2012 23:54)   
По моему в данном случае дело не в самих командах, а в наличии посредника между двумя dd, на которого реагирует опция skip. Если хотите видеть прогресс с помощью pv или mbuffer будет та же самая ошибка при задании skip, независимо от того чем будете шифровать – dmcrypt, openssl или gpg. Просто при бессигнатурном шифровании опция skip не нужна и дефект программного канала себя не проявляет.
Гость (13/12/2012 20:48)   
А можно ли через dd забить рандомом неиспользуемое дисковое пространство на ext4 после обычного удаления чувствительных файлов без применения shred? И эффективно ли будет такое затирание?
Гость (14/12/2012 06:35)   
И эффективно ли будет такое затирание?

С учётом современной плотности записи на диски... наверное, однократной перезаписи достаточно. Я иногда тру как dd if=/dev/zero of=/path/to/file count=999999999999999, где file — файл на файловой системе, которую надо зачистить. Не знаю, насколько это безопасно. Обычно жду, когда dd вылетит с ошибокой, жалуясь на недостаток места, и считаю, что относительно безопасно всё затёрто.

Но тут есть тонкости, типа имён вложенных директорий, которые, возможно, могут как-то остаться. Например, обычная директория занимает 4.0K при вызове как ls -lad /path/to/dir, но у меня есть директория на ext3, в которой содержалось очень много мелких файлов. После того, как я зашреддил те файлы, размер директории так и остался большим — 1.3M, хотя внутри неё пусто. В общем, чудеса. Для серьёзного затирания информации вряд ли стоит полагаться на такой метод, но, если вы отдаёте себе отчёт во всех подводных камнях, то можно.
Гость (14/12/2012 19:14)   
Если файл модифицируется и размеры меняются, то его содержимое может оставаться в блоках, которые уже не связаны с данным файлом. Затирание файла с помощью dd, srm, shred и т.п. ненадёжно.

Для себя определил наиболее безопасный способ уничтожения информации с сохранением работоспособности диска:

1. Встроенная ATA-команда Secure Erase (заполняет нулями всё доступное место, а не только LBA)

2. Тройной проход dd с заполнением устройства случайными битами.

В общем-то первого пункта достаточно, второй скорее по традиции, для перестраховки. Это относится к hdd. С флешем и CD/DVD могут быть свои тонкости.
Гость (14/12/2012 21:28)   
Правильный метод — не создавать на основном разделе такие файлы, которые потом позарез захочется стереть. Т.е. для таких файлов нужна отдельная файловая система, к которой будут более строгие требования безопасности — например, почти всегда держать её отмонтированной, а ключ шифрования — удалённым из оперативной памяти.

Ссылки
[link1] https://www.pgpru.com/faq/zaschitadiska#h42-15

[link2] https://www.pgpru.com/comment39692

[link3] https://www.pgpru.com/comment45000

[link4] https://www.pgpru.com/comment44983

[link5] https://www.pgpru.com/comment39520

[link6] https://www.pgpru.com/comment44127

[link7] https://www.pgpru.com/biblioteka/rukovodstva/setevajaanonimnostj/prodvinutoeispoljzovanietorvunix

[link8] https://www.pgpru.com/comment37398

[link9] https://www.pgpru.com/comment57499

[link10] https://en.wikipedia.org/wiki/Internet_exchange_point

[link11] https://www.pgpru.com/comment57746