У меня есть демон, который начинает как корень (таким образом, он может связать с низкими портами). После инициализации я очень хотел бы иметь его, отбрасывают полномочия пользователя root из соображений безопасности.
Кто-либо может указать на меня на известную корректную часть кода в C, который сделает это?
Я прочитал страницы справочника, я посмотрел на различные реализации этого в различных приложениях, и они все отличаются, и некоторые из них действительно сложны. Это - связанный с безопасностью код, и я действительно не хочу переосмысливать те же ошибки, которые делают другие люди. То, что я ищу, является лучшей практикой, известная хорошая, портативная библиотечная функция, которую я могу использовать в знании, что она собирается разобраться в нем. Такая вещь существует?
Для ссылки: я запускаю как корень; я должен измениться на выполненный под другим uid и ценурозом; мне нужно было создать дополнительные группы правильно; я не должен возвращаться к полномочиям пользователя root впоследствии.
Чтобы отбросить все привилегии (пользователя и группы), вам необходимо удалить группу перед пользователем. Учитывая, что идентификатор пользователя
и идентификатор группы
содержит идентификаторы пользователя и группы, к которой вы хотите перейти, и предполагая, что эффективные идентификаторы также являются корневыми, это достигается путем вызова setuid () и setgid () :
if (getuid() == 0) {
/* process is running as root, drop privileges */
if (setgid(groupid) != 0)
fatal("setgid: Unable to drop group privileges: %s", strerror(errno));
if (setuid(userid) != 0)
fatal("setuid: Unable to drop user privileges: %S", strerror(errno));
}
Если вы параноик, вы можете попытаться вернуть свои права суперпользователя, что должно потерпеть неудачу. Если не удастся, вы спасете:
if (setuid(0) != -1)
fatal("ERROR: Managed to regain root privileges?");
Кроме того, если вы все еще параноик, вы можете также захотеть использовать seteuid () и setegid () , но это не должно ' Это необходимо, поскольку setuid () и setgid () уже установили все идентификаторы, если процесс принадлежит пользователю root.
Список дополнительных групп является проблемой, потому что нет функции POSIX для установки дополнительных групп (есть getgroups () , но нет setgroups ()). Существует расширение BSD и Linux setgroups () , которое вы можете использовать, если это вас беспокоит.
Вы также должны chdir ("/")
или в любой другой каталог, чтобы процесс не оставался в корневом каталоге.
Поскольку ваш вопрос касается Unix в целом, это очень общий подход. Обратите внимание, что в Linux это больше не является предпочтительным подходом.В текущих версиях Linux вы должны установить возможность CAP_NET_BIND_SERVICE
для исполняемого файла и запустить его от имени обычного пользователя. Корневой доступ не требуется.