PHP 服务器
Last updated
Last updated
OpenRASP 依赖于如下几个扩展。如果你在使用发行版自带的 PHP 环境,可以使用 yum
、apt-get
等工具安装下这些扩展;如果是自己编译的 PHP 环境,则需要在编译阶段开启这些功能。
pdo
pcre
json
对于服务器环境和操作系统的支持情况,可查看,目前 5.3 - 7.3 都是支持的。
下载 rasp-php-linux.tar.bz2
或者 rasp-php-linux-ts.tar.bz2(线程安全版本)
并解压缩。之后进入到解压后的目录中,e.g rasp-php-20180320
如果你要开启远程管理,请先参考 文档,找到 app_id/app_secret/backend_url
三个关键参数,然后执行如下命令,
如果你只是运行单机版,只需要指定 -d 参数,
其中 /opt/rasp
为 OpenRASP 安装目录,用于存储检测插件、报警日志等等,可根据实际情况调整。在某些情况下,php cli
和 php-fpm
使用的 ini 不同,自动安装程序可能会失败。
首先,备份老的扩展,e.g
然后,安装新的扩展,e.g
最后,通过 graceful reload 方式重新加载服务。
针对不同的服务器类型,你需要执行不同的命令,e.g
需要注意的是,请不要直接覆盖 openrasp.so
,否则会产生意想不到的内存错误。我们建议使用 重命名方式
来安装新版,以避免出现问题。
在 web 目录下面,我们建立一个 info.php
,并填写如下内容
在浏览器里打开这个页面,使用搜索功能,
定位到 extension_dir
字样,确认PHP扩展安装目录
e.g /usr/lib/php/20151012
搜索 Additional .ini files parsed
字样,
如果找到了,我们就在这个目录下面创建一个新的 ini 文件,e.g /etc/php.d/z-openrasp.ini
如果找不到,就定位到 Loaded Configuration File
字样,确认 ini 配置文件路径
e.g /etc/php.ini
首先,根据你的 PHP 版本号,复制正确的 openrasp.so
到扩展目录,e.g
然后,确定 OpenRASP 安装目录,在这里我们使用 /opt/rasp
这个目录将会用于存储检测插件、报警日志、插件日志等内容,需要手动创建,并保证 PHP 进程可以写入,e.g
由于报警日志存储在 /opt/rasp/logs
,我们建议挑选一个空间较大的分区,以避免将根分区打满
最后,修改 php.ini
,或者创建 z-openrasp.ini
文件,添加如下内容:
访问刚才创建的 info.php
,检查 openrasp
模块是否加载成功即可,e.g
如果你没有看到类似的信息,则说明扩展加载失败。常见原因有
PHP版本和扩展版本不一致,比如 PHP 是 5.3 版本,但你安装了 PHP 5.6 版本的 openrasp.so
INI 配置不正确,请参考 php error.log 里的错误消息
所有的错误消息都以 [OpenRASP] 错误码
开头,方便和其他日志进行区分
对于 apache/nginx,可以查看类似 /var/log/nginx/error.log
的路径
确认安装成功后,请删除 info.php
这个文件,以避免泄露敏感信息。
我们只支持 Homebrew PHP 5.6
版本,安装过程同 Linux 系统,aka
复制 dylib 文件到 PHP 扩展目录
修改 INI 配置文件
重启 php-fpm 生效
另外,MacOS 版本不支持远程管理。
OpenRASP 扩展跟 xdebug
模块存在冲突,若同时开启了 xdebug
模块,请先禁用它
在 openrasp 扩展初始化时,我们创建了文件监控线程,用于插件目录的监控。当我们发现插件目录发生变化,就会通过发送 USR2
信号的方式,通知 php-fpm master process
去重新加载子进程,即 gracefully reload。
然而,如果你在启动 php-fpm
的时候,没有使用 -F
参数,则意味着 php-fpm
会主动 fork() 到后台。此时,我们创建的文件监控线程就会失效,也就无法监控插件目录了。
解决方法就是使用 php-fpm -F
这样的方式启动PHP服务器。当然,如果你使用发行版自带的 php-fpm,通常都是这样启动的,无需担心。
默认情况下,OpenRASP会被安装到/opt/rasp
,以下用<openrasp.root_dir>
代替。你需要检查<openrasp.root_dir>/rasp/logs
目录是否存在,以及是否有写权限。
常见没有权限的原因有:
使用了root账号安装OpenRASP,而应用使用低权限账号运行(比如nobody)。
可以执行chmod 777 -R <openrasp.root_dir>/logs
增加权限
也可以使用chmod修改上述目录的属主(更加安全)
开启了LSM
对于CentOS/RHEL系统,请检查SELinux是否开启。如果开启,可执行setenforce 0
关闭
对于Debian/Ubuntu系统,请检查AppArmor是否开启。如果开启,可以修改php-fpm、apache进程的加固配置
开启了open_basedir配置
我们使用PHP Stream方式写入日志,需要将日志目录加到open_basedir白名单里。如果没有加入,将会看到类似这样的错误
由于nginx/php-fpm/apache都可以修改php的配置,建议在网站根目录下放置phpinfo来检查该配置项,要比命令行准确
如果依然无法解决问题,请检查 php error_log
是否有 OpenRASP 相关的错误日志
如果没有配置过,请在 php.ini 里开启,e.g error_log = /tmp/php_error.log
systemd 会限制应用栈的大小,导致 openrasp 无法启动。你通过修改 /usr/lib/systemd/system/httpd.service
,并提高 LimitStack 的值来解决问题。经过测试,我们发现将栈大小限制改为 16MB 可以解决问题,对应的配置为:
当然,直接使用命令行启动 apache 是没有这个问题的,因为他会继承系统默认的 limit 配置,即 unlimited
。
OpenRASP 依赖于多个PHP扩展,json、pdo、pcre 等等。由于 PHP 不会严格按照依赖顺序去加载扩展,所以当 openrasp 先于 json 加载,就会产生这个错误,e.g
解决方法就是让 openrasp
扩展最后加载。常见的做法是调整配置文件的权重,比如将 openrasp
配置文件改为 /etc/php.d/z-openrasp.ini
,这样 json 配置文件就会先于 openrasp 配置文件加载,就解决了扩展依赖的问题。
当PHP服务器处理过至少一次请求后,我们才能够检测到 webroot,之后才会启动敏感目录检测功能。为了保证性能,该检测点具有如下限制:
只会检测根目录,子目录不会处理
最多在内存里缓存 256 个不同的 webroot 路径,超过这个限制时,只保留已有的路径
根据QQ群用户反馈,增加软连接可以解决问题:
执行如下命令,如果返回 bool(true)
则是线程安全(TS)版本
当然也可以编写PHP脚本来测试,如果页面返回 bool(true)
则是线程安全(TS)版本
其中,openrasp.root_dir
表示刚才选择的 OpenRASP 安装目录,不填写则无法加载。对于其他配置参数,可参考文档进行调整。
点击这里下载官方插件 ,并放置到 <openrasp.root_dir>/plugins/
目录,下载后自动加载并生效。