OpenRASP Agent 源码导入教程

背景

OpenRASP 是百度安全推出的一款免费、开源的应用运行时自我保护产品,近期需要了解源码,对其进行二次开发,所以导入源码,分析了一下 Java Agent 端的工程,本文即为整理 OpenRASP Agent 源码导入的过程。

Agent 基本结构

百度开源的 OpenRASP 项目地址为 openrasp ,在 windows 系统下,下载该项目到本地。前面已经安装并验证过官方的一些案例了,从安装包的目录结构中,我们可以知道 Agent 端的几个模块:
在这里插入图片描述

导入 Agent

这里主要介绍 Java agent 的源码导入过程,定位到源码的 openrasp-master\agent\java 目录,将该目录下的 pom.xml 导入到 IDEA 中,它被 IDEA 识别为两个子模块:
在这里插入图片描述
rasp-boot 模块很简单,就是一个 Java Agent 的定义,打包文件名为 rasp.jar ,它将应用的启动引向 rasp-engine.jar。

rasp-engine 是核心引擎,真正提供应用的自我防护功能,其 finalName 为 rasp-engine.jar。刚导入该模块时,IDEA 会报错,因为它依赖另一个工程:

<dependency>
   <groupId>com.baidu.openrasp</groupId>
   <artifactId>v8</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

v8 是 Google 的 js 引擎,OpenRASP 使用了该引擎。接下来就需要编译这个 v8 模块,得到 v8-1.0-SNAPSHOT.jar 包,将其安装到本地仓库,以解决该依赖报错问题。

编译依赖模块 v8

这个模块有一些 native 实现,所以需要编译成 .so【Linux 环境】 或者 dll【Windows 环境】 文件,将其拷贝到源码的 resource 目录。Linux 上编译 openrasp-v8 模块,官方有详细的操作过程 编译 openrasp-v8 基础库

官方的流程没有问题,但是由于是用公司测试部服务器,不想在上面安装 git ,想当然地在本地用 git 下载的源码进行编译,以为只是普通的下载而已。结果饶了一个弯路,中了 Linux 下的 git clone 命令和 windows 下 git clone 差异的坑,完全按装官方的步骤进行编译,其实是很容易的。

第一步,环境准备

  • gcc 5.3.1
  • cmake-3.15.0
  • git
  • apache-maven-3.5.3

如果没有这些命令,先用 yum install 安装,gcc 安装过程为:

  • yum install -y centos-release-scl
  • yum install -y devtoolset-4-gcc-c++
  • scl enable devtoolset-4 bash(进入编译环境)

第二步,下载源码

git clone https://github.com/baidu/openrasp.git

第三步,进入仓库根目录,执行如下命令

进入 openrasp 仓库目录,顺次执行以下命令集即可。

# 更新 git submodule,openrasp-v8 模块中是空的,需要执行该步骤得到最新的源码
git submodule update --init

# 编译 openrasp-v8,cmake 的最后是两个点,必须完全拷贝
mkdir -p openrasp-v8/build64 && cd openrasp-v8/build64
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_LANGUAGES=java ..
make

# 复制动态链接库到 resources 目录
mkdir -p ../java/src/main/resources/natives/linux_64 && cp java/libopenrasp_v8_java.so $_

#打包,得到 v8-1.0-SNAPSHOT.jar
mvn package -Dmaven.test.skip=true

最后一步不能执行官方的 mvn install ,原因有二:

  1. v8 模块的测试用例包含中国菜刀门的恶意代码,所以下载时会被识别为病毒,未被下载,所以无法通过测试。
  2. mvn 仓库配置的是公司私服,无法安装该模块,执行命令会报异常:
    在这里插入图片描述我们编译该模块就是为了得到 v8-1.0-SNAPSHOT.jar,所以直接用 mvn package 打包,且跳过测试即可。
    在这里插入图片描述

本地仓库安装 v8

定位到 Linux 服务器上 v8 项目 target 目录下,将 v8-1.0-SNAPSHOT.jar 下载到 windows 本地,然后执行本地安装命令:

mvn install:install-file -DgroupId=com.baidu.openrasp -DartifactId=v8 -Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=E:/v8-1.0-SNAPSHOT.jar

再在 IDEA 中 reimport project ,刷新后,rasp-engine 中的依赖错误消失。现在就可以对源码进行修改,做二次开发了。

二次开发日志入库

只使用 agent 、不安装后台管理系统的情况下,希望将 agent 端的告警数据入库,有两种方式,一种是解析它的 alarm.log 日志文件,另一种是修改源码:告警发生时,不仅写日志、还要写入数据库。

如何定位到日志写入的地方呢?

我们已经知道日志文件名为 alarm.log,所以直接在项目中全局查找 “alarm.log ”字符串,找到了定义 Logger 的地方:
在这里插入图片描述
这个 AppenderMappedLogger 类定义了 Logger 名称和 appender 日志文件的映射关系,初始 logger4j 时会据此来设置日志的 file appender 配置:
在这里插入图片描述
接着,查找这个 ALARM 日志实例引用的地方,最后定位到 Check 类中的一个日志对象

Logger ATTACK_ALARM_LOGGER = Logger.getLogger(AbstractChecker.class.getPackage().getName() + ".alarm");

这个 logger 的名称全称就是 com.baidu.openrasp.plugin.checker.alarm ,找到它被调用的地方,就可以在此处添加写入数据库的逻辑了。
在这里插入图片描述
这是写告警日志的地方,跟踪这个方法的调用过程,最终定位到请求阻断的逻辑:
在这里插入图片描述
至此,整个流程也就通畅了。这段代码说明,如果 check 结果为真,则记录一条告警日志,这个 EventInfo 类的 toString 方法会将对象序列化为 JSON 字符串,然后输入到日志文件中。

复盘编译失败的原因

第一,gcc 版本问题。
在这里插入图片描述
目标服务器上已经安装过 gcc ,版本过低,则脚本执行时会报权限错误。
在这里插入图片描述
第二,git clone 问题。

本地 Windows 下用 git clone 的项目,然后执行 git submodule 后得到的源码上传服务器后无法成功编译,根源是 clone 操作不完整,make 命令执行的头文件中缺少 v8 平台的文件。Linux 上 git clone 会有平台文件,而 windows 下相同操作却没有,最终导致 cmake 操作报错。
在这里插入图片描述
其实没有必要自己编译 so 文件,官方给出了编译好的库,只要拷贝到 resources 目录,执行 v8 项目打包即可,这里将 v8-1.0-SNAPSHOT.jar 包上传到资源库中了,可以直接下载后使用。

附录

  1. v8 库
  2. v8-1.0-SNAPSHOT.jar
发布了234 篇原创文章 · 获赞 494 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/wojiushiwo945you/article/details/101514152