Каждый файл и процесс в Linux принадлежит определенному пользователю. Не имея соответствующих привилегий, другие пользователи не могут получить доступ к чужим объектам. Такая схема позволяет защитить объекты каждого пользователя и предотвратить несанкционированный доступ, случайный или злонамеренный.
Чаще всего системными файлами и процессами владеет фиктивный пользователь root, известный как суперпользователь. Все его ресурсы надежно защищены от несанкционированного вмешательства. Чтобы иметь возможность выполнять административные задачи, необходимо тем или иным способом зарегистрироваться в системе как суперпользователь.
Суперпользователь обладает “магической” властью. В частности, он имеет право выступать в качестве владельца любого файла или процесса и выполнять специальные операции, недоступные рядовым пользователям. Привилегированный пользователь — очень ответственная должность, а если ее занимает беспечный человек или злоумышленник, то она становится еще и очень опасной.
Каждый файл в Linux принадлежит владельцу и группе. Владелец файла имеет особую привилегию, недоступную другим пользователям системы: ему разрешено менять права доступа к файлу. В частности, владелец может задать права доступа так, что никто, кроме него, не сможет обращаться к файлу.
Владельцем файла всегда является один человек, тогда как в группу владельцев могут входить несколько пользователей. По традиции информация о группах хранилась в файле /etc/group
, но теперь ее чаще хранят на сетевом сервере NIS или LDAP.
Владелец файла должен определить, какие операции могут выполнять над файлом члены группы. Такая схема допускает совместное использование файлов членами одной группы. Например, мы применяем группу для управления доступом к файлам исходного кода Web-сайта.
Узнать идентификаторы владельцев файла можно с помощью команды ls -l имя_файла
. Например:
$ ls -l /staff/scott/todo
-rw------- 1 scott staff 1258 Jun 4 18:15 /staff/scott/todo
Как несложно заметить, файлом владеет пользователь scott
, а группа, которой он принадлежит, называется staff
.
Операционная система Linux отслеживает не имена владельцев и групп, а их идентификаторы. В самом общем случае идентификаторы пользователей (сокращенно UID — User ID) и соответствующие им имена хранятся в файле /etc/passwd
, а идентификаторы и названия групп находятся в файле /etc/group
. Текстовые эквиваленты идентификаторов определяются исключительно для удобства пользователей. Чтобы команда вроде ls
могла вывести информацию о принадлежности файла в удобочитаемом виде, она должна просмотреть базу данных идентификаторов и найти в ней нужные имена.
Владелец может посылать процессу сигналы, а также понижать его приоритет. С процессорами связаны, по меньшей мере, семь идентификаторов: реальный, эффективный и сохраненный идентификатор пользователя, реальный, эффективный и сохраненный идентификатор группы, и, в системе Linux — “идентификатор пользователя файловой системы”, который используется только для определения прав доступа к файлам. Вообще говоря, реальные номера применяются для учета использования системных ресурсов, а эффективные — для указания прав доступа. В большинстве случаев реальные и эффективные идентификаторы совпадают.
Сохраненные идентификаторы не оказывают никакого непосредственного влияния. Они позволяют программам “приберегать” неактивные идентификаторы для последующего использования, тем самым способствуя расчетливому применению расширенных полномочий. Вообще говоря, идентификатор пользователя файловой системы — это особенность реализации файловой системы NFS, и обычно он совпадает с эффективным идентификатором пользователя.
Процесс не может явно изменить ни один из своих идентификаторов, но есть особая ситуация, когда новые эффективные идентификаторы устанавливаются косвенно. Дело в том, что существуют два специальных бита, устанавливаемых в маске прав доступа к файлу: “setuid
” (Set User ID — бит смены идентификатора пользователя) и “setgid
” (Set Group ID — бит смены идентификатора группы). Если запускается исполняемый файл, у которого установлен один из этих битов, то эффективными идентификаторами создаваемого процесса становятся идентификаторы владельца файла, а не идентификаторы пользователя, запустившего программу. Смена полномочий действительна только на время работы программы.
Бит “setuid
” позволяет рядовым пользователям запускать программы, выполняющие жестко регламентированные административные действия. Например, команда passwd, с помощью которой пользователь меняет свой пароль, обращается к файлу /etc/shadow
(или /etc/passwd
), принадлежащему суперпользователю, вследствие чего у нее установлен бит “setuid”. Она модифицирует файл строго определенным образом и завершается. Конечно, даже столь простое действие может стать причиной злоупотреблений, поэтому, прежде чем внести запрашиваемые изменения, команда passwd проверяет, знает ли пользователь свой текущий пароль.