Каждый пользователь системы имеет свой уникальный номер, называемый идентификатором пользователя (user ID, или UID). Системный администратор обычно также создает несколько различных групп пользователей, каждая из которых обладает уникальным идентификатором группы (user group ID, или GID). Эти идентификаторы определяют принадлежность файлов, права доступа, а также возможность посылки сигналов другим процессам. Все перечисленные атрибуты получили единое название полномочий.
Система различает привилегированного пользователя, называемого супер -пользователем (superuser), который обычно входит в систему под именем root. Этот пользователь имеет UID, равный 0, и GID, равный 1. Он обладает многими полномочиями, недоступными обычным пользователям. Он может иметь доступ к чужим файлам независимо от установок их защиты, а также выполнять ряд привилегированных системных вызовов (например, mknod, используемый для создания специальных файлов устройств). Многие современные системы UNIX, такие как SVR4.1/ES, поддерживают расширенные механизмы защиты [8]. В этих системах поддержка суперпользователя заменена разделением привилегий при проведении различных операций. Каждый процесс обладает двумя идентификаторами пользователя — реальным (real) и действительным (effective)1. После того как пользователь входит в систему, программа входа в систему выставляет обеим парам UID и GID значения, определенные в базе паролей (то есть в файле /etc/passwd или в некоем распределенном механизме, например службе NIS корпорации Sun Microsystems). Когда процесс создается при помощи fork, потомок наследует полномочия от своего прародителя.
Есть еще третий — сохраненный (saved). — Прим. ред. Эффективный UID и эффективный GID влияют на создание файлов и доступ к ним. Во время создания файла ядро устанавливает ему атрибуты владельца файла как эффективные UID и GID процесса, из которого был сделан вызов на создание файла. Во время доступа процесса к файлу ядро использует эффективные идентификаторы процесса для определения, имеет ли он право обращаться к этому файлу (подробнее см. раздел 8.2). Реальный UID и реальный GID идентифицируют владельца процесса и влияют на право отправки сигналов. Процесс, не имеющий привилегий суперпользователя, может передавать сигналы другому процессу только в том случае, если реальный или эффективный UID отправителя совпадает с реальным UID получателя.
Существуют три различных системных вызова, которые могут переопределять полномочия. Если процесс вызывает exec для выполнения программы, установленной в режиме suid (см. раздел 8.2.2), то ядро изменяет эффективный UID процесса на UID, соответствующий владельцу файла программы. Точно так же, если программа установлена в режиме sgid, ядро изменяет GID вызываемого процесса. Система UNIX предлагает описанную возможность с целью предоставления специальных прав пользователям для определенных целей. Классическим примером такого подхода является программа passwd, позволяющая пользователям изменять свои пароли. Этой программе необходимо записать результат в базу данных паролей, которая обычно недоступна пользователям для прямых изменений (с целью защиты от модификаций записей других пользователей). Таким образом, владельцем passwd является суперпользов¬тель, но программа имеет установленный бит SUID. Это дает возможность обычному пользователю получить привилегии суперпользователя на время и в рамках выполнения программы passwd.
Пользователь также может настраивать свои полномочия при помощи системных вызовов setuid и setgid. Суперпользователю позволено при помощи этих вызовов изменять как реальные, так и эффективные идентификаторы UID и GID. Обычные пользователи могут обращаться к этим вызовам только для изменения своих эффективных идентификаторов UID или GID на реальные. Существуют некоторые различия в интерпретации полномочий в ОС System V и BSD UNIX. В системе SVR3 поддерживаются хранимые (saved) UID и GID, которые имеют значения эффективных UID и GID перед вызовом exec. Системные вызовы setuid и setgid могут восстановить эффективные идентификаторы из хранимых значений. Хотя в системе 4.3BSD не поддерживается описанная возможность, пользователь ОС может войти в состав дополнительных групп (исцользуя вызов setgroups). В то время как файлы, созданные пользователем, принадлежат его основной группе, он может иметь доступ к файлам, принадлежащим к его как основной, так и дополнительной группе (в зависимости от установок прав доступа к файлам для членов группы владельца).
В ОС SVR4 встроены все перечисленные возможности. Система поддерживает дополнительные группы, а также поддерживает хранимые идентификаторы UID и GID через вызов exec.