=?iso-8859-1?q?=5Bmdk-re=5D_=22=D3=C0=C9=D4=C1_=C4=CC=D1_=D4=D2=C5=C8_=CE?= =?iso-8859-1?q?=C1=D0=C9=CC=D8=CE=C9=CB=CF=D7=22_=CB_vtund?=
Denis Kulgeyko
=?iso-8859-1?q?burzumie_=CE=C1_ukr=2Enet?=
Чт Мар 14 18:11:16 MSK 2002
Доброго времени суток, ув. community !
Вопрос к людям имеющим опыт в девелопменте под юнихи.
Есть vtund-2.5. Решил я дописать туда chroot() + setuid()/setgid(). Причина: не
хочу оставлять процесс, висящий во внешний мир (а надо именно его юзать и
именно в иаком виде) работающим под root'ом.
Сделал, но есть одна проблема: когда именно лучше делать setuid() ?
Вкратце о происходящем - сперва делаю chroot(), конфиг читается уже из
нового корня, потом процесс fork()'ается и родитель делает exit() а потомок
отцепляетя от терминала и висит демоном. Дальше возможны 2 варианта - или это
будет клиент или сервер.
Если сервер - то он цепляется на порт и слушает его, ждет вызовов от
клиентов. Вариант - сделать setuid() здесь. setgid() я делаю тут и это ничему
не мешает.
Клиент идет на соответствующий сервер/порт, обменивается ключами,
устанавливает соединение, поднимает сетевой интерфейс и через него уже
пускает туннель. setuid()/setgid() делаю здесь.
Для сервера можно поставить setuid() после поднятия сетевого интерфейса
(там делается еще один fork() - так для каждого клиента), но тогда сервер
будет от момента начала слушанья порта до подьема туннеля работать с
root'овыми правами.
Если сбросить привилегии после "цепляния" к порту - то понадобятся
root'овые права на подъем сетевого интерфейса, настройку маршрутов,
firewall'а и пр. Можно кинуть в новый "/" xто-то типа sudo/super, но они
тянут за собой не так уж и мало всякого барахла и являют собой еще одну
лишнюю "дыру" (есть setuid + executable - файлы). Да и выглядит это несколько
"кривовато".
Если же делать setuid() сразу после поднятия сетевого интерфейса - то не
хватит прав на опускание этого интерфейса при разрыве соединения (ну .. тут
он упадет сам), удаление лишних маршрутов (уйдут сами сразу за интерфейсом),
вычистку firewall'а и прочее.
Есть еще вариант, который потянет за собой переделку в структуре всей
программы - чтобы настройкой интерфейсов и иже с ним занимался самый главный
прародитель-демон (потомки его шевелят по мере надобности), который работает
под root'ом, но напрямую сеть не слушает. Наверно так и сделаю, если не
придумается более лучший вариант, хотя это весьма прилично мороки.
Вот я сижу и ломаю голову .. как бы это все нормально сделать ?
Может что-то подскажете. Заранее огромное пасиба.
?
WBR
Denis A. Kulgeyko aka Burzumie
Подробная информация о списке рассылки community