22.2.1. Передача полномочий

We use cookies. Read the Privacy and Cookie Policy

22.2.1. Передача полномочий

Многие программы, которые требуют определенных прав доступа, используют эти права только во время запуска. Например, некоторые сетевые демоны могут активизироваться только привилегированным пользователем для того, чтобы они имели возможность подключиться к резервному порту с помощью функции listen(), но после этого никакие особые полномочия не понадобятся. Большинство Web-серверов используют этот прием для усиления защиты от атак путем переключения на другого пользователя (обычно пользователь называется nobody или apache) сразу после открытия TCP/IP-порта 80. В это время сервер все еще остается объектом для удаленного использования, но, по крайней мере, такая эксплуатация больше не сможет предоставить взломщику доступ к процессу, активизированному как root. Сетевые клиенты, нуждающиеся в резервных портах (таких как rsh), могут применять подобную методику. Они запускаются как setuid на root, что позволяет им открывать подходящий порт. Как только порт открыт, необходимость в привилегиях root отпадает, и особые возможности можно отключить.

Для восстановления полномочий процесса необходимо использовать один или более из следующих методов: setuid(), setgid(), setgroups(). Этот прием эффективен только в том случае, если используется настоящая действующая файловая система и для всех сохраненных идентификаторах uid (или gid) установлены соответствующие значения. Если программа является setuid (или setgid), то процесс, вероятно, пожелает присвоить данным идентификаторам uid их сохраненное значение uid. Системные демоны, передающие управление другому пользователю после запуска от имени root, должны изменять пользовательские и групповые идентификаторы, а также очищать свой дополнительный групповой список. Более подробное описание того, как процесс может изменять свои сертификаты, можно найти в главе 10.