Выбрать главу
9.1. Реальный идентификатор пользователя и реальный идентификатор группы

Реальные идентификаторы пользователя и группы идентифицируют пользователя и группу, которым принадлежит процесс. При входе в систему оболочка получает свои реальные ID пользователя и группы из третьего и четвертого полей записи в файле /etc/passwd (см. раздел 8.1). При создании нового процесса (например, когда оболочка выполняет программу) он наследует эти идентификаторы у своего родительского процесса.

9.2. Действующий идентификатор пользователя и действующий идентификатор группы

В большинстве реализаций UNIX (Linux, как объясняется в разделе 9.5, в этом плане от них немного отличается) действующие UID и GID в совокупности с дополнительными идентификаторами групп используются для определения полномочий, которыми наделен процесс, при его попытке выполнения различных операций (в частности, системных вызовов). Например, эти идентификаторы определяют полномочия, которыми процесс наделен при доступе к таким ресурсам, как файлы и объекты межпроцессного взаимодействия (IPC) в System V. У таких объектов, в частности, есть собственные связанные с ними пользовательские и групповые идентификаторы, определяющие их принадлежность. В разделе 20.5 будет показано, что действующий UID также проверяется ядром для определения того, может ли один процесс отправить сигнал другому.

Процесс, чей действующий идентификатор пользователя имеет значение 0 (он принадлежит пользователю с именем root), имеет все полномочия суперпользователя. Такой процесс называют привилегированным. Некоторые системные вызовы могут быть выполнены только привилегированными процессами.

В главе 39 мы рассмотрим реализацию Linux-возможностей — схему разделения полномочий, которыми наделяется привилегированный пользователь, на ряд отдельных составляющих, которые могут независимо друг от друга включаться и отключаться.

Обычно действующие идентификаторы пользователя и группы имеют точно такие же значения, что и у соответствующих реальных ID, но есть два способа, позволяющие действующим идентификаторам принимать другие значения. Один из способов связан с использованием системных вызовов (рассматриваются в разделе 9.7). Второй способ связан с выполнением программ с установленным идентификатором пользователя и установленным идентификатором группы.

9.3. Программы с установленным идентификатором пользователя и установленным идентификатором группы

Программа с установленным идентификатором пользователя позволяет процессу получить полномочия, которые он обычно не получает, путем установки действующего ID пользователя на то же значение, которое имеется у идентификатора пользователя (владельца) исполняемого файла. Программа с установленным ID группы выполняет аналогичную задачу для принадлежащего процессу действующего идентификатора группы. (Выражения «программа с установленным идентификатором пользователя» и «программа с установленным идентификатором группы» иногда сокращают до видов «set-UID-программа» и «set-GID-программа».)

Как и любой другой файл, файл исполняемой программы имеет связанный с ним идентификатор пользователя и идентификатор группы, которые определяют принадлежность файла. Кроме того, у исполняемого файла имеется два специальных бита полномочий: бит установленного идентификатора пользователя (set-user-ID) и бит установленного идентификатора группы (set-group-ID). (В действительности эти два бита полномочий есть у каждого файла, но нас здесь интересует их использование применительно к исполняемым файлам.) Эти биты полномочий устанавливаются командой chmod. Непривилегированный пользователь может устанавливать эти биты для тех файлов, которыми он владеет. Привилегированный пользователь (CAP_FOWNER) может устанавливать эти биты для любого файла. Рассмотрим пример:

$ su

Password:

# ls — l prog

— rwxr-xr-x 1 root root 302585 Jun 26 15:05 prog

# chmod u+s prog Установка бита полномочий set-user-ID

# chmod g+s prog Установка бита полномочий set-group-ID

Как показано в этом примере, у программы могут быть установлены оба этих бита, хотя такое встречается нечасто. Когда для вывода списка полномочий программы, имеющей установленный бит set-user-ID или set-group-ID, используется команда ls — l, в нем буква x, которая обычно применяется для демонстрации установки полномочия на выполнение, заменяется буквой s: