Книга: Linux программирование в примерах
11.10. Резюме
11.10. Резюме
• Использование значений ID пользователя и группы (UID и GID) для идентификации файлов и процессов — вот что превращает Linux и Unix в многопользовательские системы. Процессы имеют значения как действительных, так и эффективных UID и GID, а также набор дополнительных групп. Обычно именно эффективный UID определяет, как один процесс может повлиять на другой, и эффективные UID, GID и набор групп проверяются на соответствие с правами доступа к файлу. Пользователи с эффективным UID, равным нулю, известные как root
или суперпользователи, могут делать все, что захотят; система не использует для такого пользователя проверку прав доступа.
• Концепции сохраненных set-user ID и set-group ID пришли из System V и были приняты POSIX с полной поддержкой в GNU/Linux. Наличие этих отдельных значений ID дает возможность легко и безошибочно переключать при необходимости действительные и эффективные UID (и GID).
• Программы setuid и setgid создают процессы, в которых действительные и эффективные ID различаются. Программы как таковые помечаются дополнительными битами прав доступа к файлу. Биты setuid и setgid должны быть добавлены к файлу после его создания.
• getuid()
и geteuid()
получают значения действительного и эффективного UID соответственно, a getgid()
и getegid()
получают значения действительного и эффективного GID соответственно, getgroups()
получает набор дополнительных групп, а в среде POSIX может запросить у системы, сколько членов содержит набор групп.
• Функция access()
осуществляет проверку прав доступа к файлу для действительного пользователя, давая возможность программе setuid проверить полномочия реального пользователя. Обратите внимание, что часто проверка возвращаемых stat()
сведений может не представить полной картины при условии, что файл может находиться на не родной или сетевой файловой системе.
• Функция GLIBC euidaccess()
сходна с access()
, но осуществляет проверку на основе значений эффективных UID и GID.
• «Липкий» бит и бит setgid при использовании с каталогами привносят дополнительную семантику. Когда для каталога установлен бит setgid, новые файлы в этом каталоге наследуют группу этого каталога. Новые каталоги делают то же самое, они также автоматически наследуют установку бита setgid. Без установленного бита setgid новые файлы и каталоги получают эффективный GID создающего их процесса. «Липкий» бит, установленный для каталогов, в которые в других отношениях разрешена запись, ограничивает право на удаление файла владельцем файла, владельцем каталога и root
.
• Набор групп изменяется с помощью setgroups()
. Эта функция не стандартизована POSIX, но существует на всех современных системах Unix. Ее может использовать лишь root
.
• Изменение UID и GID довольно сложно. Семантика различных системных вызовов с течением времени изменилась. Новые приложения, которые будут изменять лишь свои эффективные UID/GID, должны использовать seteuid()
и setegid()
. Приложения, не действующие от имени root
, могут также устанавливать свои эффективные ID с помощью setuid()
и setgid()
. Вызовы setreuid()
и setregid()
от BSD были предназначены для обмена значениями UID и GID; их использование в новых программах не рекомендуется.
• Приложения, действующие как root
, могут перманентно заменить значения действительного, эффективного и сохраненного ID с помощью setuid()
и setgid()
. Одним из таких примеров является login
, которая должна превратиться из программы, выполняющейся как root
в не непривилегированную зарегистрированную оболочку, выполняющуюся от имени обычного пользователя.
• Функции Linux setresuid()
и setresgid()
следует использовать всегда, когда они доступны, поскольку они обеспечивают самое чистое и наиболее надежное поведение
• Написание приложений setuid-root
не является задачей для новичка. Если вам нужно сделать такую вещь, сначала специально изучите проблемы безопасности. Для этого можно воспользоваться приведенными выше превосходными источниками.
- 11.1. Проверка прав доступа
- 11.2. Получение ID пользователя и группы
- 11.3. Проверка для действительного пользователя: access()
- 11.4. Проверка для эффективного пользователя: euidaccess() (GLIBC)
- 11.5. Установка дополнительных битов доступа для каталогов
- 11.6. Установка действительных и эффективных ID
- 11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)
- 11.8. Пересечение минного поля безопасности: setuid root
- 11.9. Рекомендуемая литература
- 11.10. Резюме
- Упражнения