我在 RHEL-8.10 中安装了 NICE-DCV,并以 root 身份执行dcv list-sessions
显示系统上的所有会话。但如果用户执行dcv list-sessions
此操作,则输出仅是他们的会话,不会报告任何其他会话;这是正常的。
在编写 C 代码以让列表会话输出更美观,并允许所有用户查看当前有哪些活动会话时,我尝试在我的c 可执行文件上设置 UID/usr/local/bin/dcvlist
,结果显示为-rwsrwxr-x. 1 root root dcvlist
。当我以 root 身份运行此dcvlist
可执行文件时,我得到了所有会话正在发生的预期输出,但作为普通用户帐户,仍然没有发生这种情况。
根据我所解释的内容,我做错了什么吗?我是否误以为 setuid 也应该适用于system("dcv list-sessions")
我的 C 代码中的,但事实似乎并非如此?我所有的 C 代码都在做system("dcv list-sessions")
...实际上是 a popen
,然后我只是重新打印该输出。
此外,该dcv
程序还需要许多参数,list-sessions
所以我不想允许sudo
用户以 root 身份运行该程序。
setuid 程序会改变进程的有效
getuid()
uid;如果应用程序正在检查真实 uid(例如通过调用),那么它将看不到差异;真实 uid 仍然是用户的 uid。您可以使用 在程序中设置真实 UID
setuid(0);
。如果有效 UID 为零(因此来自 setuid root 程序),则此方法有效。不过,您需要小心处理此类事情;您的
system("dev ...")
调用将允许用户创建自己的dev
命令并首先将其放在 PATH 上(例如 create$HOME/bin/dev
和 setexport PATH=$HOME/bin:$PATH
)。现在他们拥有完全的 root 访问权限。相反,您最好使用经过
sudo
正确配置的。这可以提供细粒度的访问权限(例如,仅允许特定人员执行此操作)并提供审计跟踪等。sudo
可以配置为仅允许特定选项,而不是每个选项。例如
这样就只允许
dev
团队中的人员跑步sudo dev list-sessions
。如果他们试图跑步sudo dev anythingelse
,则不被允许。