Данная статья о Случайном удаление файлов root (а), написанная в шуточной форме:
Вы спокойно блуждаете по директории $HOME, думая о своих делах.
$ whoami
> user
$ pwd
> /home/user
Но что-то вас беспокоит. Это как маленький камушек (little rock), попавший в ботинок. Вы снимаете обувь, чтобы посмотреть, в чём дело.
$ ls -lah ./left-shoe
———- 1 root root 4 May 30 13:20 little-rock
Странно. Он здесь, но как будто не принадлежит вам. Его оставил root, Рок Теймер, и только он решает его судьбу.
# bash -c «echo ‘You stay here’ > /home/user/left-shoe/little-rock»
# chmod 0000 /home/user/left-shoe/little-rock
Вы лезете в карман за телефоном, чтобы быстро позвонить ему через sudo. Неожиданно вы чувствуете прилив сил (из-за просмотра «Гладиатора» прошлым вечером) и решаете отложить телефон, чтобы испытать свою мощь.
$ rm -f ./left-shoe/little-rock
$ ls -lah ./left-shoe/little-rock
ls: cannot access little-rock: No such file or directory
Вы опускаете взгляд на дрожащие руки, пытаясь понять: это всё произошло на самом деле? Да. Вы действительно это сделали. Без Рока Теймера. Но как?
Маленький камушек в вашем ботинке понятия не имел, что его ждёт. Как видно из его реинкарнации, ни у кого не было на него никаких разрешений (— — —). Ни чтений, ни записей, никаких действий ни от кого (владелец, группа, другие).
Подвох:
Что здесь произошло, так это Рок Теймер забыл, что вы даже более могучи, чем он сам, когда вы находитесь в $HOME. И вот почему.
Чтобы иметь возможность сделать что-нибудь с файлом, первым делом нужно найти его в директории. Листинг содержимого директории контролируется флагом выполнения. Если у пользователя есть разрешение на выполнение в этой директории, он может посмотреть её содержимое. Также флаг выполнения для директории даёт доступ к дескрипторам inode для файлов в этой папке, что имеет решающее значение в этом контексте, поскольку процесс удаления отсоединяет файл.
Затем, процесс удаления. Переименование или перемещение файла не предусматривает системного вызова write(). На практике нам не нужны никакие разрешения для удаления файла и нам нет дела, кто его владелец. Единственное требование — иметь разпрешения на запись в родительскую директорию (и флаг выполнения для родительской директории).
Директория $HOME естественным образом соответствует обоим этим требованиям с точки зрения пользователя.
Анти-подвох:
Если Рок Теймер действительно не хотел, чтобы посторонние трогали его камушки, то сделал бы следующее:
# chattr +i /home/user/left-shoe/little-rock
Эта операция гарантирует неизменность файла, что, среди прочего, предотвращает его удаление.
Выдержка из мануала:
$ ls -lah ./left-shoe
———- 1 root root 4 May 30 13:20 little-rock или переименовать, на этот файл нельзя создать ссылку и в него нельзя записать никакие данные. Только суперпользователь или процесс, владеющий CAP_LINUX_IMMUTABLE, может установить или убрать атрибут