Опубликован: 22.06.2005 | Уровень: для всех | Доступ: платный | ВУЗ: Компания IBM
Лекция 6:

Права доступа

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Использование прав доступа в Linux

Использование групп

В Linux определено несколько системных групп, задача которых – обеспечивать доступ членов этих групп к разнообразным ресурсам системы. Часто такие группы носят говорящие названия: " disk ", " audio ", " cdwriter " и т. п. Тогда обычным пользователям доступ к некоторому файлу, каталогу или файлу-дырке Linux закрыт, но открыт членам группы, которой этот объект принадлежит.

Например, в Linux почти всегда используется виртуальная файловая система /proc – каталог, в котором в виде подкаталогов и файлов представлена информация из таблицы процессов. Имя подкаталога /proc совпадает с PID соответствующего процесса, а содержимое этого подкаталога отражает свойства процесса. Хозяином такого подкаталога будет хозяин процесса (с правами на чтение и использование), поэтому любой пользователь сможет посмотреть информацию о своих процессах. Именно каталогом /proc пользуется утилита ps:

[methody@arnor methody]$ ls -l /proc
 . . .
 dr-xr-x---  3 methody proc  0 Сен 22 18:17 4529
 dr-xr-x---  3 shogun proc   0 Сен 22 18:17 4558
 dr-xr-x---  3 methody proc  0 Сен 22 18:17 4589
 . . .
[methody@localhost methody]$ ps -af
 UID       PID PPID C STIME TTY     TIME CMD
 methody  4529 4523 0 13:41 tty1 00:00:00 -bash
 methody  4590 4529 0 13:42 tty1 00:00:00 ps -af
6.6. Ограничение доступа к полной таблице процессов

Оказывается, запущено немало процессов, в том числе один – пользователем shogun ( PID 4558 ). Однако, несмотря на ключ " -a " ( a ll), ps выдала Мефодию только сведения о его процессах: 4529 – это входной shell, а 4590 – видимо, сам ps.

Другое дело – Гуревич. Он, как видно из примера 6.1, входит в группу proc, членам которой разрешено читать и использовать каждый подкаталог /proc:

shogun@localhost ~ $ ps -af
 UID       PID  PPID C STIME TTY     TIME CMD
 methody  4529  4523 0 13:41 tty1 00:00:00 -bash
 shogun   4558  1828 0 13:41 tty3 00:00:00 -zsh
 shogun   4598  4558 0 13:41 tty3 00:00:00 ps -af
6.7. Доступ к полной таблице процессов: группа proc

Гуревич, опытный пользователь Linux, предпочитает bash "The Z Shell", zsh. Отсюда и различие приглашения в командной строке. Во всех shell, кроме самых старых, символ " ~ " означает домашний каталог. Этим сокращением удобно пользоваться, если текущий каталог – не домашний, а оттуда (или туда) нужно скопировать файл. Получается команда наподобие " cp ~/нужный_файл." или " cp нужный_файл ~ " соответственно.

Команда ps -a выводит информацию обо всех процессах, запущенных "живыми" (а не системными) пользователями 3Более точно - обо всех процессах, имеющих право выводить на какой-нибудь терминал, а значит, запущенными из терминального сеанса. . Для просмотра всех процессов Гуревич пользуется командой ps -efH.

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

Проанализировав систему прав доступа к каталогам в 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. Удаление чужого файла с неудобным именем

Подозревая, что от хулиганов всего можно ожидать, Мефодий не решился набрать имя удаляемого файла с клавиатуры, а воспользовался шаблоном и ключом " -i " ( i nteractive) команды 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. Работа с файлами в разделяемом каталоге

Убедившись, что любой доступ в каталог /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. Что можно делать с чужим файлом в своем каталоге

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

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Тимур Булатов
Тимур Булатов

С момента выхода курса прошло достаточно много времени, и хотелось бы понимать, насколько курс является актуальным на сегодняшний день.

дмитрий шремзер
дмитрий шремзер

В поле PPID (" p arent p rocess id entificator") указан идентификатор родительского процесса, т. е. процессапородившего данный. Для ps это – bash, а для bash, очевидно, login

А что тогда находится в поле CMD?

алексей оглы
алексей оглы
Россия
рафич Салахиев
рафич Салахиев
Россия