san4es: (винтовка рядом)
[personal profile] san4es
В последнее время заинтересовался вопросами, связанными с кодированием и шифрами. Читал Синельникова про шифры революционеров, "Взломщики кодов" и прочие занятные книжки. А тут еще и [livejournal.com profile] beobaxter написал про программы для шифрования дисков целиком. Стал я разбираться с вопросом и набрёл на две полезные на мой взгляд статьи в англоязычной Gentoo Wiki. Вот первая - "Безопасное удаление данных".



Введение

Когда вам надо удалить данные, вы обычно используете просто mkfs или rm, в зависимости от того, желаете ли удалить содержимое раздела жёсткого диска или же только несколько файлов. Однако иногда требуется убедиться в том, что данные, которые вы стёрли, уже нельзя восстановить. Например, если вы планируете зашифровать ваш жёсткий диск при помощи DM-Crypt, и хотите быть уверенными в том, что на этом диске не останется незашифрованных следов старых данных. Или вы желаете отдать кому-нибудь жёсткий диск или использовать его каким-нибудь другим образом так, чтобы ваши старые данные не попали в чужие руки.

Ознакомившись с этой статьёй, вы получите некоторые базовые знания о том, как хранятся данные на жёстком диске или другом носителе, и при каких условиях данные могут быть восстановлены. После этого вы узнаете о кое-каких полезных и практичных способах безопасного удаления, гарантирующие невозможность восстановления кем-либо ваших данных. И наконец, данное пособие попытается покончить с некоторыми распространёнными ошибками, недоразумениями и паранойей, которые, к сожалению, часто можно обнаружить в интернете.

Хранение данных

Рисунок Хранение Данных: Файлы хранятся в файловой системе, файловые системы - на разделах, а разделы - на жёстких дисках.

Для того чтобы научиться корректно удалять данные, вначале вам потребуется понять, как данные хранятся. Поскольку это понимание означает кучу сухой теории, проиллюстрируем её примером.

Ваши данные, то есть ваши файлы и каталогов, управляются файловыми системами. На картинке вы можете видеть два примера файловых систем, смонтированных на /mnt/A/ и /mnt/B/, обе системы содержат произвольное количество файлов и каталогов. Файлы могут иметь любой размер, настолько большой, насколько это позволяет имеющееся пространство для хранения. Пространство для хранения обеспечивается разделами, в этом примере раздел А изображён красным цветом, а раздел В - голубым. Каждый раздел имеет свой размер, выраженный в количестве секторов. В отличие от файлов все сектора имеют одинаковый размер. Например, раздел А состоит из 35 секторов, A0-A34, а раздел В - 65 секторов, B0-B64. Поскольку пространство для хранения само по себе обеспечивается жёстким диском, сектора разделов соответствуют секторам жёсткого диска. В нашем примере жёсткий диск состоит из 100 секторов S0-S99, таким образом раздел А хранится на секторах жёсткого диска S0-S34, а раздел B - на секторах S35-S99.

Проще говоря, ваши файлы как-то хранятся файловой системой (как именно - зависит от файловой системы), и так как пространство для хранения файловой системы состоит из секторов раздела, а они в свою очередь - из секторов жёсткого диска, физически ваши файлы хранятся в одном или более секторов дискового пространства вашего жёсткого диска. Файлы на /mnt/A/ оканчиваются на одном из секторов раздела А, что означает, что они хранятся где-то в секторах S0-S34, а файлы на /mnt/B/ хранятся где-то в секторах S35-S99. Поскольку файловые системы хранят файлы везде, где обнаружится свободное место, то очень затруднительно предсказать в каких именно секторах будут располагаться ваши файлы. Файловые системы даже позволяют перемещать файлы физически до тех пор, пока имя файла остаётся неизменным, например при дефрагментации файловой системы.

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

Распространённые заблуждения

В применении к хранению данных одно из наиболее распространённых заблуждений заключается в том, что жёсткий диск может быть пустым или его можно стереть. Собственно говоря, это неверно. Жёсткий диск никогда не бывает пустым, и он не понимает команду удалить. Всё, что может жёсткий диск - это читать и записывать. Например, файловая система может попросить жёсткий диск прочитать сектор X или записать сектор ДАННЫМИ. Она не может попросить жёсткий диск удалить. Даже если вы ещё ничего не записали на совершенно новый диск, он не будет пустым, как если бы с него ничего не удалось прочитать, потому что на диск не записывались данные. На большом диске размером 1Tб хранится 1 Тб данных, всегда. Эти данные могут быть абсолютно неинтересными и не иметь какого-либо значения - всё равно что диск был бы полон (двоичных) нулей. Даже в этом случае они представляют собой данные. Они не могут быть стёрты или опустошены.

