快速接入 - OpenRASP 官方文档 - 开源自适应安全产品


本站和网页 https://rasp.baidu.com/doc/install/software.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

快速接入 - OpenRASP 官方文档 - 开源自适应安全产品
1.1.
简介
1.2.
安装部署
1.2.1.
兼容性说明
1.2.2.
安装管理后台
1.2.3.
快速接入
1.2.3.1.
PHP 服务器
1.2.3.2.
Tomcat 服务器
1.2.3.3.
JBoss 服务器
1.2.3.4.
Wildfly 服务器
1.2.3.5.
Resin 服务器
1.2.3.6.
Jetty 服务器
1.2.3.7.
Spring Boot 框架
1.2.3.8.
WebLogic 服务器
1.2.3.9.
WebSphere 服务器
1.2.3.10.
宝兰德BES服务器
1.2.3.11.
东方通TongWeb服务器
1.2.3.12.
中创InforSuiteAS服务器
1.2.3.13.
普元PAS服务器
1.2.4.
安装测试用例
1.2.5.
安装灰盒扫描工具
1.2.5.1.
IAST 高级配置选项
1.2.6.
SIEM 系统集成
1.2.6.1.
Splunk
1.2.6.2.
Logstash
1.2.7.
大规模部署
1.2.8.
卸载软件
1.3.
服务配置
1.3.1.
日志说明
1.3.2.
管理后台
1.3.3.
单机版本
1.3.4.
其他配置
1.4.
功能说明
1.4.1.
攻击检测能力说明
1.4.2.
CVE 漏洞覆盖说明
1.4.3.
安全基线检查
1.4.4.
应用加固支持
1.4.5.
应用异常监控
1.4.6.
类库信息查询
1.4.7.
HTML 响应修改
1.5.
插件开发
1.5.1.
开发插件
1.5.2.
接口说明
1.5.2.1.
RASP 类接口
1.5.2.2.
Context 类接口
1.5.3.
参数说明
1.5.4.
单元测试
1.5.5.
在线调试
1.5.6.
官方插件定制
1.6.
二次开发
1.6.1.
架构说明
1.6.1.1.
Java 版本
1.6.1.2.
PHP 版本
1.6.1.3.
管理后台
1.6.1.4.
IAST 扫描器
1.6.1.5.
Hook 函数列表
1.6.2.
从源代码编译
1.6.2.1.
Java 版本
1.6.2.2.
PHP 版本
1.6.2.3.
管理后台
1.6.3.
云控后台接口
1.6.4.
代码调试
1.6.5.
添加新的Hook点
1.6.6.
添加新的插件API
1.6.7.
提交你的代码
1.7.
性能测试
1.8.
版本变更
1.9.
关于我们
Published with GitBook
快速接入
快速接入
OpenRASP 支持私有化部署,包含客户端与服务端两个组件。在接入之前,请先阅读 兼容性说明 文档,检查客户端是否支持你的应用服务。
第一步: 下载最新版本的安装包
常用镜像
国内镜像: packages.baidu.com
国外镜像: github.com
文件说明
文件名
说明
rasp-cloud.tar.gz
管理后台,Linux 版本
rasp-cloud-mac.tar.gz
管理后台,Mac 版本
rasp-java.tar.gz
JavaAgent,Linux 版本
rasp-java.zip
JavaAgent,Windows 版本
rasp-php-linux.tar.bz2
PHP Agent,Linux NTS 版本
rasp-php-linux-ts.tar.bz2
PHP Agent,Linux TS 版本
第二步: 安装管理后台 (可选)
OpenRASP 支持单机防护,也支持远程管理。若要开启远程管理,请先参考 安装管理后台 安装管理后台。
第三步: 安装客户端
取决于你的服务器类型,请参考不同的子章节进行安装。比如 Tomcat 可以查看 Tomcat 服务器安装 进行操作。
第四步: 安装测试用例(可选)
如果你需要测试漏洞检测效果,请参考 安装测试用例 安装漏洞环境。
第五步: 安装IAST扫描工具(可选)
如果你需要安装扫描工具,请参考 安装灰盒扫描工具 页面进行安装和配置。
其他常用链接
开发相关
发版纪要
项目里程碑
beta 版本文档
常见问题
常见自动安装失败原因
OpenRASP 无法拦截攻击
jnotify 无法释放
Could not find or load main class com.baidu.rasp.App 错误
APM 兼容性说明
JDK9 以上安装问题
常见 v8 加载失败原因
libzip.so 崩溃问题
常见问题
1. 常见自动安装失败原因
Java 版本
错误码
说明
10001
未找到插入 JAVA_OPTIONS 的标志
10002
未找到服务器根目录,e.g 使用了不存在的目录
10003
未找到启动脚本,e.g bin/catalina.sh
10004
无法识别应用服务器类型
10005
命令行参数错误
10006
不重启安装,attach 进程失败
关于 java 不重启安装,卸载:由于不支持不重启升级,所以在不重启安装然后不重启卸载之后,想要再次安装需要重启服务器安装。
PHP 版本
错误码
分类说明
20001
fswatch 类库初始化失败,比如 rasp 安装目录没有写权限
20002
日志记录发生异常,比如日志文件没有写权限
20003
申请共享内存失败
20004
php.ini 配置不正确,比如缺少 openrasp.root_dir 配置
20005
JavaScript 插件加载错误
2. OpenRASP 无法拦截攻击
Java 服务器
首先,使用浏览器访问网站,检查服务器是否启动成功
若服务器没有启动,可检查启动日志,寻找堆栈信息。对于 tomcat 通常是 catalina.out
根据子章节的文档,检查 OpenRASP 是否安装成功
方法一: 访问网站,检查响应头里是否有 X-Protected-By: OpenRASP 字样?
方法二: 检查启动日志里是否有 OpenRASP Engine Initialized 字样
检测测试用例是否支持
对于官方测试用例,若无法拦截,则说明存在绕过或者bug
对于其他测试用例,请联系QQ群群主,我们会检查
PHP 服务器
首先,使用浏览器访问网站,检查服务器是否启动成功
若服务器没有启动,可检查 PHP/Apache/Nginx 错误日志
根据子章节的文章,检查 OpenRASP 扩展是否安装成功
方法一: 访问网站,检查响应头里是否有 X-Protected-By: OpenRASP 字样?
方法二: 创建内容为 <?php phpinfo(); ?> 的PHP文件并访问,检查页面中是否包含 openrasp 扩展信息?
检测测试用例是否支持
对于官方测试用例,若无法拦截,则说明存在绕过或者bug
对于其他测试用例,请联系QQ群群主,我们会检查
3. jnotify 无法释放
有的公司会定制应用启动脚本,比如 catalina.sh,当以root启动tomcat,他会自动切换到低权限用户,再继续启动
通常,你会看到如下的堆栈错误
Unable to extract jnotify library (rasp/libjnotify_64bit.so):
java.io.FileNotFoundException: /data/w/tomcat/rasp/libjnotify_64bit.so (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
这说明 OpenRASP 在释放 jnotify 动态链接库时出错(用来监控插件目录变更),错误原因是 Permission denied
所以,你可能需要调整下RASP目录权限,e.g chmod 777 -R rasp,然后再次启动 tomcat
4. Could not find or load main class com.baidu.rasp.App 错误
QQ群用户反馈,执行 RaspInstall 时报错,
$ java -jar RaspInstall.jar -install /usr/local/tomcat/
Error: Could not find or load main class com.baidu.rasp.App
经过排查,这是因为当前目录本身没有读取权限导致的,执行 chmod 777 $PWD 后解决。
5. APM 兼容性说明
如果你同时使用 OpenRASP 和 APM 产品,比如 pinpoint,那你需要增大 -XX:MaxPermSize 参数。否则运行一段时间后可能会出现 java.lang.OutOfMemoryError: PermGen space 错误,产生大量GC,最终导致服务器假死。
如果原先没有配置过此参数,我们建议你设置为 1024m;如果配置过,我们建议在原先基础上增加至少 512m。
另外,为了避免APM回滚钩子,请将我们的 -javaagent 参数放在前面。
6. JDK9 以上安装问题
由于JDK9以上版本的 Modularity System 属性,需要在手动安装后为服务器添加以下 Java 启动参数:
--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens=java.base/java.net=ALL-UNNAMED
7. 常见 v8 加载失败原因
7.1 java.io.IOException: Permission denied 异常
如果 /tmp 目录没有写权限,Java 会抛出 java.io.IOException: Permission denied 异常,e.g
java.lang.ExceptionInInitializerError
at org.scijava.nativelib.NativeLoader.<clinit>(NativeLoader.java:107)
at com.baidu.openrasp.v8.V8.Load(V8.java:25)
at com.baidu.openrasp.plugin.js.JS.Initialize(JS.java:44)
at com.baidu.openrasp.EngineBoot.start(EngineBoot.java:56)
at com.baidu.openrasp.ModuleContainer.start(ModuleContainer.java:78)
at com.baidu.openrasp.ModuleLoader.<init>(ModuleLoader.java:74)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:103)
at com.baidu.openrasp.Agent.init(Agent.java:93)
at com.baidu.openrasp.Agent.premain(Agent.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397)
Caused by: java.io.IOException: Permission denied
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createTempFile(File.java:2001)
at java.io.File.createTempFile(File.java:2047)
at org.scijava.nativelib.BaseJniExtractor.getTempDir(BaseJniExtractor.java:123)
at org.scijava.nativelib.WebappJniExtractor.<init>(WebappJniExtractor.java:69)
at org.scijava.nativelib.NativeLoader.<clinit>(NativeLoader.java:103)
... 14 more
此时请检查 /tmp 是否有写权限,以及是否有安全防护软件对 /tmp 目录增加了写保护。
7.2 libopenrasp_v8_java.so: failed to map segment from shared object: Permission denied
对于以下两种场景,
机器开启了SELinux,不允许Tomcat加载不符合策略的动态链接库
so释放目录没有执行权限,比如使用了 noexec 参数挂载
Java可能会出现无法加载so的情况,并提示无法创建区段映射:
java.lang.UnsatisfiedLinkError: /var/cache/tomcat/temp/nativelib-loader_4485267645656510327/Classloader.1658314629304.0/libopenrasp_v8_java.so: /var/cache/tomcat/temp/nativelib-loader_4485267645656510327/Classloader.1658314629304.0/libopenrasp_v8_java.so: failed to map segment from shared object: Permission denied
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
at java.lang.Runtime.load0(Runtime.java:810)
at java.lang.System.load(System.java:1088)
at com.baidu.openrasp.nativelib.NativeLibraryUtil.loadNativeLibrary(NativeLibraryUtil.java:340)
at com.baidu.openrasp.nativelib.NativeLoader.loadLibrary(NativeLoader.java:136)
at com.baidu.openrasp.v8.Loader.load(Loader.java:12)
at com.baidu.openrasp.EngineBoot.start(EngineBoot.java:57)
at com.baidu.openrasp.ModuleContainer.start(ModuleContainer.java:78)
at com.baidu.openrasp.ModuleLoader.<init>(ModuleLoader.java:89)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:117)
at com.baidu.openrasp.Agent.init(Agent.java:94)
at com.baidu.openrasp.Agent.premain(Agent.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
解决方法是关闭SELinux(如果开启),并去掉释放目录的noexec挂载(如果有)。如果不是上述两种情况,请加入QQ群联系我们排查。
7.3 java.io.IOException: Couldn&apos;t load library openrasp_v8_java
如果你在不支持的系统架构上运行OpenRASP(比如aarch64),可能会看到 Couldn&apos;t find resource 错误:
INFO: Couldn&apos;t find resource META-INF/lib/linux_arm64/libopenrasp_v8_java.so
[OpenRASP] Failed to load native library, please refer to https://rasp.baidu.com/doc/install/software.html#faq-v8-load for possible solutions.
java.io.IOException: Couldn&apos;t load library openrasp_v8_java
at com.baidu.openrasp.nativelib.NativeLoader.loadLibrary(NativeLoader.java:138)
at com.baidu.openrasp.v8.Loader.load(Loader.java:12)
at com.baidu.openrasp.EngineBoot.start(EngineBoot.java:57)
at com.baidu.openrasp.ModuleContainer.start(ModuleContainer.java:78)
at com.baidu.openrasp.ModuleLoader.<init>(ModuleLoader.java:89)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:118)
目前我们仅支持x64/x86_64两类架构,其他架构会逐步支持
7.4 java.lang.UnsatisfiedLinkError 错误
如果释放的 libopenrasp_v8_java.so 无法加载,Java 会抛出如下异常:
ava.io.IOException: Couldn&apos;t load library library openrasp_v8_java
at org.scijava.nativelib.NativeLoader.loadLibrary(NativeLoader.java:141)
at com.baidu.openrasp.v8.V8.Load(V8.java:25)
at com.baidu.openrasp.plugin.js.JS.Initialize(JS.java:44)
at com.baidu.openrasp.EngineBoot.start(EngineBoot.java:56)
at com.baidu.openrasp.ModuleContainer.start(ModuleContainer.java:78)
at com.baidu.openrasp.ModuleLoader.<init>(ModuleLoader.java:74)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:103)
at com.baidu.openrasp.Agent.init(Agent.java:93)
at com.baidu.openrasp.Agent.premain(Agent.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397)
Caused by: java.lang.UnsatisfiedLinkError: no openrasp_v8_java in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at org.scijava.nativelib.NativeLoader.loadLibrary(NativeLoader.java:136)
... 14 more
目前已知的情况有:
JDK是32位的,没有安装32位的glibc运行库。在CentOS系统下可以安装 glibc.i686 软件包。
JDK是64位的,且在 docker alpine 环境里无法启动。这个因为你没有装 libcurl libstdc++ 两个软件包。
如果是其他情况,请加入QQ技术讨论群联系我们。
8. libzip.so 崩溃问题
Java 在运行时可能会产生这个错误:
Stack: [0x00007f3951edb000,0x00007f3951fdc000], sp=0x00007f3951fda2d8, free space=1020k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x15a00b] __memmove_ssse3_back+0x6cb
C [libzip.so+0x12b33] ZIP_GetNextEntry+0x53
J 5497 java.util.zip.ZipFile.getNextEntry(JI)J (0 bytes) @ 0x00007f3a15da3c76 [0x00007f3a15da3bc0+0xb6]
J 5495 C1 java.util.zip.ZipFile$ZipEntryIterator.next()Ljava/util/zip/ZipEntry; (212 bytes) @ 0x00007f3a15daebec [0x00007f3a15dae940+0x2ac]
OpenRASP会定期读取jar包里的pom信息,获取应用所使用的类库和版本。这个是JDK自身的BUG,与OpenRASP无关。你可以通过如下几种方式解决问题:
方案1: 升级JDK版本
根据用户反馈,JDK 1.8 Update 261 没有这个问题。
方案2: 关掉jar包的内存映射
这可能因为Java在读取jar包时,对应的文件已经被修改,导致JVM崩溃,具体可以参考Oracle 官方博客 - Crashes in ZIP_GetEntry。
通过增加如下JVM启动参数可以解决问题,但可能带来额外的性能损耗:
-Dsun.zip.disableMemoryMapping=true
方案3: 关闭依赖库采集功能
参考 其他配置 文档,将 dependency_check.enable 设置为 false 即可。
另外,也可以在执行RaspInstall安装的时候增加 -nodep 参数,程序会自动将 dependency_check.enable 改为 false。
方案4: 避免多个Java进程使用相同的业务jar包
有用户反馈,他们的业务存在多个容器共用jar的问题,将jar打包到容器内部就没有这个错误了。