Вы спокойно блуждаете по директории
Но что-то вас беспокоит. Это как маленький камушек (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, может установить или убрать атрибут.
Комментарии (11)
BuriK666
06.09.2017 19:29+6chmod +t /home
Сегодня sticky bit используется в основном для каталогов, чтобы защитить в них файлы. Из такого каталога пользователь может удалить только те файлы, владельцем которых он является. Примером может служить каталог /tmp, в который запись открыта для всех пользователей, но нежелательно удаление чужих файлов. Установка атрибута производится утилитой chmod.
ru.wikipedia.org/wiki/Sticky_bitsasha1024
07.09.2017 19:19В данном случае это не поможет, потому что:
- Папка
left_shoe
тоже юзеру. Если захочет, он снимет с неё sticky_bit, удалит файл, а потом вернёт sticky_bit обратно. - Мало того, даже снимать sticky_bit необязательно. Я сейчас этому был несказанно удивлён, но:
user@desktop:~$ mkdir shoe user@desktop:~$ chmod +t shoe user@desktop:~$ ls -ld shoe drwxrwxr-t 2 user user 4096 вер 7 19:14 shoe user@desktop:~$ sudo -s [sudo] password for user: root@desktop:~# touch shoe/rock root@desktop:~# exit exit user@desktop:~$ ls -l shoe total 0 -rw-r--r-- 1 root root 0 вер 7 19:16 rock user@desktop:~$ rm -f shoe/rock user@desktop:~$ echo $? 0 user@desktop:~$ ls -l shoe total 0
Вероятно, дело в том, что система «понимает», что владелец папки может и снять sticky_bit, поэтому не накладывает на него это ограничение, он может удалять в ней всё (ну, не буквально «понимает», а просто при проектировании системы прав это учли).
- Папка
CaptainFlint
06.09.2017 20:16Самое весёлое — это если кому-то, кто не знает про такие трюки, создать подобный файлик и предложить его удалить. Главное, ls никакого криминала не показывает, файл не залочен, а удалить даже рутом — фиг.
imwode
06.09.2017 23:31+6Рок Теймер — укротитель камушков же или лучше в данном контексте Повелитель Камней
Kalashmatik
07.09.2017 13:00Выше правильно указали, корректно использовать «стики-бит» на папке, чем +i аттрибут на файле, насколько помню он (immutable) вообще завязан на типе ФС и не во всех работает. И да, из-за приколистов типа chattr +a, у меня уже рефлекс чекать файлы через lsattr
P.S. Не пускайте Чакка Норриса в консоль, а то и это не поможет :)
zuborg
Уточню, что в данном случае решающими являются права на собственно папку /home/user/left-shoe/, а не $HOME (/home/user/).
А так да, права на содержимое файла не определяют права на его имя (или отсутствие имени) в данной папке.
pansa
Решающим являются права записи на каталог с файлом. А доступ X должен быть на всех каталогах, ведущих к файлу.
Да, элементарные права доступа редко кто знает, на собеседовании ни один нормально не отвечал. И это еще не касаясь темы ACL.
Apache02
Гдето читал, что папка это тоже файл, но он содержит в себе список файлов которые внутри. Поэтому все логично: если можем писать в этот файл (папку) (изменять список), то можем удалять что угодно.
modestguy
В концепции linux вроде всё есть файл.