Назад | Перейти на главную страницу

Как безопасно удалить ИМЯ файла из файловой системы?

Я хочу удалить файл в файловой системе linux ext4, чтобы диск не содержал название файла в любом месте диска (свободное пространство, метаданные файловой системы или где-либо еще).

Например, мне не нужно никаких следов того, что файл с именем "passwords.txt" когда-либо был на диске.

у меня есть разместил этот вопрос на суперпользователе в другой форме, и на него никто не ответил.

Я бы предпочел использовать /usr/bin/shred. Он отлично подходит для удаления данных из файла, но имя файла все еще отображается на диске. Вот как я это тестирую:

dd if=/dev/zero of=fs bs=1M count=300
hexdump -C fs   # verify it's empty
mkfs.ext4 fs
mkdir m
sudo mount fs m
sudo chown -R $USER m
cd m
echo secretkey > passwords.txt
cd ..
sudo umount m
grep secretkey fs   # <== shows up as expected
grep passwords.txt fs
strings fs | grep sec
strings fs | grep pass
sudo mount fs m
cd m
/usr/bin/shred -vuz -n 1 passwords.txt
cd ..
sudo umount m
grep secretkey fs   # <== does not show up, this is good
grep passwords.txt fs   # <== PROBLEM: filename still shows
strings fs | grep sec
strings fs | grep pass   # <== problem: still shows up
hexdump -C fs | grep sec
hexdump -C fs | grep pass

А вот результат mount команда, которая показывает некоторые режимы файловой системы:

type ext4 (rw,relatime,data=ordered)

Подробности для интересующихся:

Обновление 1:

Переименование файла из passwords.txt во что-то случайное, например, asdfasdf.txt, перед его уничтожением не решает проблему. Когда ты бежишь /usr/bin/shred в подробном режиме вы увидите, что он проходит через серию переименований файлов, прежде чем обрезать / разъединить файл. Я предположил, что это был способ надежно удалить следы имени файла. Нужны ли файловой системе определенные режимы для поддержки этого? Я скопирую / вставлю что shredвывод выглядит так при удалении файла:

/usr/bin/shred: passwords.txt: pass 1/2 (random)...
/usr/bin/shred: passwords.txt: pass 2/2 (000000)...
/usr/bin/shred: passwords.txt: removing
/usr/bin/shred: passwords.txt: renamed to 0000000000000
/usr/bin/shred: 0000000000000: renamed to 000000000000
/usr/bin/shred: 000000000000: renamed to 00000000000
/usr/bin/shred: 00000000000: renamed to 0000000000
/usr/bin/shred: 0000000000: renamed to 000000000
/usr/bin/shred: 000000000: renamed to 00000000
/usr/bin/shred: 00000000: renamed to 0000000
/usr/bin/shred: 0000000: renamed to 000000
/usr/bin/shred: 000000: renamed to 00000
/usr/bin/shred: 00000: renamed to 0000
/usr/bin/shred: 0000: renamed to 000
/usr/bin/shred: 000: renamed to 00
/usr/bin/shred: 00: renamed to 0
/usr/bin/shred: passwords.txt: removed

Имя файла хранится в структуре данных «каталог», которая имеет значения «(строка) имя файла» и соответствующие значения «(int) inode». Каталог отвечает за отображение имени файла в индексный дескриптор и за отображение индекса в секторы на диске. Имя файла не сохраняется в секторах диска, как содержимое файла.

Имена файлов и структура каталогов имеют следующие значения:

  • inodes не содержат имен файлов, только другие метаданные файла
  • каталоги - это списки ассоциативных структур, каждая из которых содержит одно имя файла и один номер inode.
  • файловая система при доступе к данным должна искать в каталоге конкретное имя файла, а затем преобразовывать имя файла в правильный соответствующий номер inode
  • переименование файла, которое не пересекает границы файловой системы, и это просто изменение метаданных, поэтому оно должно сохранять номер inode
  • в файловой системе ext4 запись имени действительно влияет на сам inode (с изменением времени модификации), но все же предыдущее имя нигде не сохраняется

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