java - 须藤: effective uid is not 0 when running under tomcat service

标签 java linux raspberry-pi

我有一个小型 java web 应用程序(grails),部署在 tomcat 8 下,我想使用 sudo 在本地服务器上执行脚本。在常规 debian/ubuntu 服务器上,我所要做的就是使用 visudo 允许 tomcat 用户在该特定脚本上无需密码即可执行 sudo,并且一切都按预期运行。当我尝试在树莓派(型号 3b+、raspbian 10 - buster)上安装相同的 war 文件时,从 SD 卡启动,脚本的执行总是失败,并出现错误“sudo: effective uid is not 0, is/usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root权限”。

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

我还编写了一个小型 C 程序,它只调用 getuid() 并打印结果。如果我在 tomcat8 用户下交互运行它(即 sudo su tomcat8),当我在没有 sudo 的情况下运行它时,它会打印“111”,而当我使用 sudo 运行它时,它会打印“0”。当我尝试从网络应用程序(使用进程生成器)启动此程序时,如果在没有 sudo 的情况下运行命令,我会收到“111”,但当命令以 sudo 为前缀时,我会收到“有效 uid 不是 0 ...”错误。

我检查了挂载,有很多挂载具有“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)。

关于java - 须藤: effective uid is not 0 when running under tomcat service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177956/

相关文章:

linux - 使用树莓派直接读取以太网端口上的信号

java - Android 填屏不支持 S3 S4 屏幕分辨率

java - 检查二维数组中的 boolean 值

linux - linux cksum 命令值是否因系统而异?

linux - "-sh: executable_path:not found"是什么意思

python - 无法从 Raspberry Pi 发射 DC Thunder 导弹发射器

java - 我有一项 Activity 。在此 Activity 中,我执行了 AsyncTask ,但它不起作用

Java 识别超过 2 个监视器

linux - nohup 与现在的区别

linux - 如何使用 putty 在 linux 服务器上安装 node.js