Вы спокойно блуждаете по директории
Но что-то вас беспокоит. Это как маленький камушек (little rock), попавший в ботинок. Вы снимаете обувь, чтобы посмотреть, в чём дело.
Странно. Он здесь, но как будто не принадлежит вам. Его оставил
Вы лезете в карман за телефоном, чтобы быстро позвонить ему через
Вы опускаете взгляд на дрожащие руки, пытаясь понять: это всё произошло на самом деле? Да. Вы действительно это сделали. Без Рока Теймера. Но как?
Маленький камушек в вашем ботинке понятия не имел, что его ждёт. Как видно из его реинкарнации, ни у кого не было на него никаких разрешений (
Что здесь произошло, так это Рок Теймер забыл, что вы даже более могучи, чем он сам, когда вы находитесь в
Чтобы иметь возможность сделать что-нибудь с файлом, первым делом нужно найти его в директории. Листинг содержимого директории контролируется флагом выполнения. Если у пользователя есть разрешение на выполнение в этой директории, он может посмотреть её содержимое. Также флаг выполнения для директории даёт доступ к дескрипторам
Затем, процесс удаления. Переименование или перемещение файла не предусматривает системного вызова
Директория
Если Рок Теймер действительно не хотел, чтобы посторонние трогали его камушки, то сделал бы следующее:
Эта операция гарантирует неизменность файла, что, среди прочего, предотвращает его удаление. Выдержка из мануала:
$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
Эта операция гарантирует неизменность файла, что, среди прочего, предотвращает его удаление. Выдержка из мануала:
Файл с атрибутом 'i' не может быть изменён: его нельзя удалить или переименовать, на этот файл нельзя создать ссылку и в него нельзя записать никакие данные. Только суперпользователь или процесс, владеющий CAP_LINUX_IMMUTABLE, может установить или убрать атрибут.