使用PHP-FPM运行bash脚本的最安全的方法

我目前使用Nginx + PHP-Fpm运行websever,每个站点使用自己的用户名/ GID。 然后我有一个bash脚本,用来创build新用户以及其他必要的东西。 我知道我可以调用脚本使用shell_exec / suexec,但我想知道什么是最安全的方式来调用一个bash脚本,而不会危及服务器的安全?

起初我想设置一个cron作业来运行这个脚本,但是这个帐户需要立即启动。 所以cron不会工作。

此外,我已经做了一些search,并build议使用php守护进程监视队列,然后在有工作时运行脚本。 由于我从来没有任何经验,所以对这个(守护进程)不太确定。

我怎样才能安全地运行我的脚本?

更新:
只是为了更新我已经决定与Beanstalkd + pheanstalk组合。

PHP脚本将作业发送到队列,然后将由具有所需特权的单独用户运行的守护进程php脚本运行。

关于在PHP中使用exec的具体主题以及如何安全,唯一需要注意的是逃避论据。

要这样做:

exec('myscript ' . $_POST['arg']); 

如果它不是很明显 – 只要想想如果$_POST['arg']包含会发生什么; rm xyz ; rm xyz – 或者更糟的是,如果你正在发送那个命令的输出到屏幕上, ; more /etc/passwd; more db-config.php ; more /etc/passwd; more db-config.php

因此 – 逃避你的论点 :

 $foo = escapeshellarg($whatever); exec("myscript $foo"); 

但是,如果你的bash脚本需要比通常允许你的nginx用户更多的权限 – 你最好听从你发现的build议,从nginx用户运行你的bash脚本的用户解除关联。

类似于问题中的php守护进程build议,php应用程序使用作业 队列系统发送请求 ,使bash脚本同步或asynchronous运行。 作业队列只是发送请求到你的bash脚本,可选地返回结果。 通过这种方式,您可以以适当的权限以用户的身份启动“创build新用户”bash脚本,而无需为您的nginx用户提供任何额外的权限,并冒着在其他地方利用这些权限的风险,如果您的php应用程序代码。 Gearman尤其是安装非常容易。