Смене владельца существующего процесса в 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 никогда не должен работать как root.

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


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


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


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


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

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