Изменение владельца существующего процесса в Linux
Я хотел бы запустить tomcat (веб-сервер) как привилегированного пользователя, а затем вернуть его непривилегированному пользователю, как только он запустится. Есть ли способ сделать это программно или вообще с Linux?
Спасибо.
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.
В зависимости от того, какую проблему вы пытаетесь решить, это может быть или не быть решением. Например, если вам нужно запустить сервер с более высоким приоритетом, это будет работать.