2009-01-09 43 views

回答

2

我知道kchuid它確實確切地說,雖然它似乎被放棄,但它看起來不會很難帶來最新的。

也就是說,我工作的hosting company確實允許(在共享託管包上)用戶在端口80上運行他們自己的Web服務器 - 包括Tomcat-。這是通過使用名爲authbind的工具完成的,該工具不需要服務器以root用戶身份啓動,但只允許非root用戶綁定到選定的IP地址和選定的端口。

唯一的問題是,authbind將無法​​與Java的網絡抽象層默認。您需要禁用Java的IPV6支持,並可能指定一個特定的 IP地址綁定到您的應用程序中。前者可以通過使用-Djava.net.preferIPv4Stack=true啓動JRE來完成,但後者是特定於應用程序的。

0

雖然進程可以放棄自己的權限,但我認爲您不能更改另一個正在運行的進程的用戶。

0

你能解釋一下爲什麼你想這樣做?通常最好定義一個具有所需權限的用戶(請參閱"Principle of Least Privilege")並以該用戶身份運行該用戶。

+1

可能是因爲他想聽特權(<1024)端口! – Alnitak 2009-01-09 19:12:28

0

您可以創建一個單獨的程序,該程序以root權限啓動(例如通過使用二進制setuid),執行需要權限的工作,使用setuid刪除權限,最後執行tomcat。

根據您嘗試解決什麼問題,這可能會也可能不是解決方案。例如。如果你需要以更高的優先級運行服務器,這將工作。

4

您需要的底層系統調用是setuid(2),但它沒有被任何Java API公開。

不難寫一個JNI包裝,將它送給接入不過,儘管後來連你需要找到在Tomcat啓動代碼合適的地方調用bind(2)已籲請之後setuid(它們是:那些通常需要root權限的人)。

根據geocar的推薦,您可以使用authbind,這樣Tomcat永遠不需要以根用戶身份運行。

另外,由於您大概在服務器上獲得了根訪問權限,只需在非特權端口上運行Tomcat,然後使用iptables技巧將入站請求從特權端口轉發到Tomcat實際正在偵聽的端口上。有關如何執行此操作的信息,請參閱this SO post