# JBoss 服务器

### 自动化安装 <a href="#auto" id="auto"></a>

解压缩后，首先进入到解压后的目录中，e.g **rasp-20170721**

**如果你要开启远程管理**，请先参考 [管理后台 - 添加主机](https://github.com/baidu-security/openrasp-docs-old/blob/main/setup/panel.html#add-host) 文档，找到 `app_id/app_secret/backend_url` 三个关键参数，然后执行如下命令，

```
java -jar RaspInstall.jar -install <jboss_root> -backendurl http://XXX -appsecret XXX -appid XXX
```

**如果你只是运行单机版**，只需要指定 -install 参数，

```
java -jar RaspInstall.jar -install <jboss_root>
```

安装成功后，需要重启 JBoss 服务器生效。

**不重启安装**

以上方式安装成功之后需要重启服务器，如果在服务器启动的情况下，不重启安装 OpenRASP，需要在以上命令后面增加 -pid 参数指定运行的服务器进程 id，JDK6 - JDK8 样例命令如下，

```
# <server_pid> 为 jboss 进程 id
# $JAVA_HOME 为 jdk 根目录环境变量，如果未指定该环境变量，替换为 jdk 的完整根目录
java -Xbootclasspath/a:$JAVA_HOME/lib/tools.jar -jar RaspInstall.jar -install <jboss_root> -pid <server_pid>
```

\*\* 由于无法在运行时增加 JbossEAP 对 OpenRASP 的运行时依赖，所以无法支持 JbossEAP 的不重启安装 \*\*

\*\* jdk9 ～ jdk11 不支持不重启安装 \*\*

### 手动安装 - Linux <a href="#linux" id="linux"></a>

**1. 安装软件**

进入到 jboss 安装目录(绝对路径包含空格将导致启动失败)，e.g `/opt/jboss`

复制安装包内的 `rasp` 目录到当前目录，

```bash
cp -R ~/Downloads/rasp-20170721/rasp .
```

OpenRASP 需要在 rasp 目录下释放一些动态链接库，所以还需要修改 rasp 目录的权限，e.g

```
chmod 777 -R rasp
```

**2. 配置 JBoss**

> 如果是 JBoss 4-6 (非 EAP 版本)，

打开`bin/run.sh`, 找到任意以 `JAVA_OPTS=` 为起始的行，e.g

```bash
# Setup JBoss specific properties
JAVA_OPTS="-Dprogram.name=$PROGNAME $JAVA_OPTS"
```

在下面增加 `JAVA_OPTS="-javaagent:${JBOSS_HOME}/rasp/rasp.jar ${JAVA_OPTS}"`，最终效果如下:

```bash
# Setup JBoss specific properties
JAVA_OPTS="-Dprogram.name=$PROGNAME $JAVA_OPTS"
JAVA_OPTS="-javaagent:${JBOSS_HOME}/rasp/rasp.jar ${JAVA_OPTS}"
```

> 如果是 JBoss EAP，

**standalone模式**

打开`bin/standalone.sh`，找到`# Display our environment`处，在下面添加：

```bash
JAVA_OPTS="${JAVA_OPTS} -javaagent:${JBOSS_HOME}/rasp/rasp.jar"
```

**domain模式**

***server-group方式配置rasp***

如果按照server-group配置rasp，那么此group下面所有的服务器都会安装rasp，打开`domain/configuration/domain.xml`文件，找到`<server-groups>`标签，在需要安装rasp的server-group中找到`<jvm>`标签添加如下配置：

```bash
<jvm-options>
   <option value="-javaagent:<jboss_root>/rasp/rasp.jar"/>
</jvm-options>
```

***server方式配置rasp***

如果只对某个server-group的特定的server安装rasp，打开`domain/configuration/host.xml`文件，找到`<servers>`标签，在需要安装rasp的server中添加如下配置：

```bash
<jvm name="default">
    <jvm-options>
   		<option value="-javaagent:<jboss_root>/rasp/rasp.jar"/>
	</jvm-options>
</jvm>
```

**3. 开启远程管理**

配置方法同 [Tomcat 开启远程管理](https://github.com/baidu-security/openrasp-docs-old/blob/main/install/manual/tomcat.html#linux-rmm)，不再赘述。

**4. 验证安装是否成功**

重启 JBoss 服务器，观察启动日志中是否出现 `OpenRASP Engine Initialized`字段，出现则说明安装成功

### 手动安装 - Windows <a href="#windows" id="windows"></a>

**1. 安装软件**

进入到 jboss 安装目录，e.g `D:\\jboss`

复制安装包内的 `rasp` 目录到当前目录

**2. 配置 JBoss**

> 如果使用Jboss 4～6 (非 EAP 版本)，则打开 `bin\run.bat`;

打开脚本后，找到任意以 `set JAVA_OPTS` 为起始的行，如：

```bat
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
```

在下面增加 `set JAVA_OPTS=-javaagent:%JBOSS_HOME%\rasp\rasp.jar %JAVA_OPTS%`：

```bat
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME%
set JAVA_OPTS=-javaagent:%JBOSS_HOME%\rasp\rasp.jar %JAVA_OPTS%
```

> 如果使用Jboss EAP,

**standalone模式**

打开 `bin\standalone.bat` 找到`第一次`出现`rem Setup JBoss specific properties`处，在下面添加：

```bash
set "JAVA_OPTS=%JAVA_OPTS% -javaagent:%JBOSS_HOME%\rasp\rasp.jar"
```

**domain模式**

方法同 Linux 版本

**3. 开启远程管理**

配置方法同 [Tomcat 开启远程管理](https://github.com/baidu-security/openrasp-docs-old/blob/main/install/manual/tomcat.html#linux-rmm)，不再赘述。

**4. 验证安装是否成功**

重启 JBoss 服务器，观察启动日志(默认输出到终端)中是否出现 `OpenRASP Engine Initialized`字段，出现则说明安装成功；或者访问一下服务器，检查是否存在 `X-Protected-By: OpenRASP` 响应头，存在即表示安装成功。

### 已知问题 <a href="#faq" id="faq"></a>

**1. java.io.ObjectInputStream 错误**

这个并不是 OpenRASP 的问题，请尝试更新JDK到最新版本

参考资料

* [The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files](https://stackoverflow.com/questions/36963248/the-type-java-io-objectinputstream-cannot-be-resolved-it-is-indirectly-referenc)

**2. JDK 9 以上版本兼容性问题**

请参考 [JDK9 以上安装问题](https://github.com/baidu-security/openrasp-docs-old/blob/main/install/software.html#faq-jdk9) 手动修改启动参数。我们会尽快修改 RaspInstall 程序，并自动添加这个配置。

**3. org.jboss.logmanager.PropertyConfigurator cannot be cast to org.jboss.as.logging.logmanager.ConfigurationPersistence 异常**

在JBoss EAP 6.1.0上安装OpenRASP后，JBoss可能会无法启动并打印如下错误:

```
14:27:19,691 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 11) JBAS014612: Operation ("add") failed - address: ([
    ("subsystem" => "logging"),
    ("console-handler" => "CONSOLE")
]): java.lang.ClassCastException: org.jboss.logmanager.PropertyConfigurator cannot be cast to org.jboss.as.logging.logmanager.ConfigurationPersistence
        at org.jboss.as.logging.logmanager.ConfigurationPersistence.getOrCreateConfigurationPersistence(ConfigurationPersistence.java:93)
        at org.jboss.as.logging.logmanager.ConfigurationPersistence.getOrCreateConfigurationPersistence(ConfigurationPersistence.java:81)
        at org.jboss.as.logging.LoggingOperations$LoggingOperationStepHandler.execute(LoggingOperations.java:154)
        at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:440) [jboss-as-controller-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at org.jboss.as.controller.AbstractOperationContext.doCompleteStep(AbstractOperationContext.java:322) [jboss-as-controller-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at org.jboss.as.controller.AbstractOperationContext.completeStepInternal(AbstractOperationContext.java:229) [jboss-as-controller-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:224) [jboss-as-controller-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at org.jboss.as.controller.ParallelBootOperationStepHandler$ParallelBootTask.run(ParallelBootOperationStepHandler.java:334) [jboss-as-controller-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_79]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_79]
        at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79]
        at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.0.Final-redhat-1.jar:2.1.0.Final-redhat-1]
```

[根据Redhat的描述](https://bugzilla.redhat.com/show_bug.cgi?id=969530)，有两种解决方法:

* 升级到 JBoss EAP 6.1.1
* 手动修正 JBOSS\_MODULES\_SYSTEM\_PKGS 配置，暴露相关的Jar给javaagent
