快速接入

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扫描工具(可选)

如果你需要安装扫描工具,请参考 安装灰盒扫描工具 页面进行安装和配置。

其他常用链接

开发相关

常见问题

  1. 常见自动安装失败原因
  2. OpenRASP 无法拦截攻击
  3. jnotify 无法释放
  4. Could not find or load main class com.baidu.rasp.App 错误
  5. APM 兼容性说明
  6. JDK9 以上安装问题
  7. 常见 v8 加载失败原因
  8. 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 服务器

  1. 首先,使用浏览器访问网站,检查服务器是否启动成功
    • 若服务器没有启动,可检查启动日志,寻找堆栈信息。对于 tomcat 通常是 catalina.out
  2. 根据子章节的文档,检查 OpenRASP 是否安装成功
    • 方法一: 访问网站,检查响应头里是否有 X-Protected-By: OpenRASP 字样?
    • 方法二: 检查启动日志里是否有 OpenRASP Engine Initialized 字样
  3. 检测测试用例是否支持
    • 对于官方测试用例,若无法拦截,则说明存在绕过或者bug
    • 对于其他测试用例,请联系QQ群群主,我们会检查

PHP 服务器

  1. 首先,使用浏览器访问网站,检查服务器是否启动成功
    • 若服务器没有启动,可检查 PHP/Apache/Nginx 错误日志
  2. 根据子章节的文章,检查 OpenRASP 扩展是否安装成功
    • 方法一: 访问网站,检查响应头里是否有 X-Protected-By: OpenRASP 字样?
    • 方法二: 创建内容为 <?php phpinfo(); ?> 的PHP文件并访问,检查页面中是否包含 openrasp 扩展信息?
  3. 检测测试用例是否支持
    • 对于官方测试用例,若无法拦截,则说明存在绕过或者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 兼容性说明

如果你同时使用 OpenRASPAPM 产品,比如 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

对于以下两种场景,

  1. 机器开启了SELinux,不允许Tomcat加载不符合策略的动态链接库
  2. 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

目前已知的情况有:

  1. JDK是32位的,没有安装32位的glibc运行库。在CentOS系统下可以安装 glibc.i686 软件包。
  2. 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打包到容器内部就没有这个错误了。