Смена владельца существующего процесса в Linux - PullRequest
6 голосов
/ 09 января 2009

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

Спасибо.

Ответы [ 6 ]

4 голосов
/ 09 января 2009

Нужен базовый системный вызов setuid(2), но он не предоставляется ни одним из API Java.

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

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

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

2 голосов
/ 09 января 2009

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

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

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

1 голос
/ 09 января 2009

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

0 голосов
/ 09 января 2009

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

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

0 голосов
/ 09 января 2009

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

0 голосов
/ 09 января 2009

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

...