让PHP执行shell脚本的正确和安全的方法

9 php linux security permissions shell

我正在开发一个应用程序,人们(任何人)都可以上传代码(Java和可能的C(++)开始),这些代码将在服务器上编译和运行.这当然是一个巨大的安全风险,所有这些都必须适当地沙箱化.但是,这个沙盒超出了这个问题的范围.假设已经被照顾.

接下来,系统中将有依赖shell命令和PHP的exec(),shell_exec()等函数的函数.需要执行的命令不是很多,主要是java(c),gcc,g ++等.如果需要,可以很容易地列出我们需要的命令列表.用户不可能执行除我们决定之后的其他命令.例如,有人上传了一些java代码并要求服务器编译它.然后服务器将运行javac.用户的输入只能更改javac的参数(使用escapeshellarg()进行转义).

我想知道我应该采取什么安全预防措施.我打算使用PHP的安全模式,这样只能safe_mode_exec_dir执行文件中的文件.我还计划将shell文件的所有权设置为root:www-data使得www-data不能更改权限或所有权,而且还具有类似于rwxr-xr--www-data无法修改文件的权限.但是,自5.4.0起,已从PHP中删除安全模式.目前做这样的事情的方法是什么?

让这些shell命令由完全不同的用户运行是否更安全,甚至不能访问任何其他目录safe_mode_exec_dir?那我怎么样呢?

另一个选择是让PHP只维护需要完成的事情列表,并让受限用户每分钟左右运行一次cronjob来遍历列表并执行必要的操作.这会是一种更安全的方法吗?由于最多一分钟的延迟,我宁愿直接从PHP做到这一点.

我可以完全访问我的服务器,但由于策略,我不允许使用虚拟化.

Joh*_*ide 5

在我看来,一个简单的方法来获得一个安全的环境来编译和运行脚本是一个LXC容器.

你说你不能使用虚拟化,但从技术上讲,这只是流程隔离.就像类固醇上的chroot一样.我有一个容器主机本身就是一个VM,到目前为止我没有遇到任何问题.真的LXC不是虚拟化,应该适合您的需求.

以下是一些介绍链接:

例如,您可以为每个游戏创建一个模板容器,其中包含编译和运行上载代码所需的所有库.可以根据需要为cpu,ram和磁盘IO保护和限制此模板.我认为用lxc.network.flag = down或关闭网络也是一个好主意lxc.network.type = empty

然后,在上传代码时,您可以克隆模板容器,将代码放入其中并使其构建并运行代码.

所有这些都可以通过从php调用的shell脚本或一系列php系统调用完成,但听起来不太好.

使用非特权容器是您想要做的事情的必要条件,因为它提供了额外的安全层.

我建议使用Ubuntu 14.04作为LXC主机.我认为使用适当的工具编译和运行代码的调整繁忙框模板是您可以获得的最轻的容器.

这是我得到的想法:

// clone the prepared template
lxc-clone -o myTemplate -n newContainer

// put the code archive in the new container
cp path/to/code path/to/container/and/where/you/want

// Start the container as a daemon
lxc-start -n newContainer -d

// Then launch the right script for the type of code in the container
lxc-attach -n newContainer -- su containeruser -c /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

因此,小工作是使用所需的库创建模板.另一项工作是编写最终调用的脚本.

祝你的项目好运,我希望这会有所帮助.