我目前正在运行一个使用 Nginx+PHP-Fpm 的网络服务器,每个站点都有自己的用户名/GID。然后我有一个 bash 脚本,用于创建新用户以及其他必要的内容。我知道我可以使用 shell_exec/suexec 调用脚本,但我想知道在不危及服务器安全的情况下调用 bash 脚本的最安全方法是什么?
一开始我考虑设置一个 cron 任务来运行脚本,但账户需要立即启动。所以 cron 不起作用。
此外,我还进行了一些搜索,有人建议使用 php 守护进程来监控队列,然后在有作业时运行脚本。我对这个(守护进程)不太确定,因为我从来没有这方面的经验。
我如何才能安全地运行我的脚本?
更新:
只是为了更新,我决定采用 Beanstalkd + pheanstalk 组合。
Php 脚本会将作业发送到队列,然后由具有所需权限的单独用户运行的守护进程化的 php 脚本来运行。
答案1
关于在 php 中使用 exec 的具体主题以及如何确保安全,您唯一需要注意的就是逃避参数。
IE不做这个:
exec('myscript ' . $_POST['arg']);
如果不明显 - 只需想想如果$_POST['arg']
包含会发生什么; rm xyz
- 或者更糟糕的是,如果您将该命令的输出发送到屏幕并且它包含; more /etc/passwd; more db-config.php
等。
所以 -逃避你的争论:
$foo = escapeshellarg($whatever);
exec("myscript $foo");
但是,如果您的 bash 脚本需要的权限比您通常允许 nginx 用户拥有的权限更多 - 您最好听从您发现的建议,将运行您的 bash 脚本的用户与 nginx 用户分离。
与问题中你的 php 守护进程建议类似,php 应用程序发送一个要求要运行 bash 脚本,同步或异步,使用工作 队列系统。作业队列只是将请求发送到您的 bash 脚本,并可选择返回结果。这样,您可以以具有适当权限的用户身份启动“创建新用户”bash 脚本,而无需授予 nginx 用户任何额外权限,并且如果您的 php 应用程序代码存在问题,则这些权限可能会在其他地方被利用。特别是 Gearman,设置起来非常容易。