为什么只有 sudo 用户才能执行该文件?

为什么只有 sudo 用户才能执行该文件?

755必须位于 sudo 用户列表中,才能以权限执行二进制文件,这怎么可能呢?我试图让非 sudo 用户运行程序。这没有发生,但如果我通过 sudo 或以 root 身份执行,它就会正常工作。

文件权限为755 root root
整个程序目录位于/opt

一些细节:
Ubuntu 12.04 Server,64 位
软件基本上是 Firefox 1.9 的旧 32 位版本,经过某种程度的修改以连接到 Tomcat 服务器。

更新
未在 sudo'ers 列表中列出的用户可以启动该程序。
只有我的 sudo 用户不能,即通过简单运行./program
sudo ./programm就可以正常运行。

答案1

最可能的原因是,该程序一旦以普通用户身份运行,就会尝试读取某些文件或执行某些仅供特权用户(基本上是 root)使用的操作。

例如,如果您的程序尝试使用(绑定)到较低的互联网端口之一(小于 1024),则它需要 root 权限才能执行此操作 (1)。或者它尝试读取文件或使用标记为仅供 root 使用的文件库。

hammer(2) 解决方案是标记程序设置 uid root(SUID-root)。这非常危险,应该通过对程序进行编码来避免这种情况,这样程序就不需要它了,而且实际上不可能分发 --- 我永远不会在我的计算机上接受来自非官方来源的 set-uid 程序,即使这样我也不喜欢它们。我发布答案是因为我认为知道它们的存在是件好事。

因此,确保程序使用的所有服务/文件都可以访问是正确的解决方案,否则程序可能必须以 root 身份运行并承担所有后果。

特别警告:这很危险,SUID-root 程序可以对系统做任何想做的事情。如果它们有 bug,用户可以轻松控制整个系统或摧毁它。

如果你将程序设置为 root 用户身份,任何人都可以运行它,并且它将以 root 身份运行。这仅适用于二进制可执行文件; 设置 uid 位不适用于脚本(shell、python 或其他)。

如果你确实想以 root 身份运行脚本,则需要一个包装器,如stackoverflow 上的这个答案。但在这样做之前,请阅读所有问题并确保了解有关安全性的(不那么)细节。如果你真的希望该脚本以 root 身份运行,我会选择编辑sudoers,以便他们可以运行它而sudo无需任何密码stackoverflow 上的这个答案列出了很多想法。

set-uid 用法示例:我复制一份cat(将文件内容输出到终端),将其更改为 root 所有,然后尝试读取 root 拥有且只有 root 才能读取的文件:

(0)asus-romano:~/tmp/suidtest% cp /bin/cat .              
(0)asus-romano:~/tmp/suidtest% ls -l ./cat
-rwxr-xr-x 1 romano romano 46884 Nov 21 09:49 ./cat
(0)asus-romano:~/tmp/suidtest% sudo chown root.root ./cat
(0)asus-romano:~/tmp/suidtest% ls -l
total 48
-rwxr-xr-x 1 root root 46884 Nov 21 09:49 cat
(1)asus-romano:~/tmp/suidtest% ./cat /etc/shadow- > /dev/null
./cat: /etc/shadow-: Permission denied

现在,我将程序更改为 suid-root(注意s权限标志):

(0)asus-romano:~/tmp/suidtest% sudo chmod u+s ./cat
(0)asus-romano:~/tmp/suidtest% ls -l ./cat
-rwsr-xr-x 1 root root 46884 Nov 21 09:49 ./cat
(0)asus-romano:~/tmp/suidtest% ./cat /etc/shadow- > /dev/null

没有错误...

再次强调,除非您完全信任该程序和用户,否则不要这样做。

(1)Linux 中有细粒度的权限,称为能力,但很少使用并且相当复杂......

(2)当你有一把锤子时,所有的东西看起来都像钉子......

答案2

我会尝试将文件移动到 root 以外的组...如果您读到以下内容:https://help.ubuntu.com/community/FilePermissions

你会看到 XXXX root

意味着你的文件/程序属于“root”,并且对“root”组的成员是 755 权限的。因此,

1) 将其他非 root 用户添加到 root 组,或 2) 创建一个全新的组并将该组分配给您正在运行的文件/程序。

这里用于创建群组和内容:https://wiki.archlinux.org/index.php/Users_and_Groups

我希望这能有所帮助!

相关内容