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

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

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Аннотация: В лекции вводится понятие прав доступа как отношение субъектов системы (процессов) к объектам (файлам) и описывается иерархия прав доступа в Linux. Кроме того, описывается механизм подмены идентификатора, позволяющий в некоторых случаях строго ограниченным способом обходить запреты, устанавливаемые правами доступа.

Права доступа в файловой системе

Работая с Linux, Мефодий заметил, что некоторые файлы и каталоги недоступны ему ни для чтения, ни для записи, ни для использования. Зачем такие нужны? Оказывается, другие пользователи могут обращаться к этим файлам, а у Мефодия просто недостаточно прав.

Идентификатор пользователя

Говоря о правах доступа пользователя к файлам, стоит заметить, что в действительности манипулирует файлами не сам пользователь, а запущенный им процесс (например, утилита rm или cat ). Поскольку и файл, и процесс создаются и управляются системой, ей нетрудно организовать какую угодно политику доступа одних к другим, основываясь на любых свойствах процессов как субъектов и файлов как объектов системы.

В Linux, однако, используются не какие угодно свойства, а результат идентификации пользователя – его UID. Каждый процесс системы обязательно принадлежит какому-нибудь пользователю, и идентификатор пользователя ( UID ) – обязательное свойство любого процесса Linux. Когда программа login запускает стартовый командный интерпретатор, она приписывает ему UID, полученный в результате диалога. Обычный запуск программы ( exec() ) или порождение нового процесса ( fork() ) не изменяют UID процесса, поэтому все процессы, запущенные пользователем во время терминальной сессии, будут иметь его идентификатор.

Поскольку UID однозначно определяется входным именем, оно нередко используется вместо идентификатора – для наглядности. Например, вместо выражения " идентификатор пользователя, соответствующий входному имени methody ", говорят " UID methody " (в приведенном ниже примере этот идентификатор равен 503 ):

[methody@localhost methody]$ id
 uid=503(methody) gid=503(methody) группы=503(methody)
[methody@localhost methody]$ id shogun
 uid=400(shogun) gid=400(shogun) г
руппы=400(shogun),4(adm),10(wheel),19(proc)
6.1. Как узнать идентификаторы пользователя и членство в группах

Утилита id, которой воспользовался Мефодий, выводит входное имя пользователя и соответствующий ему UID, а также группу по умолчанию и полный список групп, членом которых он является.

Идентификатор группы

Как было рассказано в лекции 1, пользователь может быть членом нескольких групп, равно как и несколько пользователей могут быть членами одной и той же группы. Исторически сложилось так, что одна из группгруппа по умолчанию – является для пользователя основной: когда (не вполне точно) говорят о " GID пользователя", имеют в виду именно идентификатор группы по умолчанию. В лекции 12 будет рассказано о том, что GID пользователя вписан в учетную запись и хранится в /etc/passwd, а информация о соответствии имен групп их идентификаторам, равно как и о том, в какие еще группы входит пользователь – в файле /etc/group. Из этого следует, что пользователь не может не быть членом как минимум одной группы, как снаряд не может не попасть в эпицентр взрыва. 1Здесь есть тонкость. В файле group указываются не идентификаторы, а входные имена пользователей. Формально говоря, можно создать двух пользователей с одинаковым UID, но разными GID и списками групп. Обычно так не делают: надобности - почти никакой, а неразберихи возникнет много.

Часто процедуру создания пользователя проектируют так, что имя группы по умолчанию совпадает с входным именем пользователя, а GID пользователя – с его UID. Однако это совсем не обязательно: не всегда нужно заводить для пользователя отдельную группу, а если заводить, то не всегда удается сделать так,чтобы желаемый идентификатор группы совпадал с желаемым идентификатором пользователя.

Ярлыки объектов файловой системы

При создании объектов файловой системы – файлов, каталогов и т. п. – каждому в обязательном порядке приписывается ярлык. Ярлык включает в себя UIDидентификатор пользователя - хозяина файла, GID – идентификатор группы, которой принадлежит файл, тип объекта и набор так называемых атрибутов, а также некоторую дополнительную информацию. Атрибуты определяют, кто и что имеет право делать с файлом, они описаны ниже:

[methody@arnor methody]$ ls -l
 итого 24
 drwx------	2	methody	methody	4096	Сен 12	13:58	Documents
 drwxr-xr-x	2	methody	methody	4096	Окт 31	15:21	examples
 -rw-r--r--	1	methody	methody	26	Сен 22	15:21	loop
 -rwxr-xr-x	1	methody	methody	23	Сен 27	13:27	script
 drwx------	2	methody	methody	4096	Окт 1	15:07	tmp
 -rwxr-xr-x	1	methody	methody	32	Сен 22	13:26	to.sort
6.2. Права доступа к файлам и каталогам, показанные командой ls -l

Ключ " -l " утилиты ls определяет "длинный" ( l ong) формат выдачи (справа налево): имя файла, время последнего изменения файла, размер в байтах, группа, хозяин, количество жестких ссылок и строчка атрибутов. Первый символ в строчке атрибутов определяет тип файла. Тип " - " отвечает "обычному" файлу, а тип " d " – каталогу ( d irectory). Имя пользователя и имя группы, которым принадлежит содержимое домашнего каталога Мефодия, – естественно, methody.

Быстрый разумом Мефодий немедленно заинтересовался вот чем: несмотря на то, что создание жестких ссылок на каталог невозможно, значение поля "количество жестких ссылок " для всех каталогов примера равно двум, а не одному. На самом деле этого и следовало ожидать, потому что любой каталог файловой системы Linux всегда имеет не менее двух имен: собственное (например, tmp ) и имя " ." в самом этом каталоге ( tmp/.). Если же в каталоге создать подкаталог, количество жестких ссылок на этот каталог увеличится на 1 за счет имени " .." в подкаталоге (например, tmp/subdir1/..):

[methody@arnor methody]$ ls -ld tmp
 drwx------ 3 methody methody 4096 Окт 1 15:07 tmp
[methody@arnor methody]$ mkdir tmp/subdir2
[methody@arnor methody]$ ls -ld tmp
 drwx------ 4 methody methody 4096 Окт 1 15:07 tmp
[methody@arnor methody]$ rmdir tmp/subdir*
[methody@arnor methody]$ ls -ld tmp
 drwx------ 2 methody methody 4096 Окт 1 15:07 tmp
6.3. Несколько жестких ссылок на каталог все-таки бывает!

Здесь Мефодий использовал ключ " -d " ( d irectory) для того, чтобы ls выводил информацию не о содержимом каталога tmp, а о самом этом каталоге.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Аягоз Имансакипова
Аягоз Имансакипова
Тимур Булатов
Тимур Булатов

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