Примечание: Данные не могут быть удалены, их можно только записать. Поэтому удаление работает посредством перезаписи данных.

"Перезапись данных" выглядит простым делом, таковым и является, однако, вам необходимо убедиться, что данные переписаны правильно. Не забывайте - ваши файлы физически хранятся в секторах жёсткого диска. Чтобы удалить эти данные вы должны переписать секторы, хранящие данные. Операции файловой системы типа rm или даже mkfs этого НЕ делают. Файловая система не переписывает все секторы своих файлов, потому что это бы страшно замедлило её работу. Вместо этого файловая система просто забывает о файлах, она больше не знает в каких секторах хранился файл, и в силу этого она не может больше получить доступ к файлам. Однако это не отменяет того факта, что данные физически всё ещё хранятся в тех же секторах. Они могут быть переписаны позже, когда файловая система записывает файл и ищет неиспользуемые сектора (свободное пространство) для того, чтобы сохранить файл туда, но вы не знаете когда это случится.

Поэтому, чтобы перезаписать свои данные вы должны перезаписать сами сектора, и, поскольку, вы не знаете, какой файл здесь хранился, вы должны перезаписать все сектора. Простое и мощное средство для операций чтения и записи прямо на жёсткий диск - это dd. Вы следующем разделе вы познакомитесь с несколькими способами безопасного удаления.

Безопасное удаление

Данный раздел описывает некоторые способы безопасного удаления. В приведённых ниже примерах устройство /dev/sdx представляет собой устройство или раздел, который необходимо удалить. В примерах, использующих dd, вы можете вывести в stderr текущее состояние выполнения задачи, послав сигнал USR1 killall -SIGUSR1 dd. Параметр bs=1M - опционный; по умолчанию dd использует блоки очень маленького размера, что приводит к сильному замедлению процесса копирования. Больший размер блока позволяет снизить накладные расходы, поэтому операция копирования может осуществляться на полной скорости.

Примечание: Удаление целого жёсткого диска может занять пару часов из-за того, что работа ведётся над всем диском.

Предупреждение: Ни вы, ни кто-либо другой не будете в состоянии восстановить даже чуток данных, которые вы удалили. Вас предупредили.

Самый быстрый способ

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

dd if=/dev/zero of=/dev/sdx bs=1M

В этом методе dd считывает бесконечное количество (двоичных) нулей с /dev/zero и записывает их в /dev/sdx, начиная с первого сектора. В конце концов на /dev/sdx закончится место, что будет означать, что все секторы диска перезаписаны нулями и поэтому он был стёрт.

Безопасный способ

Если вы планируете зашифровать свой жёсткий диск, возможно, вы не захотите заполнять его нулями, потому что эти нули будут указывать на используемое и свободное место на вашем новом зашифрованном разделе. Вместо этого можно заполнить диск случайными данными. К сожалению, ядро не снабдило нас быстродействующим источником случайных данных. Однако, используя шифрование со случайным ключом, вы можете конвертировать нули в то, что выглядит как случайные цифры. Приведённый ниже пример использует DM-Crypt, но вы можете применить тот же принцип и для другого выбранного вами метода шифрования. Взгляните на загрузку процессора при выполнении этой задачи - вы получите представление о том, насколько ресурсоёмким будет процесс шифрования на вашей системе.

Примечание: Этот пример работает только при включённой в ядре поддержки шифрования. Для получения дополнительной информации смотри DM-Crypt. Если вы уже знаете какой метод кодирования будете использовать, добавьте его с ключом -c, т.е. -c aes-xts-plain

Кодирование жёсткого диска случайным ключом:

cryptsetup create random_sdx /dev/sdx -d /dev/urandom

Быстрый способ кодирования (запись нулей в шифрованный контейнер при хорошем методе кодирования приведёт к появлению случайных данных на физическом диске):

dd if=/dev/zero of=/dev/mapper/random_sdx bs=1M

Не забудьте впоследствии удалить:

cryptsetup remove random_sdx

Практичный способ

Вы можете запустить на вашем жёстком диске проверку на наличие "битых" блоков badblocks с опцией записи на диск. С точки зрения безопасности этот способ не лучше самого быстрого способа, поскольку он не пишет действительно случайные данные на диск. И ещё - он очень медленный. Единственное преимущество данного метода состоит в том, что badblocks проверит ваш жёсткий диск на наличие ошибок. Перезапись жёсткого диска - всего лишь побочный эффект этого процесса.

Запуск теста badblocks с опцией записи и случайным проверяемым образцом:

badblocks -w -t random -c 1024 -s /dev/sdx

Другие способы

