思考了一下,确实有一些风险存在。目前我们做事器上都统一利用nobody用户启动nginx和php,包括web目录,这些机器上部分有多个域名在一起运行。这样至少存在一个问题:如果某一个虚拟主机站点有问题,其web目录如/diska/htdocs_1被注入恶意程序,那么其他的站点目录如/diska/htdocs_2域名也很可能难以幸免地通过这个恶意程序被访问到。分开不同用户权限,固然可以办理这个问题。但同时也意味须要徒增一个特定用户,想找一个类似chroot功能。经由搜索查找,nginx中可以增加一个配置项“fastcgi_param PHP_VALUE xxxx”达成这功能:
server {
listen 80 ;
……
location ~ \.(php|phtml) {
……
fastcgi_param PHP_VALUE \"大众open_basedir=$document_root:/tmp/\公众;
……
}
}
配置项加入在须要设置vhost中,冒号\公众:\公众为分隔多个路径。当然也可以加入到 fastcgi_params中让nginx全局调用。
这样实现了虚拟主机限定在各自的web目录中,当某一个域名下涌现漏洞或被攻击时,同一做事器下的其他运用域名不会因此而导致程序文件被查看或修正,避免“跨站”影响。
在查找过程中,同时创造如被入侵,虽然禁锢了对其他web目录的操作,但php程序还可以调用系统的命令进行一些操作。进一步加强安全,降落webshell调用的系统命令,可在php.ini下加入以下选项:
disable_functions = rmdir,exec,system,passthru,shell_exec
以上,我和松哥通过一些探针脚本进行测试验证,成功通过检测。
如果没上述的设置,那么恶意的脚本能直接通过浏览器访问到其他站点目录的内容,乃至可以本地调用系统命令启动一些基于php启动权限拥有者可以启动的端口。
供参考。
注 网上一些资料说在php5.2版本下,这些设置是不生效的。特意试了一下,真的如此。幸好我们的普遍在5.3以上。