sudo:在tomcat服务下运行时,有效uid不为0

时间:2019-10-01 04:16:03

标签: java linux raspberry-pi

我有一个小型Java Web应用程序(grails),部署在tomcat 8下,我想使用sudo在本地服务器上从该脚本执行脚本。在常规的debian / ubuntu服务器上,我要做的就是使用visudo来允许tomcat用户在该特定脚本上执行sudo而无需输入密码,并且一切正常。当我尝试在树莓派(型号3b +,树莓10-破坏者)上安装相同的war文件时,从SD卡启动时,脚本的执行始终失败,并显示错误“ sudo:有效uid不为0,为/ usr

设置了'nosuid'选项的文件系统上的/ bin / sudo或没有root特权的NFS文件系统。

为了解决这个问题,我编写了另一个可执行相同功能的小型可执行jar(即尝试使用sudo启动脚本)。该测试程序以“ pi”和“ tomcat8”用户身份以交互方式(bash)登录时按预期方式工作(我必须为tomcat8用户设置外壳程序才能获得交互式登录名)。然后,我使用strace尝试诊断问题。我能从中收集到的是,当在tomcat8服务下运行时尝试启动sudo时,getuid()返回111(tomcat8),但在bash中运行时将返回0。

我还编写了一个小型c程序,该程序简单地调用getuid()并打印结果。如果我在tomcat8用户下以交互方式运行它(即sudo su tomcat8),则在不使用sudo的情况下运行它时将输出'111',而在使用sudo的情况下则输出'0'。当我尝试从Web应用程序(使用流程生成器)启动该程序时,如果在不使用sudo的情况下运行该命令,则会收到“ 111”,但是当给该命令加上前缀时,则会收到“有效uid不为0 ...”错误sudo。

我已经检查了挂载,并且有许多具有'nosuid'属性的挂载,但是/ usr / bin所在的根目录'/'却没有,并且/ usr / bin / sudo看起来具有正确的位置权限:

pi@raspberrypi:~/dev $ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 147560 Jan 13  2019 /usr/bin/sudo

无奈之下,我尝试了其他几件事,以了解它们可能产生的影响: *将tomcat8用户添加到adm,sudo和其他组 *尝试重新挂载没有nosuid属性的其他挂载,尽管由于挂载在使用中,所以我无法重新挂载大约6个左右。

这些似乎都不起作用。

在我看来,tomcat8用户在bash中可以使用sudo,但在作为守护程序运行时则不能。谁能给我关于这里发生的事情的一些想法?无论如何,有没有诊断或跟踪操作系统如何确定有效uid的方法?

其他可能很重要的事情: 我通过apt安装了openjdk-8-jdk和tomcat8,尽管raspbian使用systemd,但tomcat8是通过init.d脚本启动的。不知道这是否导致uid问题。

如果SD卡上有带有nosuid属性的某些挂载导致问题,为什么在交互式运行时它不会失败?

1 个答案:

答案 0 :(得分:0)

事实证明,启动守护进程的方式存在问题,可能是由于Debian 10启动守护进程的方式发生了变化。我删除了tomcat init.d脚本,并将其替换为systemd单位文件,并包含以下属性:

[Service]
...
NoNewPrivileges=false
AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps

这允许守护程序实际成功调用setUid(0)。