Назад | Перейти на главную страницу

Как я могу отказаться от привилегий и при этом очистить свой файл pid в / var / run?

У меня есть демон foo. Мой сценарий инициализации /etc/init.d/foo начинает foo демон и хранит свой pid-файл в /var/run/foo.pid, что кажется стандартным местом. Так как /etc/init.d/foo должен запускаться как root, у него нет проблем с созданием и удалением pid-файлов в /var/run.

В foo демон - это действительно программа /usr/sbin/foo который предназначен для вызова как root в сценарии инициализации, но затем сразу же теряет свои привилегии непривилегированным foo пользователь. Однако я тоже хочу это /usr/sbin/foo программа для удаления своего pidfile при выходе из-за критической ошибки. Но поскольку он уже отказался от своих привилегий, у него больше нет возможности удалять файлы из /var/run каталог.

Мой нынешний подход - использовать seteuid вместо того setuid чтобы отказаться от моих привилегий, затем повторно поднять привилегии непосредственно перед выходом, чтобы я мог правильно удалить pidfile из /var/run. Тем не менее, я столкнулся с множеством проблем с различными библиотеками и внешними программами, которые выходят из строя при вызове с другим euid, чем uid.

Есть ли другой способ добиться этого? Я полагаю, что другой вариант - просто поместить мой pid-файл в каталог, доступный для записи как корню, так и foo пользователей. Но все остальные наши pid-файлы находятся в /var/run, включая pid-файлы других программ, которые работают от имени непривилегированных пользователей, поэтому я бы хотел поставить foo.pid файл и там.

Есть ли способ сделать это, кроме использования seteuid?

Не помещайте файл PID в /var/run/foo.pid, положи это в /var/run/foo/foo.pid и имеют /var/run/foo принадлежит пользователю foo и группа foo. Таким образом, вы можете удалить файл pid перед выходом, и вам не нужно повышать уровень привилегий.

Обратите внимание, однако, что это плохая практика безопасности, поскольку разрешение непривилегированному приложению искажать его файл откроет дыру в безопасности: представьте, что ваше приложение было взломано (в конце концов, какой смысл отбрасывать привилегии, если не ожидать, что приложение может быть атакованным?) - теперь злоумышленник обновляет файл pid и помещает туда, скажем, номер pid sshd. Теперь, когда общесистемные скрипты (запущенные от имени root) попытаются остановить ваше приложение, используя этот файл pid, они вместо этого отключат sshd. Это всего лишь пример, есть и другие способы злоупотребить вашей системой. В общем, файл pid должен быть создан перед Удаление привилегий и очистка файлов pid должны выполняться общесистемными скриптами. - Дмитрий Дмитриевич Хлебников

Еще лучше было бы переключиться на систему инициализации, такую ​​как systemd или Upstart, которая не требует файлов PID для управления службами.

Вы можете разветвить новый процесс перед запуском вашего демона. Родительский процесс остается с привилегированным пользователем root. Дочерний процесс теряет свои привилегии до foo пользователь. Этот процесс выполняет настоящую работу демона.

Родительский процесс создаст файл PID после разветвления своего дочернего процесса и удалит его, когда его дочерний процесс завершится.

Заглянув в свою систему Ubuntu, я вижу, что некоторое установленное программное обеспечение создало каталоги в / var / run, принадлежащие пользователю без полномочий root, как предлагает jcollie.

Другой вариант - сделать так, чтобы pid-файл принадлежал пользователю без полномочий root и обнулить файл вместо его удаления.