Как безопасно удалить имя файла из файловой системы?
Я хочу удалить файл в файловой системе 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
1 ответ
Имя файла хранится в структуре данных "directory", которая имеет "(string)filename" и соответствующие значения "(int) inode". Каталог отвечает за отображение имени файла в inode и отображение inode в секторах на диске. Имя файла не сохраняется в секторах диска, как содержимое файла.
Имена файлов и структура каталогов имеют следующие последствия:
- Иноды не содержат имен файлов, только другие метаданные файла
- каталоги - это списки структур ассоциаций, каждая из которых содержит одно имя файла и один номер индекса
- файловая система при доступе к данным должна искать в каталоге определенное имя файла и затем преобразовывать имя файла в правильный соответствующий номер inode
- переименование файла, которое не пересекает границы файловой системы и является просто изменением метаданных, поэтому оно должно сохранять номер индекса
- в файловой системе ext4 запись имени влияет на сам индекс (с изменением времени модификации), но, тем не менее, предыдущее имя нигде не сохраняется
Следовательно, переименование файла во что-то случайное должно фактически привести к тому, что имя исчезнет навсегда, если только у вас нет систем резервного копирования, выполняющих периодическое резервное копирование, и в этом случае вам придется также позаботиться об этом.