В основном initgroups() используется программами, создающими сеансы входа в систему. Например login(1) устанавливает различные атрибуты процесса перед запуском оболочки входа пользователя в систему. Такие программы обычно получают значение, используемое для аргумента group, путем считывания поля идентификатора группы из пользовательской записи в файле паролей. Это создает небольшую путаницу, поскольку идентификатор группы из файла паролей на самом деле не относится к дополнительным групповым идентификаторам, но, как бы то ни было, initgroups() именно так обычно и применяется.
Хотя в SUSv3 системные вызовы setgroups() и initgroups() не фигурируют, они доступны во всех реализациях UNIX.
9.7.4. Сводный обзор вызовов, предназначенных для изменения идентификаторов процесса
В табл. 9.1 дается сводная информация о действиях различных системных вызовов и библиотечных функций, используемых для изменения идентификаторов и полномочий процесса.
Таблица 9.1. Сводные данные по интерфейсам, используемым для изменения идентификаторов процесса
Интерфейс
Назначение и действие в:
Портируемость
Непривилегированном процессе
Привилегированном процессе
setuid(u)
setgid(g)
Изменение действующего ID на такое же значение, что и у текущего реального или сохраненного установленного ID
Изменение реального, действующего и сохраненного установленного ID на любое (единое) значение
Вызовы указываются в SUSv3; у вызовов, берущих происхождение от BSD, другая семантика
seteuid(e)
setegid(e)
Изменение действующего ID на такое же значение, что и у текущего реального или сохраненного установленного ID
Изменение действующего ID на любое значение
Вызовы указываются в SUSv3
setreuid(r, e)
setregid(r, e)
(Независимое) изменение реального ID на такое же значение, что и у текущего реального или действующего ID, и действующего ID на такое же значение, что у текущего реального, действующего или сохраненного установленного ID
(Независимое) изменение реального и действующего ID на любое значение
Вызовы указываются в SUSv3, но в различных реализациях работают по-разному
setresuid(r, e, s)
setresgid(r, e, s)
Изменение ID файловой системы на то же значение, что и у текущего реального, действительного, сохраненного установленного ID или ID файловой системы
Изменение ID файловой системы на любое значение
Вызовы характерны только для Linux
setgroups(n, l)
Этот системный вызов не может быть сделан из непривилегированных процессов
Установка для дополнительных групповых ID любых значений
Этот системный вызов в SUSv3 не фигурирует, но доступен во всех реализациях UNIX
На рис. 9.1 представлен графический обзор той же информации, которая приводится в табл. 9.1. Отображенная на схеме информация касается вызовов, изменяющих пользовательские идентификаторы, но к изменениям групповых идентификаторов применяются точно такие же правила. Обратите внимание на следующую информацию, дополняющую сведения, изложенные в табл. 9.1.
• Имеющиеся в glibc реализации seteuid() и setegid() также позволяют устанавливать для действующего идентификатора такое же значение, какое у него и было, но эта особенность в SUSv3 не упоминается.
• Если при вызовах setreuid() и setregid() как привилегированными, так и непривилегированными процессами, до осуществления вызовов значение r (реального идентификатора) не равно –1 или для e (действующего идентификатора) указано значение, отличное от значения реального идентификатора, то сохраненный установленный пользовательский или сохраненный установленный групповой ID также устанавливаются на то же значение, что и у нового действующего идентификатора. (В SUSv3 не указано, что setreuid() и setregid() вносят изменения в сохраненные установленные ID.)
• Когда изменяется действующий пользовательский (групповой) идентификатор, характерный для Linux пользовательский (групповой) идентификатор файловой системы изменяется, принимая то же самое значение.
• Вызовы setresuid() всегда изменяют пользовательский идентификатор файловой системы, присваивая ему такое же значение, что и у действующего пользовательского ID, независимо от того, изменяется ли вызовом действующий пользовательский идентификатор. Вызовы setresgid() делают то же самое в отношении групповых идентификаторов файловой системы.
Рис. 9.1. Действия функций, изменяющих полномочия процесса, связанные с его пользовательскими идентификаторами