我已经从用户的.bashrc
文件启动了一些进程(基于窗口)。我想防止用户杀死这些进程。有没有办法将进程转移给超级用户,这样普通用户就无法杀死它?或者有没有办法启动超级用户自己拥有的某个进程?
这是一个高度受控的环境,用户只打开一个窗口。我使用的是 Ubuntu 12.04,并且已经禁用了许多其他功能。这不是表演障碍。但我只是想知道
答案1
以不同用户身份启动命令通常使用 su、sudo 或通过在可执行文件的权限中设置 setuid 位来完成。
你做不是想要以 root 身份运行可执行文件,除非他们绝对需要,因为该用户拥有所有权限。如果这些进程不需要任何权限,您可以让它们以“nobody”身份运行,即我们尝试授予尽可能少的权限的用户。
用户始终有权终止自己的进程(只要它有权访问kill系统调用),或者说,给定有效uid的进程始终有权向作为该进程运行的进程发送信号。相同的有效uid。
答案2
您可以在进程中内置陷阱以防止正常终止(SIGINT)。这当然不适用于 SIGKILL (-9)。这样的陷阱看起来像(bash):
trap "echo trapped" INT
要重置陷阱,您可以使用
trap - INT
答案3
取决于您到底在做什么,但您的选择是:
- 使用户能够以不同的用户身份运行该程序。您可以通过 sudo 或通过可执行文件上的 setuid 来执行此操作。请注意,使用其中任何一个,除了用户的 .bashrc 之外的其他东西都将能够启动该程序。 (注意:sudo和setuid都可以是root以外的用户,如果可能的话应该是)
- 让登录系统调用该进程(以 root 身份)前实际上完成了用户登录。这里的优点是您没有向用户授予任何权限,并且用户将无法绕过它(例如,通过编辑或删除 .bashrc,或切换 shell,或...)。一种方法似乎是
pam_exec
连接到 PAM。如果可能的话,您的可执行文件应该放弃 root 权限。