Если вы удалите файл (т.е. rm /path/to/file) в файловой системе, такой как ext4, его индексный дескриптор и блоки будут выпущены в пул (помечены как свободные), и есть большая вероятность, что содержимое файла можно будет восстановить.

Есть такие инструменты shred, srm а также wipe это можно использовать для перезаписи этих блоков, но давайте посмотрим, что мы можем сделать без каких-либо дополнительных инструментов.

Примечание. Не полагайтесь ни на один из этих инструментов или методов для безопасного удаления файлов на современных дисках и в файловых системах (особенно на твердотельных накопителях с выравниванием износа и файловых системах с журналированием/COW, таких как ext4 и btrfs). Всегда шифруйте свои данные и убедитесь, что вы понимаете используемую схему шифрования, а также то, где и как вы можете украсть незашифрованные данные.


Мы не можем просто сделать что-то вроде этого:

cat /dev/zero > /path/to/file

Во-первых, потому что /dev/zero предоставляет нам непрерывный поток байтов, поэтому процесс записи не останавливается.

Вместо /dev/zeroмы могли бы использовать /dev/null заменить содержимое файла:

cat /dev/null > /path/to/file

Но есть еще одна проблема, связанная с импортом: эти команды усекают файл (и освобождают его блоки), и нам нужно заменить существующие блоки на место.

dd (часть coreutils package) — это удобный инструмент, который мы можем использовать здесь. Но опять же, если бы мы просто попробовали что-то вроде этого:

dd if=/dev/zero of=/path/to/file

У нас была бы такая же проблема.

Для решения первой задачи нам нужно сказать dd сколько блоков мы хотим записать и размер блока.

Чтобы найти эти числа, мы можем использовать stat команда:

stat /path/to/file

Для простого 2-байтового файла на ext4 с настройками по умолчанию вы должны увидеть что-то вроде этого:

  File: test
  Size: 2             Blocks: 8          IO Block: 4096   regular file
...

Это означает, что наш файл имеет 8 блоков по 512 байт (stat всегда возвращает 512-байтовые блоки, моя файловая система ext4 имеет размер блока 4 КБ, и этот файл использует один блок распределения — 8 * 512 = 4096 байт).

И мы можем сказать, что dd с:

dd if=/dev/zero of=/path/to/file bs=512 count=8

Это перезапишет наш файл, но у нас все еще есть вторая проблема — файл все еще усекается, а блоки высвобождаются в пул. Чтобы решить это, мы можем использовать conv=notrunc возможность сказать dd что мы хотим сохранить существующие блоки:

dd if=/dev/zero of=/path/to/file bs=512 count=8 conv=notrunc

Это должно работать, как ожидалось.

Вместо /dev/zero мы также можем использовать /dev/urandom (медленнее, но еще больше усложняет восстановление):

dd if=/dev/urandom of=/path/to/file bs=512 count=8 conv=notrunc

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

read bs count < <(stat -c "%B %b" $file)
dd if=/dev/zero of=$file bs=$bs count=$count conv=notrunc

Было бы несложно добавить поддержку множественных проходов, но на этом этапе, вероятно, имеет смысл использовать один из инструментов, созданных для этой цели.

кромсать

shred также является частью coreutilsи почти наверняка он уже есть в вашей системе.

shred -n 3 -z /path/to/file

Эта команда сделает три прохода, перезаписывая блоки случайными данными, а затем последний проход перезаписывает нулями.

срм

srm (от Secure Remove) — еще один популярный инструмент для этой цели.

По умолчанию он будет делать следующее:

  • 1 проход с 0xff
  • 5 случайных проходов. /dev/urandom используется для безопасного генератора случайных чисел, если он доступен.
  • 27 проходов со специальными значениями, определенными Питером Гутманном.
  • 5 случайных проходов. /dev/urandom используется для безопасного генератора случайных чисел, если он доступен.
  • Переименуйте файл в случайное значение
  • Обрезать файл

В дистрибутивах на основе Debian srm является частью secure-delete упаковка.

apt install secure-delete

В дистрибутивах Fedora и rpm вы можете установить его с помощью:

dnf install srm

Пример использования:

srm -vz /path/to/file

(-v означает «многословный» и -z сообщает srm обнулить блоки после перезаписи их случайными данными)

вытирать

Другой популярный инструмент для этой цели называется wipe.

Монтаж:

apt install wipe
dnf install wipe
pacman -S wipe

Пример использования:

wipe -i /path/to/file

(-i означает информационный, подробный режим)


Примечание. Это снимок страницы из BetterWays.dev wiki, вы можете найти последнюю (лучше отформатированную) версию здесь: Betterways.dev/linux-wiping-and-overwrite-file-blocks.