From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: "Denis Kulgeyko" To: mandrake-russian@altlinux.ru Mime-Version: 1.0 X-Mailer: mPOP Web-Mail 2.19 X-Originating-IP: 192.168.35.35 via proxy ufs-gw.customer.adamant.net [212.26.133.146] Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit Message-Id: Subject: [mdk-re] "сюита для трех напильников" к vtund Sender: mandrake-russian-admin@altlinux.ru Errors-To: mandrake-russian-admin@altlinux.ru X-BeenThere: mandrake-russian@altlinux.ru X-Mailman-Version: 2.0 Precedence: bulk Reply-To: mandrake-russian@altlinux.ru X-Reply-To: "Denis Kulgeyko" List-Help: List-Post: List-Subscribe: , List-Id: Linux-Mandrake RE / ALT Linux discussion list List-Unsubscribe: , List-Archive: Date: Thu Mar 14 18:11:16 2002 X-Original-Date: Thu, 14 Mar 2002 17:20:21 +0200 Archived-At: List-Archive: List-Post: Доброго времени суток, ув. 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