Отбрасывание полномочий пользователя root

У меня есть демон, который начинает как корень (таким образом, он может связать с низкими портами). После инициализации я очень хотел бы иметь его, отбрасывают полномочия пользователя root из соображений безопасности.

Кто-либо может указать на меня на известную корректную часть кода в C, который сделает это?

Я прочитал страницы справочника, я посмотрел на различные реализации этого в различных приложениях, и они все отличаются, и некоторые из них действительно сложны. Это - связанный с безопасностью код, и я действительно не хочу переосмысливать те же ошибки, которые делают другие люди. То, что я ищу, является лучшей практикой, известная хорошая, портативная библиотечная функция, которую я могу использовать в знании, что она собирается разобраться в нем. Такая вещь существует?

Для ссылки: я запускаю как корень; я должен измениться на выполненный под другим uid и ценурозом; мне нужно было создать дополнительные группы правильно; я не должен возвращаться к полномочиям пользователя root впоследствии.

54
задан David Given 28 July 2010 в 10:42
поделиться

1 ответ

Чтобы отбросить все привилегии (пользователя и группы), вам необходимо удалить группу перед пользователем. Учитывая, что идентификатор пользователя и идентификатор группы содержит идентификаторы пользователя и группы, к которой вы хотите перейти, и предполагая, что эффективные идентификаторы также являются корневыми, это достигается путем вызова 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 для исполняемого файла и запустить его от имени обычного пользователя. Корневой доступ не требуется.

46
ответ дан 7 November 2019 в 08:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: