b8c4c21f

Разделяемые каталоги


Проанализировав систему прав доступа к каталогам в Linux, Мефодий пришел к выводу, что в ней имеется существенный недочет. Тот, кто имеет право изменять каталог, может удалить любой файл оттуда, даже такой, к которому не имеет доступа. Формально все правильно: удаление файла из каталога – всего лишь изменение содержимого каталога. Если у файла было больше одного имени (существовало несколько

жестких ссылок на этот файл), никакого удаления данных не произойдет, а если ссылка была последней – файл в самом деле удалится. Вот это-то, по мнению Мефодия, и плохо.

Чтобы доказать новичку, что право на удаление любых файлов полезно, кто-то создал прямо в домашнем каталоге Мефодия файл, недоступный ему, да к тому же с подозрительным именем, содержащим пробел:

[methody@localhost methody]$ ls 4TO-TO Mep3koe Documents examples loop script tmp to.sort [methody@localhost methody]$ ls -l 4* -rw------- 1 root root 0 Сен 22 22:20 4TO-TO Mep3koe [methody@localhost methody]$ rm -i 4* rm: удалить защищенный от записи пустой обычный файл `4TO-TO Mep3koe'? y

Пример 6.8. Удаление чужого файла с неудобным именем (html, txt)

Подозревая, что от хулиганов всего можно ожидать, Мефодий не решился набрать имя удаляемого файла с клавиатуры, а воспользовался шаблоном и ключом "-i" (interactive) команды rm, чтобы та ожидала подтверждения перед тем, как удалять очередной файл. Несмотря на отсутствие доступа к самому файлу, удалить его оказалось возможно:

[methody@localhost methody]$ ls -dl /tmp drwxrwxrwt 4 root root 1024 Сен 22 22:30 /tmp [methody@localhost methody]$ ls -l /tmp итого 4 -rw-r--r-- 1 root root 13 Сен 22 17:49 read.all -rw-r----- 1 root methody 23 Сен 22 17:49 read.methody -rw------- 1 methody root 25 Сен 22 22:30 read.Methody -rw-r----- 1 root wheel 21 Сен 22 17:49 read.wheel [methody@localhost methody]$ rm -f /tmp/read.* rm: невозможно удалить '/tmp/read.all': Operation not permitted rm: невозможно удалить '/tmp/read.methody': Operation not permitted rm: невозможно удалить '/tmp/read.wheel': Operation not permitted [methody@localhost methody]$ ls /tmp read.all read.methody read.wheel


Пример 6.9. Работа с файлами в разделяемом каталоге (html, txt)

Убедившись, что любой доступ в каталог /tmp открыт всем, Мефодий решил удалить оттуда все файлы. Затея гораздо более хулиганская, чем заведение файла: а вдруг они кому-нибудь нужны? Удивительно, но удален оказался только файл, принадлежащий самому Мефодию...

Дело в том, что Мефодий проглядел особенность атрибутов каталога /tmp: вместо "x" в тройке "для посторонних" ls выдал "t". Это еще один атрибут каталога, наличие которого как раз и запрещает пользователю удалять оттуда файлы, которым он не хозяин. Таким образом, права записи в каталог с ярлыком "drwxrwxrwt группа хозяин" и для членов группы, и для посторонних ограничены их собственными файлами, и только хозяин имеет право изменять список файлов в каталоге, как ему вздумается. Такие каталоги называются разделяемыми, потому что предназначены они, как правило, для

совместной
работы всех пользователей в системе, обмена информацией и т. п.

При установке атрибута "t" доступ на использование для посторонних ("t" в строчке атрибутов стоит на месте последнего "x") не отменяется. Просто они так редко используются друг без друга, что ls выводит их в одном и том же месте. Если кому-нибудь придет в голову организовать разделяемый каталог без доступа посторонним на использование, ls выведет на месте девятого атрибута не "t", а "T":

[methody@localhost methody]$ ls -l loop -rw-r--r-- 1 root root 26 Сен 22 22:10 loop [methody@localhost methody]$ chown methody loop chown: изменение владельца `loop': Operation not permitted [methody@localhost methody]$ cp loop loopt [methody@localhost methody]$ ls -l loop* -rw-r--r-- 1 root root 26 Сен 22 22:10 loop -rw-r--r-- 1 methody methody 26 Сен 22 22:15 loopt [methody@localhost methody]$ mv -f loopt loop [methody@localhost methody]$ ls -l loop* -rw-r--r-- 1 methody methody 26 Сен 22 22:15 loop

Пример 6.10. Что можно делать с чужим файлом в своем каталоге (html, txt)

Оказывается, мелкие пакости продолжаются. Кто-то сменил файлу loop хозяина, так что теперь Мефодий может только читать его, но не изменять. Удалить этот файл – проще простого, но хочется "вернуть все как было": чтобы получился файл с тем же именем и тем же содержанием, принадлежащий Мефодию, а не root. Это несложно: чужой файл можно переименовать (это действие над каталогом, а не над файлом), скопировать переименованный файл в файл с именем старого (доступ на чтение открыт) и, наконец, удалить чужой файл с глаз долой. Ключ "-f" (force, "силком") позволяет утилите mv делать свое дело, не спрашивая подтверждений. В частности, увидев, что файл с именем, в которое необходимо переименовывать, существует, даже чужой, даже недоступный на запись, mv преспокойно удалит его и выполнит операцию переименования.


Содержание раздела