在Linux中更改现有进程的所有者

6
我希望能以特权用户身份启动Tomcat(Web服务器),然后在它启动后将其降为非特权用户。是否有一种程序化或者通用的Linux方法可以实现这一点?
谢谢。
6个回答

4
你需要的底层系统调用是setuid(2),但它不会被任何Java API公开。不过编写一个JNI包装器来访问它并不难,即使这样,你仍然需要找到适当的位置在Tomcat启动代码中,在bind(2)调用完成后调用setuid(这些通常需要root权限)。
正如geocar所建议的,你可以使用authbind,这样Tomcat永远不需要以root身份运行。
或者,由于你应该在服务器上有root访问权限,只需在非特权端口上运行Tomcat,然后使用iptables技巧将入站请求从特权端口转发到Tomcat实际监听的端口。请参阅此SO帖子以获取有关如何执行此操作的信息。

2
我知道kchuid可以做到这一点,虽然它看起来已经被放弃了,但更新起来应该不难。
另外,我所在的hosting company公司允许共享主机用户运行自己的Web服务器,包括Tomcat,使用一个叫做authbind的工具,在端口80上运行。这是通过让非root用户绑定到指定的IP地址和端口实现的,而不需要作为root启动服务器。
唯一的问题是authbind默认情况下无法与Java的网络抽象层配合使用。您需要禁用Java的IPV6支持,并可能在应用程序中指定一个特定的IP地址进行绑定。前者可以通过使用-Djava.net.preferIPv4Stack=true启动JRE来完成,但后者是应用程序特定的。

1

0

虽然一个进程可以放弃自己的权限,但我认为你不能仅仅改变另一个正在运行的进程的用户。


0
你能解释一下为什么要这样做吗?通常最好定义一个具有所需权限的用户(参见"最小特权原则"),并以该用户身份运行。

2
可能是因为他想要监听一个特权(<1024)端口! - Alnitak

0

您可以创建一个单独的程序,该程序以root权限启动(例如通过设置二进制setuid),执行需要特权的工作,使用setuid降低权限,最后执行tomcat。

根据您要解决的问题,这可能是或不是一个解决方案。例如,如果您需要以更高的优先级运行服务器,则此方法可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接