Случайное удаление файлов рута

в 15:17, , рубрики: linux, root, Настройка Linux, права пользователя, системное администрирование, случайное удаление

Вы спокойно блуждаете по директории $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, может установить или убрать атрибут.

Автор: m1rko

Источник

Поделиться

* - обязательные к заполнению поля