我有一个早期问题的演变。
主要问题:以 root 身份运行程序与通过具有 sudoers 文件条目的服务帐户运行程序之间有什么有意义的区别?
我必须将第 3 方软件代理部署到具有安全意识的客户的 RHEL 环境中。默认安装导致代理的文件和文件夹归 root 所有,并计划在启动、关闭或通过 crontab 文件运行;但无论哪种方式,它都作为根进程运行,安全团队中似乎没有人喜欢。
供应商建议更安全的替代方法是通过具有 sudoers 文件条目的服务帐户执行代理:例如:
agent-user ALL=NOPASSWD: /opt/agent/agent-executable
但从安全的角度来看,这实际上更好吗?或者在这种情况下最佳做法是什么?
在我看来,无论哪种方式,代理都将获得对服务器的特权访问。服务帐户是一种自定义(虽然由供应商支持)似乎是一个犯错的机会。
是NOPASSWD:
一个安全漏洞,并且会规定一个/sbin/nologin
提高安全性的外壳?
TLDR
最终结果确实是一样的:
/opt/agent/agent-executable
以 root 权限运行,所有风险都与该权限级别相关。“最佳实践往往只是另一种意见。”
恕我直言,当服务由主进程和(许多)组件组成时,我建议使用 sudo 选项,这些组件不需要 root 权限才能正常运行,并且在使用
agent-user
身份时会愉快地运行,但是有一些特定的,容易已识别的组件(如agent-executable
)确实需要这样的 root 访问权限。这需要管理员和主要服务支持在修改后的上下文中以提升的权限运行这些特定组件的能力。
sudo
特别适合这种情况(并且是比在可执行文件上设置 SUID 位更好的选择)。然后你坚持最小权限的安全原则。
例如,当您创建这样的 systemd 单元时:
它指示 systemd(以 root 身份运行)切换到代理用户的身份,以在特权降低的环境中运行服务。然后,作为受限制的用户,您可以
sudo
再次提升权限以以 root 身份运行服务。在那种情况下,您只是很傻,不妨从一开始就以 root 身份启动代理可执行文件并执行以下操作:
注意:当您通过 sudo 或 systemd(带有和不带有显式
User=root
)启动进程时,生成的环境存在一些细微的差异,这些差异在此时可能不相关。在服务和自动化的情况下通常是不可避免的。
总的来说:没有人们想象的那么多。例如,请参阅此 Q&A。