我想以特权用户身份启动tomcat(Web Server),然后在启动后将其恢复给非特权用户。有没有办法以编程方式,或一般用Linux?
感谢。
答案 0 :(得分:4)
您需要的基础系统调用是setuid(2)
,但任何Java API都不会公开它。
编写一个可以访问它的JNI包装器并不难,尽管如此,你需要在Tomcat启动代码中找到一个合适的位置,以便在setuid
之后调用bind(2)
已经进行了调用(那些通常需要root权限的调用)。
根据geocar的建议,您可以使用authbind
,以便Tomcat根本不需要以root用户身份运行。
或者,因为您可能在相关服务器上获得root访问权限,只需在非特权端口上运行Tomcat,然后使用iptables
技巧将特权端口的入站请求转发到Tomcat的端口实际上正在倾听。有关如何执行此操作的信息,请参阅this SO post。
答案 1 :(得分:2)
我知道kchuid 完全那个,虽然看起来已经放弃了,但看起来并不难以更新。
也就是说,我工作的hosting company允许(在共享主机软件包上)用户运行他们自己的网络服务器 - 包括端口80上的Tomcat-这是使用名为authbind的工具完成的。这不需要服务器以root身份启动 - 但只是让非root用户绑定到选定的IP地址和选定的端口。
唯一的问题是authbind默认情况下不能与Java的网络抽象层一起使用。您需要禁用Java的IPV6支持,并可能指定要绑定到应用程序中的特定 IP地址。前者可以通过使用-Djava.net.preferIPv4Stack=true
启动JRE来完成,但后者是特定于应用程序的。
答案 2 :(得分:1)
您可以通过系统调用seteuid(http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html)在自己的应用程序代码中执行此操作,但是通过bash脚本或其他方式执行此操作,我不确定。为什么不首先以普通用户身份启动流程?
答案 3 :(得分:0)
虽然进程可以删除自己的权限,但我认为您不能只更改另一个正在运行的进程的用户。
答案 4 :(得分:0)
你能解释为什么你想要这样做?通常,最好定义具有所需权限的用户(请参阅"Principle of Least Privilege")并以该用户身份运行。
答案 5 :(得分:0)
您可以创建一个以root权限启动的单独程序(例如,通过使用二进制setuid),执行需要权限的工作,使用setuid删除权限,最后执行tomcat。
根据您尝试解决的问题,这可能是也可能不是解决方案。例如。如果你需要运行具有更高优先级的服务器,这将有效。