В других руководствах вы найдёте упоминания многих других способо перезаписи целого жёсткого диска. Обычно они используют /dev/urandom, shred, bcwipe и другие. Недостаток этих методов состоит в том, что они медленные. Источник случайных чисел ядра предназначен для приложений, которым требуется лишь несколько байт высококачественных случайных данных, каковыми являются ключи для кодирования. Поэтому, /dev/urandom очень старается создать действительно хорошие случайные числа, при этом сильно грузя процессор. Он не подходит для записи сотен гигабайт данных на диск, поскольку вы не получите больше нескольких Мб/с даже на современных машинах. Если вы используете /dev/urandom прямо или косвенно (многие другие приложения также используют его в качестве источника случайных чисел), то до завершения процесса удаления пройдёт много времени. Другие приложения перезаписывают диск не по одному разу, что лишь умножает время обработки.

Удаление файлов

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

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

Примечание: Перезапись файлов в файловой системе в действительности может создавать новые копии файла.

Несмотря на то, что есть такие средства как shred или bcwipe, которые, как заявляется, способны перезаписывать файлы по месту, они или вообще не работают в современных журналируемых файловых системах, или они только перезаписывают файлы, о которых на текущих момент известно файловой системе. Если файл один или несколько раз был перезаписан (например, когда вы часто нажимали кнопку "Сохранить" для своего документа OpenOffice, что каждый раз приводило к перезаписи файла документа), то очень вероятно, что где-то на диске осталась старая копия вашего файла. И поскольку файловая система всего лишь забывает где перезаписываемые файлы хранились изначально, эти старые копии файла, которого вы хотели удалить, могут по существу быть где угодно в свободном пространстве. Поэтому вышеупомянутые средства, заявляющие о том, что они безопасно удаляют ваши файлы, в действительности внушают вам ощущение ложной безопасности. Поскольку эти средства не служат никаким другим целям, это делает их устаревшими.

Примечание: Перезапись всех секторов диска - это единственный способ получить абсолютную гарантию того, что на диске не останется следов старых данных.

Перезапись свободного пространства

Если вы человек отчаянный и очень хотите удалить файл любым способом, не удаляя другие ваши данные, вы можете стереть его при помощи rm. С этого момента данные вашего файла становятся частью свободного пространства вашей файловой системы. Более старые копии файла будут скорее всего также находиться в свободном пространстве. Вы можете перезаписать данные всех удалённых файлов путём перезаписи нулями всего доступного пространства вашего раздела. Однако это может повредить вашей системе. Поскольку вы заполняете свободное пространство, то диск будет временно заполнен. Если другие приложения попытаются сохранить данные в это время, им это неудастся, и возможно будут потеряны данные в связи с ошибкой отсутствует свободное место на устройстве. Более того, так как многие файловые системы не могут иметь доступ ко всему своему свободному пространству всё время для всех файлов или даже резервируют свободное пространство для специальных целей, существует только 95% вероятность того, что этот процесс действительно перепишет все данные файлов, которые вы удалили.

Примечание: Этот метод удаления файлов не является на 100% безопасным.

Предупреждение: Пока вы занимаетесь такой зачисткой, другие приложения могут неудачно завершиться из-за отсутствия места на устройстве, что приведёт к потере данных.

Удаление файла, от которого вы хотите избавиться:

rm secret-plan-to-conquer-the-world.odt

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

dd if=/dev/zero of=zerofile bs=1M

Дождитесь, пока вышеупомянутая команда завершится с 'no space left on device'.

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

sync

Теперь вы можете удалить файл с нулями для восстановления свободного дискового пространства:

rm zerofile

Паранойя

К сожалению, когда заходит разговор о удалении данных, то вокруг этого начинает виться много разного шаманства. Многие люди считают, что для того, чтобы предотвратить восстановление ваших данных компаниями, которые занимаются спасением данных, или даже секретными службами, необходимо переписывать жёсткий диск десятки раз. Это неверно. Невоможно восстановить данные из перезаписанного сектора. Компании, занимающиеся спасением данных, могут восстанавливать данные, к которым нет доступа, в связи с отказом "железа" или повреждения таблиц файловой системы (когда файловая система забывает обо всех своих данных, однако данные сами по себе всё ещё физически хранятся на диске). Секретные службы могут получить данные, просто украв их, или считывая данные, которые пользователь не удосужился правильно удалить. Так же возможно, что сектор не был переписан в первый раз из-за отказа "железа" (перераспределённые сектора). Однако в таком случае перезапись более одного раза ничем не поможет, так как сектор, который был помечен жёстким диском как дефектный, не будет перезаписан, сколько бы вы не пытались это сделать. Если ваш диск имеет дефекты, надо искать ему замену.





Возможно, статья звучит несколько банально, однако является неотъемлемой частью другой статьи - "Загрузка зашифрованного раздела с USB флешки". По мере появления свободного времени буду переводить дальше.
Page generated Jul. 16th, 2025 07:03 am
Powered by Dreamwidth Studios