LINUX.ORG.RU

Выполнение сервисов под определенным пользователем


0

0

Как я знаю, стартовые скрипты запускаются init-ом и выполняются с правами рута. Соответственно, запущенные ими сервисы (даемоны) тоже
изначально работают под рутом. Как происходит смена пользователя,
например, выполнение apache под юзером nobody ?

★★★★★

Сам я этого никогда не делал. Но посмотри в сторону системного вызова setuid().

pathfinder ★★★ ()

ну апач, например. сам умеет сбрасывать привелегии когда нужно. это не относится к init скриптам.

isden ★★★★★ ()

>например, выполнение apache под юзером nobody ?
fork + setuid как-то так

dimon555 ★★★★★ ()

Т.е. стандартная схема такая - изначально программа запускается от имени рута, читает из конфига uid нужного пользователя и вызывает setuid(), далее переходит в рабочий режим ?

Harald ★★★★★ ()

Как уже сказали, сисвызов setuid, команда su. Конкртено в инит-скриптах часто юзается start-stop-daemon.

const86 ★★★★★ ()
Ответ на: комментарий от Harald

> Т.е. стандартная схема такая - изначально программа запускается от имени рута, читает из конфига uid нужного пользователя и вызывает setuid(), далее переходит в рабочий режим ?

типа того.

Если программе нужны рутовые привилегии, например, чтобы открыть нужный порт на прослушивание (80 для апача), то прога делает что надо, а затем setuid или fork+setuid, чтобы основной процесс остался под рутом (например, если потребуется снова перечитать конфиг и изменить конфигурацию, работать на порту 81, например), а рабочие процессы были под нужным пользователем.

Если же программе ну нужны рутовые права для старта, то можно ее стартовать не рутом из скрипта (su, sudo).

Liosha_Syrnikov ()
Ответ на: комментарий от Liosha_Syrnikov

pwd=getpwnam(user);
if(pwd==NULL){
error();
}

//--- «дерутизация» ---
//--- группа ---

n=setgroups(0,gr_list);
if(n<0){
error();
}

gid=pwd->pw_gid;
n=setgid(gid);
if(n<0){
error();
}

//--- пользователь ---
uid=pwd->pw_uid;
n=setuid(uid);
if(n<0){
error();
}

Вызов
n=setgroups(0,gr_list);
обнуляет список групп процесса (прописанный для root).
Без этого вызова процесс будет вхож куда не следует.

Полезно еще установить список групп user-а, но этого я не делал.

oleg_2 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.