在后台启动一个进程或者使其成为systemd
服务很容易。
但是,如果我想启动一个监视 Linux 机器上活动的进程,它就会成为攻击目标。如果任何用户想做坏事,它首先会杀死这个进程,即使他们只是sudo
ers 或wheel
用户,只需执行kill
或systemctl 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/ifup
和sudo /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]
然后,如果某个可执行文件 = 一个审查脚本:
自动审查某些命令的执行。类似
stop
& 的rsyslog
组合。禁止命令退出此 shell 并使用另一个甚至是原始的
bash
禁止命令以阻止用户获得
root
像上面@user253751 提到的那样的角色。将其余命令传递给
/bin/bash
r+x
然后只需为任何用户设置它即可。
在此答案下,任何建议都值得赞赏。特别是对于 2 和 3,似乎有多种方法。
/etc/profile
Bash 将首先加载和中的设置/etc/bashrc
。我注意到后者处理PROMPT_COMMAND
变量。可以在最后一行劫持它以添加到审查脚本中,但某些系统需要豁免用户名,因为默认情况下没有人有 root 权限来将其改回。
满足上述4+1的完全审查将被标记为合法答案。
我永远不会将“你应该放弃”的答案标记为合法。
相关问题有: