Изменение владельца существующего процесса в Linux


Я хотел бы запустить tomcat (веб-сервер) как привилегированного пользователя, а затем вернуть его непривилегированному пользователю, как только он запустится. Есть ли способ сделать это программно или вообще с Linux?

Спасибо.

6 6

6 ответов:

Я знаю о kchuid, который делает точно, и хотя он кажется заброшенным, не похоже, что его было бы трудно обновить.

Тем не менее, хостинговая компания , на которую я работаю, позволяет (на общих хостинговых пакетах) пользователям запускать свой собственный веб - сервер - включая Tomcat-на порту 80. Это делается с помощью инструмента под названием authbind , который не требует запуска сервера как root, а просто позволяет пользователям, не являющимся root, привязываться к выбранному IP адреса и выбранные порты.

Единственная загвоздка заключается в том, чтоauthbind не будет работать со слоем сетевой абстракции Javaпо умолчанию . Вам нужно будет отключить поддержку IPV6 Java и, вероятно, указать конкретный IP-адрес для привязки к вашему приложению. Первое можно сделать, запустив JRE с -Djava.net.preferIPv4Stack=true , но последнее зависит от конкретного приложения.

Базовый системный вызов, который вам нужен, - это setuid(2), но он не представлен ни одним из API Java.

Нетрудно написать оболочку JNI, которая давала бы доступ к нему, хотя даже тогда вам нужно было бы найти подходящее место в коде запуска Tomcat для вызова setuid после выполнения вызовов bind(2) (те, которые обычно требуют привилегий root).

В соответствии с рекомендациями geocar вы можете использовать authbind, чтобы Tomcat никогда не нужно было запускать как корень вообще.

В качестве альтернативы, поскольку у вас предположительно есть корневой доступ на рассматриваемом сервере, просто запустите Tomcat на непривилегированном порту, а затем используйте приемы iptables для пересылки входящих запросов с привилегированного порта на тот, который фактически прослушивает Tomcat. Смотрите this SO post для получения информации о том, как это сделать.

Вы можете сделать это в своем собственном коде приложения с помощью системного вызова seteuid (http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html ) но делать это через сценарий bash или что-то еще, я не уверен. Почему бы просто не начать процесс как обычный пользователь в первую очередь?

Хотя процесс может отказаться от своих собственных привилегий, я не думаю, что вы можете просто изменить пользователя другого запущенного процесса.

Можете ли вы объяснить , Почему вы хотите это сделать? Обычно лучше определить пользователя, у которого есть необходимые привилегии (см. "принцип наименьших привилегий"), и запустить его от имени этого пользователя.

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

В зависимости от того, какую проблему вы пытаетесь решить, это может быть или не быть решением. Например, если вам нужно запустить сервер с более высоким приоритетом, это будет работать.