是的,类似问题有很多答案,但我的答案更具体一些。我想将运行 apache 的用户添加www-data
到 sudoers,但我读到的所有地方,他们都将特定文件访问权限添加到 sudoers 文件。现在的问题是,有许多文件需要 sudo 访问权限才能执行命令。我可以通过 SSH 访问 vps。如何允许访问所有 PHP 文件以执行任何 sudo 命令?我知道这非常危险,因为我在网上读到过,但怎么会这样呢?别人怎么能执行他们想要的任何其他代码?即便如此,这也只会被几个人使用,所以就安全而言,对我来说没有问题。
答案1
其他人怎样才能执行他们想要的任何其他代码?
在完美的世界中,程序不会有 bug,因此它们不会出现 bug。但我们并不生活在完美的世界中。
假设你有一个程序foo
。你希望你的 PHP 脚本运行它sudo
并传递用户的语言作为参数。
shell_exec('sudo foo ' . $language);
现在假设一个恶意行为者诱骗你的程序设置$language
为'en; sudo rm -rf /'
(不要自己尝试)。的论点shell_exec
变成:
sudo foo en; sudo rm -rf /
您的服务器执行sudo foo en
,然后立即开始擦除其磁盘。1
这是一个非常基本的例子。当然,有一些可能的缓解措施,但也有绕过它们的方法。您对此没有经验,比潜在攻击者的经验少得多,而且他们的数量远远超过您。然后,您使用的软件中可能存在错误,例如 Apache 或 PHP 本身。最后,有人可以利用完全不同的错误(例如错误的上传表单)来植入远程访问 shell 并获得对www-data
您服务器上帐户的完全访问权限。您不希望您的 Web 服务器能够以 root 身份运行命令。
如果您确实必须从 Web 服务器执行 root 操作,那么我会这样做:
- 根本就不讓
www-data
使用。sudo
- 创建一个在其专用用户帐户上运行的守护进程。赋予它
sudo
访问有限命令子集的权限。当 PHP 进程发出信号时,此守护进程将执行预定义的命令。 - 不要将命令作为字符串传递给守护进程。相反,在守护进程中对命令进行硬编码并为其赋予别名(基本上将它们命名为“函数”)。PHP 进程应该只发送它想要触发的别名。这可以防止攻击者运行任意命令。
- 如果您必须从用户输入中获取参数,请对其进行极其严格的限制。如果输入不是任意的(存在一组已知的有效参数),请将合法值列入白名单。否则,请极其严格地进行验证。一般来说,白名单比黑名单更安全。
总结:
- 不允许
www-data
以 root 身份执行任意命令 - 不要将用户输入传递给 shell,或者至少严格处理它
1实际上它不是,因为它rm
有一个额外的检查来防止用户意外破坏他们的系统,但是有一个开关允许他们这样做,如果他们明确指定的话。我故意不在这里使用它,因为我不想让任何人过得不好。如果你想尝试这个,请自己做研究。请注意,这个命令可能会损坏一些主板。