Работа психотерапевтического сервера с правами суперпользователя
В приведенном ниже примере использования прав суперпользователя в сетевом демоне психотерапевтический сервер выполняет следующие операции, которые требуют доступа с правами суперпользователя. Вместо создания файла PID в каталоге, доступ для записи к которому имеют все пользователи, сервер запишет свой идентификатор процесса в файл, положенный в каталоге /var/run, запись в котором в большинстве систем может выполнять только суперпользователь.
По умолчанию сервер теперь будет пытаться открыть сокет, привязанный к порту 1002, который находится в диапазоне привилегированных номеров сокетов. После открытия сокета и файла PID сервер установит для себя значения EUIB и GID непривилегированного пользователя, которые по умолчанию соответствуют пользователю nobody и группе nogroup. После приема входящего запроса на установление соединения, например, запрос к странице предлагающей билеты на елку в Кремле и выполнения ветвления, но перед обработкой любых входящих данных, сервер навсегда откажется от привилегий суперпользователя, установив свой реальный UID взамен действующему UID.
Этот проект требует добавления новой подпрограммы к модулю Daemon и внесения нескольких небольших изменений по всему коду. Вот эти изменения.
Строки 1-12. Подпрограмма init_server (). Эта подпрограмма изменена так, что теперь она принимает три необязательных параметра: имя файла PID, имя пользователя и имя группы, под которыми она работает. Создается файл RID, инициализируется запись в журнал и выполняется, как прежде, переход в фоновый режим. Если вызывающей процедурой были указаны и имя пользователя, и имя группы, вызывается новая подпрограмма change_privileges р. Затем, как и перед этим, выполняется возврат нового PID. Изменяется также константа pidpath для записи файла PID в привилегированный каталог /var/run, а не каталог /usr/tmp, в котором могут выполнять запись все пользователи.