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



我有一个小型的java Web应用程序(grails(,部署在tomcat 8下,我想从中使用sudo在本地服务器上执行脚本。在常规的 debian/ubuntu 服务器上,我所要做的就是使用 visudo 允许 tomcat 用户在该特定脚本上在没有密码的情况下执行 sudo,并且一切都按预期工作。当我尝试在树莓派(型号 3b+,raspbian 10 - buster(上安装相同的战争文件时,从 SD 卡启动,脚本的执行总是失败,并显示错误"sudo:有效 uid 不为 0,是/usr/bin/sudo 在设置了"nosuid"选项的文件系统上或没有 root 权限的 NFS 文件系统上"。

为了解决这个问题,我编写了另一个执行相同功能的小可执行 jar(即尝试使用 sudo 启动脚本(。当以"pi"和"tomcat8"用户的身份以交互方式(bash(登录时,此测试程序按预期工作(我必须为tomcat8用户设置一个shell才能获得交互式登录(。然后,我使用 strace 来尝试诊断问题。我能从中收集到的只是 getuid(( 在 tomcat8 服务下运行时尝试启动 sudo 时返回 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属性的挂载导致问题,为什么在交互式运行时它不会失败?

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

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

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

最新更新