root 如何启动一个只有 root 才能终止的进程?

root 如何启动一个只有 root 才能终止的进程?

在后台启动一个进程或者使其成为systemd服务很容易。

但是,如果我想启动一个监视 Linux 机器上活动的进程,它就会成为攻击目标。如果任何用户想做坏事,它首先会杀死这个进程,即使他们只是sudoers 或wheel用户,只需执行killsystemctl stop

有没有办法强制执行只能root终止的进程?


伙计们,想想连rsyslog服务都能被杀死,你们就应该意识到 Linux 是多么脆弱。这就像飞行员可以关闭黑匣子。有哪家航空公司允许这种情况发生?或者有哪家航空公司给飞行员一个允许列表,阻止他们采取任何措施来拯救飞机?当然,飞行员可以让飞机坠毁,但黑匣子会记录下来。

我提出的禁令名单从安全角度来看是合理的,尽管这可能会让您感到害怕。所以不要试图责怪提出这个问题的人,好吗?

答案1

拥有不受限制的 sudo/wheel 权限的任何人都可以撤销您所做的任何操作。即使您设法通过消除直接终止进程的可能性(例如使用)来实现这一点,但sudo kill仍然可以使用其他 sudo 命令来规避这一点,或者您也会将自己锁定在管理之外。

问问自己,为什么不受信任的用户一开始就拥有不受限制的 sudo 权限?他们不应该拥有。只将这种权限授予您完全信任的人。如果仍有一些特权命令需要执行,请仅为这些命令启用 sudo:

+netmgr /usr/sbin/ifup, /usr/sbin/ifdown

(用于visudo -f /etc/sudoers.d/netmgr将其放入 sudoers 附加文件中)。

这样,您可以允许用户仅运行sudo /usr/sbin/ifupsudo /usr/sbin/ifdown,而不允许运行其他 sudo 命令。 中还有许多其他示例、说明和安全注意事项man sudoers。请阅读!

审计通常以其他方式进行。具体来说,你设置其他机器,配置其系统日志以接受来自远程站点的日志。在有问题的机器上,您设置了日志记录,以便除了本地存储之外,它还会将所有日志发送到日志机器中。即使有人禁用此日志发送,禁用本身的操作也会被记录下来,所以至少您会知道谁是罪魁祸首。

答案2

你不能赋予某人权力然后又阻止他们使用。你必须严格限制你赋予他们的权力,只包括你希望他们拥有的权力。

在评论中您说:

我必须允许他们使用kill,或者systemctl stop因为有些应用程序确实需要这些权限才能完成工作

这并不意味着那些用户需要访问这些命令,只有这些应用程序。用户具有有限的运行权限sudo ./someprogram,并且一旦该程序以 root 身份运行,它就可以kill根据需要使用 等。但是,用户无法直接访问这些内部命令。

从根本上讲,用户不需要访问命令,他们需要访问功能。如果kill风险太大,请阻止对它的访问,并提供其他更安全的方法来实现相同的结果。也许您可以创建一个小型实用程序,safekill其作用类似于kill但拒绝终止某些进程的请求。授予用户 sudo 访问权限,safekill但不授予真正的访问权限kill。如果用户总是使用这些命令来做同样的事情,请将整个过程封装在一个小程序中,让他们使用它,而不是手动执行(例如,他们会运行sudo restart_webservers而不是单独终止和重新启动所有各种服务器进程)。您的用户仍然可以访问他们需要的功能,但他们不能直接使用危险武器。

根据您的具体设置,可能还有另一种更极端的强制机制。有些处理器有看门狗定时器可用。修改您的活动监控程序以启动看门狗并每隔几秒钟重置一次。如果有人设法杀死您的监视器,看门狗计时器将到期,系统将自行重新启动,并在启动时重新启动监视器程序。这不会严格阻止监视器被禁用,但它会禁止任何人在禁用它后做任何有意义的事情。这还会在您的系统日志中创建漂亮的大红旗。大多数带有看门狗的系统都会报告看门狗触发特定重启的时间。在用户登录到 shell 时发生的看门狗触发的重启应被视为非常可疑的。

答案3

我是 Linux 菜鸟。你能否考虑编写程序或脚本,只执行这些家伙应该执行的操作,然后让他们成为 root 所有者并为他们添加 setuid 位?当然,一个大问题是你可能不希望其他人运行这些命令。我不确定你是否可以获得原始用户信息。当然,使用 setuid/setgid 时总是需要格外小心。

答案4

我想到了一个开始!

root可以像这样为用户设置默认 SHELL:

useradd [someuser] -s [a certain executable]

然后,如果某个可执行文件 = 一个审查脚本:

  1. 自动审查某些命令的执行。类似stop& 的rsyslog组合。

  2. 禁止命令退出此 shell 并使用另一个甚至是原始的bash

  3. 禁止命令以阻止用户获得root像上面@user253751 提到的那样的角色。

  4. 将其余命令传递给/bin/bash

r+x然后只需为任何用户设置它即可。

在此答案下,任何建议都值得赞赏。特别是对于 2 和 3,似乎有多种方法。


/etc/profileBash 将首先加载和中的设置/etc/bashrc。我注意到后者处理PROMPT_COMMAND变量。可以在最后一行劫持它以添加到审查脚本中,但某些系统需要豁免用户名,因为默认情况下没有人有 root 权限来将其改回。

满足上述4+1的完全审查将被标记为合法答案。

我永远不会将“你应该放弃”的答案标记为合法。

相关问题有:

我如何记录用户的 bash 命令?

我如何让 bash 将 shell 命令记录到 syslog 中?

无需运行 bash_profile 或 bashrc 即可登录

相关内容