快速接入
OpenRASP 支持私有化部署,包含客户端与服务端两个组件。在接入之前,请先阅读 兼容性说明 文档,检查客户端是否支持你的应用服务。
第一步: 下载最新版本的安装包
常用镜像
文件说明
文件名 | 说明 |
---|---|
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扫描工具(可选)
如果你需要安装扫描工具,请参考 安装灰盒扫描工具 页面进行安装和配置。
其他常用链接
开发相关
常见问题
- 常见自动安装失败原因
- 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
- 若服务器没有启动,可检查启动日志,寻找堆栈信息。对于 tomcat 通常是
- 根据子章节的文档,检查 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't load library openrasp_v8_java
如果你在不支持的系统架构上运行OpenRASP(比如aarch64),可能会看到 Couldn't find resource
错误:
INFO: Couldn'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'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'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打包到容器内部就没有这个错误了。