Почему многие серверы меняют свои uid и gid, в чем выгода? - PullRequest
6 голосов
/ 03 июня 2011

Я вижу такую ​​логику во многих проектах с открытым исходным кодом:

if (setuid() == 0) {
   if (setgid(ccf->group) == -1) {
   ...
   if (initgroups(ccf->username, ccf->group) == -1) {

У меня есть 2 вопроса по этому вопросу:

  1. Какая польза от перехода на другой гид и юд?
  2. А для чего initgroups? IMO, чтобы изменить gid и uid, setuid() и setgid() будет достаточно.

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

В большинстве случаев системные демоны порождаются сценариями инициализации и поэтому запускаются как root.Вызов setuid() и setgid() позволяет им отказаться от своих привилегий суперпользователя и выдать себя за другого пользователя в системе (как правило, гораздо менее мощный, чем root).Таким образом, ошибки и дыры в безопасности становятся менее смертоносными для системы.

Что касается второй части вашего вопроса, initgroups () вызывается для повторной инициализации списка доступа к группе и добавления ccf->groupв список групп, к которым принадлежит ccf->username.Вероятно, это сделано, потому что вызова setgid() недостаточно для распространения прав доступа, связанных с новой группой, на процесс.

2 голосов
/ 03 июня 2011

Как правило, вам необходимо разрешение администратора для прослушивания портов 1023 и ниже. (Существуют и другие причины, чтобы начать с прав администратора, но это большая причина.) Но вот в чем дело: вы можете начать с прав администратора, связать сокет, а затем раскрыться, чтобы стать пользователем.

Теперь, почему вы хотите быть пользователем? Что ж, если вы запускаете с наименьшим количеством разрешений и ваша программа скомпрометирована, то ущерб будет локализован.

0 голосов
/ 24 октября 2014

На некоторых ОС setgid() тосты дополнительных групп. Таким образом, вызов initgroups() до setgid() неэффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...