Роль основного объекта доступа в UNIX играют объекты файловой системы. В архитектуре UNIX в файловой системе представлены не только обычные файлы с данными, там присутствуют и специальные файлы для устройств, каналов, сокетов и т. д. Благодаря этому регулирование доступа к файлам позволяет покрыть очень широкий спектр ситуаций доступа и служит основным средством организации политики доступа в UNIX.
В соответствии с субъект-субъектной моделью каждый файл снабжен ярлыком, в котором хранятся идентификаторы номинальных субъектов, которые вправе распоряжаться доступом к данному файлу. В случае UNIX — это идентификатор пользователя-владельца (UID) и идентификатор группы-владельца (GID). Обратите внимание, что файл может принадлежать только одной группе, в то время как пользователь может входить в несколько групп.
На уровне файловой системы в UNIX определяются три вида доступа: чтение (read, r), запись (write, w) и использование (execution, x). Право на чтение из файла дает доступ к содержащейся в нем информации, а право записи — возможность ее изменять. Право использования трактуется по-разному в зависимости от типа файла. В случае обычного файла оно означает возможность исполнения файла, т. е. запуска программы или командного сценария, содержащихся в этом файле. Для каталога использование — это возможность доступа к файлам этого каталога (точнее говоря, к атрибутам этих файлов — имени, правам доступа и т. п.).
При каждом файле имеется ярлык, в котором зафиксированы права доступа к нему. Права доступа включают список из девяти пунктов (три тройки): по три вида доступа для трех групп — пользователя-владельца, группы-владельца и всех остальных. Каждый пункт в этом списке может быть либо разрешён, либо запрещён (равен 0 либо 1). Таким образом, для хранения этой информации о правах доступа достаточно 9 бит.
Рисунок 2.17. Базовые права доступа в UNIX
При обращении процесса к файлу (с запросом доступа определённого вида, т. е. на чтение, запись или исполнение) система проверяет совпадение идентификаторов владельцев процесса и владельцев файла в определённом порядке, и в зависимости от результата, применяет ту или иную группу прав. Рассмотрим последовательность проверки прав на примере (см. Рисунок 2.18, «Последовательнось проверки прав доступа в UNIX»). Пусть файл имеет следующие атрибуты:
file.txt alice:users rw- r-- ---
Т. е. файл принадлежит пользователю «alice», группе «users» и имеет права на чтение и запись для владельца, и только на чтение для группы, для всех остальных не разрешается никакой вид доступа.
Презентация 5-06: последовательность проверки
Пусть к файлу обращается с запросом на чтение процесс, владельцем которого является пользователь bob. Bob не является владельцем данного файла, однако он является членом группы [users]. Значит, он имеет права на чтение этого файла.
Строго говоря, при этом проверяется не собственно идентификатор пользователя процесса (UID), а т. н. исполнительный идентификатор пользователя, EUID. Он существует в связи с тем, что в ходе выполнения процесс может менять субъект, от имени которого он исполняется. Подробнее об этом сказано в разделе «Подмена идентификатора процесса».
Рисунок 2.18. Последовательнось проверки прав доступа в UNIX