我有一个家庭网络服务器,主要用于学习和测试。我在 Debian Bullseye 上使用 Apache2。
我一直在玩的事情之一是使用 php 从网络服务器运行 Bash 脚本。其中一些脚本需要 sudo,因为它们执行诸如终止用户会话或启动或停止 apache 中的虚拟服务器之类的操作。
这些脚本均位于公共目录之外,并由用户帐户(www-data 组)拥有。权限是;所有者=rwx,组=x,其他=无。
www-data 用户具有 sudo 访问权限
www-data ALL=(root) NOPASSWD: /path/to/scripts.sh
我读过一些文章,认为给予网络服务器 sudo 访问权限是一个坏主意,但想不出更好(更安全?)的方法。我考虑过 setuid 但不确定这是否是一个更安全的选择。
如果我必须以提升的权限运行脚本,那么安全的方法是什么?或者 sudo 只允许使用特定脚本是最好的方法吗?
谢谢
答案1
向 Web 服务器用户(在本例中为 www-data)授予 sudo 访问权限可能存在安全风险,因为它允许 Web 服务器执行的任何脚本可能以提升的权限执行任意命令。如果脚本没有经过适当的清理和验证,这可能会特别危险,因为它可能会导致系统遭受命令注入和其他攻击。
更安全的替代方案是使用更细粒度的方法来向特定脚本授予提升的权限。例如,您可以使用 sudoers 等工具授予特定用户或组以提升的权限执行特定命令的权限,而不是授予 Web 服务器用户 sudo 访问权限。
在您的情况下,您已经通过指定脚本的确切路径并仅允许 www-data 使用 sudo 执行它来完成此操作。这是一个很好的方法,因为它限制了滥用的可能性,同时仍然允许脚本执行必要的任务。
另一个需要考虑的选项是使用单独的进程或服务来执行需要提升权限的任务。例如,您可以编写一个守护程序或系统服务来侦听来自 Web 服务器的请求并以提升的权限执行必要的命令。这有助于进一步将特权任务与 Web 服务器隔离并限制潜在的安全风险。
总的来说,仔细考虑向任何用户或进程授予提升权限的安全影响,并使用细粒度的方法来限制潜在风险非常重要。
我可以给你的最新建议是你应该查看你的网络服务器的 Selinux 配置,你可以使用 Selinux 来限制你的进程系统调用。
答案2
如果脚本/命令被安全地执行,那么sudo
/SUID
就不是问题。
如何创建安全的脚本/程序在书中得到了解答,而不是在 Stackexchange 响应中......
在您的情况下,考虑每个具有提升权限的命令是否真的需要 root 权限可能是有意义的。例如:为了终止用户的进程,您不必这样做root
;成为该用户就足够了。
您可以枚举允许(或不允许)的用户,sudoers
或者使用包装脚本来检查 UID 是否至少为 1000(假设这是用户帐户的起始位置)。
根进程的限制
您可以采取很多措施来限制以 root 身份运行的进程的功能。最简单的方法可能是使用(实例化的)Systemd 服务,或者systemd-run
因为这样您就可以轻松访问man systemd.exec
.例如,您只需要非常有限的文件系统访问权限,不需要网络访问权限来触发网络服务器重新加载/重新启动。