6

我想以特权用户身份启动 tomcat(Web 服务器),然后在启动后将其带回给非特权用户。有没有办法以编程方式或一般使用 Linux 来做到这一点?

谢谢。

4

6 回答 6

4

您需要的底层系统调用是setuid(2),但它没有被任何 Java API 公开。

编写一个可以访问它的 JNI 包装器并不难,尽管即使这样,您也需要在 Tomcat 启动代码中找到一个合适的位置,以便在调用setuid完成后bind(2)调用(那些通常需要根权限)。

按照geocar的建议,您可以使用authbind这样 Tomcat 根本不需要以 root 身份运行。

或者,由于您可能在相关服务器上获得了 root 访问权限,只需在非特权端口上运行 Tomcat,然后使用iptables技巧将入站请求从特权端口转发到 Tomcat 实际侦听的端口。有关如何执行此操作的信息,请参阅此 SO 帖子。

于 2009-01-09T19:11:38.937 回答
2

我知道kchuid正是这样做的,虽然它似乎被遗弃了,但看起来并不难更新。

也就是说,我工作的托管公司确实允许(在共享托管包上)用户在端口 80 上运行他们自己的网络服务器(包括 Tomcat)。这是使用名为authbind的工具完成的,它不需要服务器以 root 身份启动- 但只是让非 root 用户绑定到选定的 IP 地址和选定的端口。

唯一的问题是默认情况下authbind不能与 Java 的网络抽象层一起使用。您将需要禁用 Java 的 IPV6 支持,并可能在您的应用程序中指定要绑定到的特定IP 地址。前者可以通过启动 JRE 来完成,但后者是特定于应用程序的。-Djava.net.preferIPv4Stack=true

于 2009-01-09T18:20:45.280 回答
1

您可以通过系统调用 seteuid ( http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html ) 在您自己的应用程序代码中执行此操作,但通过 bash 脚本或其他方式执行此操作,我是不确定。为什么不首先以普通用户的身份启动该过程?

于 2009-01-09T17:25:21.647 回答
0

虽然一个进程可以放弃自己的特权,但我认为您不能只更改另一个正在运行的进程的用户。

于 2009-01-09T17:23:38.093 回答
0

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

于 2009-01-09T18:01:40.623 回答
0

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

根据您要解决的问题,这可能是也可能不是解决方案。例如,如果您需要以更高的优先级运行服务器,这将起作用。

于 2009-01-09T18:49:59.603 回答