接入Java应用

通过在Java应用中集成RASP(Runtime Application Self-Protection)探针,应用防护能够实时监测并抵御恶意行为和安全威胁,确保应用持续稳定运行。本文介绍首次将Java应用接入应用防护的具体操作步骤。

使用限制

支持范围

应用防护仅支持防护满足以下条件的Java进程,即仅支持在同时满足以下条件的业务进程中安装RASP探针。

  • JDK支持范围:支持JDK 6及以上版本,不支持JDK 1314,不支持JDK 8中的1.8.0_40及以下版本。

  • 中间件支持范围:对中间件类型和版本无特定要求,包括Tomcat、SpringBoot、Jboss、WildFly、Jetty、Resin、Weblogic、Websphere、Liberty、Netty、GlassFish、国产中间件等。

  • 操作系统支持:Linux(64位)、Windows(64位)。

自动接入资源占用阈值说明

在主机、容器或JVM资源使用量超过一定阈值时,为了保证应用防护功能的正常运行,自动接入方式会暂停接入RASP探针,直到降到阈值以下才会继续安装RASP探针;手动接入方式无此限制。停止安装探针的具体阈值如下:

  • 主机或容器CPU占用超过98%,或剩余内存不足200 MB。

  • JVM堆内存剩余不足150 MB,元数据空间不足5 MB。

接入说明

接入流程

image

接入方式说明

RASP支持自动接入和手动接入方式,您可以根据下表的说明选择合适的接入方式。

接入方式

说明

应用场景

自动接入

以服务器为单位进行接入,服务器接入后,在应用程序运行时,应用防护功能会使用JVM Attach能力自动识别并接入服务器中的Java进程(包括容器环境),将应用防护功能集成到应用程序中。

该方式可以在应用程序运行时动态地加载和卸载应用防护功能,无需重启应用进程,可以保障业务的连续性。

未自动接入过其他应用分组的服务器可以选择自动接入方式。

说明

如果您服务器中的部分应用进程已自动接入指定应用分组,现需要将该主机中的应用进程重新接入另一个应用分组,您可以先为该服务器关闭应用防护,即从当前应用分组移除该服务器,再在新的应用分组开启自动接入。

手动接入

以应用进程为单位进行接入,需手动部署并重启应用。

  • 您的Java应用使用的框架为WebSphere时,需要使用手动接入方式,不支持自动接入。

  • 如果您主机中的部分应用进程已自动接入指定应用分组,需要将该主机中未接入防护的应用进程接入其他应用分组。

  • 如果需要将同一服务器不同应用接入多个应用分组时,您需要使用手动接入方式。

前提条件

  • 需接入应用所在服务器的云安全中心客户端为在线状态。

    您可以在资产中心 > 主机资产页面的服务器页签通过服务器客户端列图标的状态判断客户端是否在线,image..png图标表示在线。如果客户端离线,请参考客户端离线排查处理。

  • 如果是以RAM用户身份使用应用防护功能,请确保RAM用户拥有AliyunYundunWAFFullAccessAliyunYundunSASFullAccess权限策略。授权的具体操作,请参见RAM用户授权

1. 创建应用分组

  1. 登录云安全中心控制台

  2. 在左侧导航栏,选择防护配置 > 应用防护。在控制台左上角,选择需防护资产所在的区域:中国全球(不含中国)

  3. 应用配置页签,单击新建应用分组

  4. 新建应用分组向导页面,输入要新建的应用分组名称,选择应用语言(Java)和备注信息,然后单击下一步

    建议您根据需要防护的Web业务进程设置应用分组名称,应用分组名称不可重复。应用语言选择后不支持修改。

    完成该操作后,云安全中心会创建一个应用分组。

2. 自动接入或手动接入

自动接入

注意事项

  • 建议首次自动接入时避开业务高峰期和网关型业务进程,分批次灰度执行并观察业务监控指标。自动接入过程中RASP会对应用进程进行埋点(即插入监控或防护代码),该过程中产生的退优化现象可能会有半分钟的CPU占用升高,平均影响10~20s,大型应用的影响小概率为数分钟,接入完成后自动恢复正常。

  • 一台主机仅支持自动接入到一个应用分组中,不支持同时自动接入多个应用分组。自动接入服务器时,仅支持选择未自动接入过其他应用分组且操作系统为64位的主机。

  • 已通过手动接入方式接入的主机,可以开启自动接入。当您卸载了手动接入的RASP探针后,应用防护会为您重新自动接入该应用进程。

操作步骤

  1. (可选)在自动/手动接入应用防护向导页面自动接入页签,单击接入黑名单接入白名单,设置需要自动接入的进程。

    通过设置黑名单或白名单,您可以定义自动接入的进程范围。具体操作,请参见新增白名单或黑名单

  2. 自动/手动接入应用防护向导页面自动接入页签,单击选择资产接入应用防护

  3. 选择资产面板,选择需要接入的资产后,单击确定

    执行该步骤后,应用防护功能会自动识别并接入所选主机上的Java服务进程(包括容器环境),无需重启进程。单次最多支持选择50台服务器。

    根据您的网络环境不同接入防护的过程可能会持续约10分钟。如果您的主机中有多个运行状态的Java进程,云安全中心会同时接入满足接入规则的进程。

  4. 查看应用进程接入状态。

    您可以在应用防护接入状态列查看应用实例的接入状态。以下是应用防护接入状态的说明:

    • 未连接:表示该服务器未开启应用防护开关。

    • 接入失败:表示该服务器所有支持防护的应用都接入失败。

    • 部分接入:表示该服务器支持防护的应用部分接入成功,部分接入失败。

    • 全部接入:表示该服务器支持防护的Java应用均已接入应用防护,或者该服务器上无可接入的进程。

      说明

      应用防护接入状态显示为全部接入时,如果服务器上不存在可接入的进程,或者所属业务进程不在支持范围内,此时接入详情列表为空。如果后续该服务器上出现可接入的进程可自动接入应用防护。

    操作列单击详情,可以查看已接入的Java进程状态。

    说明

    如果您已为应用分组配置接入规则,命中接入黑名单的规则和未命中接入白名单规则的进程会被跳过接入。

    接入详情

手动接入

您可以参考下述步骤手动将主机或容器中的Java应用接入应用防护,然后单击下一步。关于如何选择手动接入容器方式的说明如下:

  • 手动接入容器(一键推送):您已明确需要接入的服务器和应用范围时,可以直接使用该方式,完成安装包的推送。

  • 手动接入容器(自定义下载安装):如果需要其他人员协助安装RASP探针时,您可以使用该方式下载安装包,并将安装包分发给其他人员进行安装部署。

手动接入主机

  1. 手动接入主机接入指南子页签,单击一键推送

  2. 推送RASP探针对话框,选择需推送探针的服务器,并单击确定

  3. 根据应用运行环境类型参考控制台或下表中的说明在应用服务器中添加JVM参数。

    参考下表进行操作时,您需要使用控制台主机接入指南页签展示的应用ID替换下表中的{appId}。应用ID的位置如下图所示。应用ID位置

    运行环境

    参数配置说明

    Tomcat(Linux)

    在<Tomcat安装目录>/bin/setenv.sh文件中添加以下内容。

    export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar"

    如果您的<Tomcat安装目录>/bin/目录下没有setenv.sh配置文件,请在<Tomcat安装目录>/bin/目录下创建该文件。

    Tomcat(Windows)

    在<Tomcat安装目录>\bin\setenv.bat文件中添加以下内容。

    set CATALINA_OPTS=%CATALINA_OPTS% "-javaagent:C:\Program Files (x86)\Alibaba\Aegis\rasp\apps\{appId}\rasp.jar" 

    如果您的<Tomcat安装目录>\bin\目录下没有setenv.bat配置文件,请在<Tomcat安装目录>\bin\下创建该文件。

    Jetty

    在{JETTY_HOME}/start.ini配置文件中添加以下配置。

    --exec -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar

    Spring Boot

    启动Spring Boot进程时,在启动命令后加上-javaagent参数。

    java -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar

    例如,您在启动Spring Boot进程时修改前的命令为:

    java -jar app.jar

    需要安装RASP探针时启动Spring Boot进程执行的命令为:

    java -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar -jar app.jar
    重要

    -javaagent参数应始终放在-jar参数之前。

    JBossWildFly

    • Standalone模式

      打开<Jboss安装目录>/bin/standalone.sh,在# Display our environment下面添加以下内容:

      JAVA_OPTS="${JAVA_OPTS} -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar"
    • Domain模式

      打开<Jboss安装目录>/domain/configuration/domain.xml文件,找到<server-groups>标签,在需要安装RASP探针的<server-group>标签中找到<jvm>标签并添加以下内容:

      <jvm-options>
         <option value="-javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar"/>
      </jvm-options>

    Liberty

    在<Liberty安装目录>/${server.config.dir}路径下(默认路径为:/opt/ibm/wlp/usr/servers/defaultServer/jvm.options),创建或修改jvm.options文件 ,在文件中添加以下内容:

    -javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar

    Resin

    • Resin3

      在<Resin安装目录>/conf/resin.conf路径下,找到 <server-default> 标签下的 <jvm-arg>标签,在下面添加以下内容:

      <jvm-arg>-javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar</jvm-arg>
    • Resin4

      在<Resin安装目录>/conf/cluster-default.xml路径下,找到<server-default>标签下的<jvm-arg-line>标签,在下面添加以下内容:

      <jvm-arg>-javaagent:/usr/local/aegis/rasp/apps/{appId}/rasp.jar</jvm-arg>
  4. 在本地重启需接入的应用。

    应用重启后RASP防护可立即生效。您可以在应用配置页面,查看该应用分组下接入实例列表。

手动接入容器(一键推送安装)

  1. 手动接入页签的容器接入指南子页签,单击一键推送

    您也可以在推送记录页签,单击推送RASP探针,为应用所在的主机或容器推送并安装RASP探针。

  2. 推送RASP探针对话框,选择需推送探针的服务器,并单击确定

  3. 启动RASP探针。

    • 方法一:写入Dockerfile方式

      1. 执行下述命令进入Dockerfile所在目录,并创建rasp目录。

        cd <Dockerfile所在目录>
        mkdir rasp
      2. 执行下述命令将推送到服务器上的RASP文件拷贝到新创建的rasp目录下。

        您可以在云安全中心控制台容器接入指南页签下,获取应用分组ID的值。

        cp -r /usr/local/aegis/rasp/apps/<应用分组ID>/* ./rasp
      3. 修改Dockerfile文件,将下载好的 rasp 安装包打包到容器镜像中。Dockerfile文件需要添加的内容如下。

        COPY rasp /rasp/
        重要

        您需要赋予指定用户读取和执行/rasp/目录以及目录下文件的权限。

      4. 通过Dockerfile 修改JVM启动参数,添加-javaagent:/rasp/rasp.jar。

        您需要使用容器接入指南页签展示的Dmanager.key值替换下表中的{manager.key}

        运行环境

        参数配置说明

        SpringBoot

        在镜像打包时安装RASP探针,您需要在Dockerfile上修改启动参数。启动应用的命令修改如下:

        修改前:

        CMD ["java","-jar","/app.jar"]

        修改后:

        CMD ["java","-javaagent:/rasp/rasp.jar","-Dmanager.key={manager.key}","-jar","/app.jar"]

        Tomcat

        • 在镜像打包时安装RASP探针,您需要在Dockerfile中添加以下内容。

          ENV JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}"
        • 在容器启动时安装RASP探针,您需要在启动时添加以下参数。

          docker --env JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}"

        例如,您的容器启动命令为docker -itd --name=test -P 镜像名,您需要在启动容器时安装RASP探针,则执行的命令需要修改为docker -itd --env JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}" --name=test -P 镜像名

        Weblogic

      5. 重新生成镜像,并启动容器。

    • 方法二:数据卷挂载方式

      1. 执行下述命令在创建容器时将服务器上的rasp目录挂载到容器指定目录。

        docker run -itd --privileged=true -v /usr/local/aegis/rasp/apps/<应用分组ID>:/rasp/ 镜像ID
      2. 执行下述命令进入容器。

        docker exec -it <容器ID> /bin/bash
      3. 在应用服务器的启动脚本中添加以下JVM参数以启动RASP探针。

        您需要参考下述参数结合自己的业务环境进行配置。您需要使用容器接入指南页签展示的Dmanager.key值替换下述{manager.key}

        -javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}

手动接入容器(自定义下载安装)

  1. 手动接入页签的容器接入指南子页签,在下载安装RASP探针下方的下拉列表中选择自定义下载安装

    您也可以在推送记录页签,单击推送RASP探针,为应用所在的主机或容器推送并安装RASP探针。

    image

  2. 在下拉列表中,根据您需要安装RASP探针的服务器是否通过代理接入云安全中心,选择不接入代理自建代理集群

    选择自建代理集群后,您需要选择服务器接入的代理集群。关于代理接入的更多信息,请参见代理接入

  3. 单击RASP安装包右侧的下载,下载RASP安装包。

  4. 启动RASP探针。

    • 方法一:写入Dockerfile方式

      1. 执行下述命令进入Dockerfile所在目录。

        cd <Dockerfile所在目录>
      2. 将下载的RASP安装包上传到Dockerfile所在目录下,并解压RASP安装包到该目录。

        unzip <安装包名称> -d .
        说明

        安装包解压完成后会直接生成一个名称为rasp的目录。

      3. 修改Dockerfile文件,将下载好的 rasp 安装包打包到容器镜像中。Dockerfile文件需要添加的内容如下。

        COPY rasp /rasp/
        重要

        您需要赋予指定用户读取和执行/rasp/目录以及目录下文件的权限。

      4. 通过Dockerfile 修改JVM启动参数,添加-javaagent:/rasp/rasp.jar。

        您需要使用容器接入指南页签展示的Dmanager.key值替换下表中的{manager.key}

        运行环境

        参数配置说明

        SpringBoot

        在镜像打包时安装RASP探针,您需要在Dockerfile上修改启动参数。启动应用的命令修改如下:

        修改前:

        CMD ["java","-jar","/app.jar"]

        修改后:

        CMD ["java","-javaagent:/rasp/rasp.jar","-Dmanager.key={manager.key}","-jar","/app.jar"]

        Tomcat

        • 在镜像打包时安装RASP探针,您需要在Dockerfile中添加以下内容。

          ENV JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}"
        • 在容器启动时安装RASP探针,您需要在启动时添加以下参数。

          docker --env JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}"

        例如,您的容器启动命令为docker -itd --name=test -P 镜像名,您需要在启动容器时安装RASP探针,则执行的命令需要修改为docker -itd --env JAVA_OPTS="-javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}" --name=test -P 镜像名

        Weblogic

      5. 重新生成镜像,并启动容器。

    • 方法二:数据卷挂载方式

      1. 将下载的RASP安装包上传到服务器指定的目录下,并执行解压操作。

        您需要根据具体环境替换user.path为正确的路径。

        unzip  zhh-php1-China.zip -d /<user.path>/
      2. 执行下述命令在创建容器时将服务器上的rasp目录挂载到容器指定目录。

        docker run -itd  -v /<user.path>/rasp:/rasp/ 镜像id 
      3. 执行下述命令进入容器。

        docker exec -it <容器ID> /bin/bash
      4. 在应用服务器的启动脚本中添加以下JVM参数以启动RASP探针。

        您需要参考下述参数结合自己的业务环境进行配置。您需要使用容器接入指南页签展示的Dmanager.key值替换下述{manager.key}

        -javaagent:/rasp/rasp.jar -Dmanager.key={manager.key}

3. 设置防护策略

观察告警无误设置“防护”模式向导页面,设置防护策略,单击确定

重要

默认防护模式为监控模式,建议您先使用监控模式2~5天,如果在此期间未出现误告警您可以将防护模式修改为防护。如果出现误告警,您可以通过配置白名单规则,屏蔽产生误拦截的检测类型。具体操作,请参见将告警加入白名单

分类

配置项

说明

防护策略

应用分组名称

展示应用分组的名称,在此处不支持修改。

防护状态

选择是否为当前应用分组开启或关闭防护,默认开启。关闭后应用防护不检测也不阻断任何攻击行为。

防护模式

选择应用分组的防护模式,可选项:

  • 监控:只监控攻击行为,不阻断攻击行为。检测到攻击行为时,会产生处理方式为监控的告警。

  • 防护:监控并阻断攻击行为,同时也会对应用实例的一些高危操作进行监控。阻断攻击行为的同时,会产生处理方式为阻断的告警。

防护策略组

默认的防护策略组是日常运行组。您可以在下拉列表中选择其他防护策略组。防护策略组的更多信息,请参见防护策略管理

检测类型

展示已选择的防护策略组支持的检测类型。

检测策略

弱点检测

选择是否为当前应用分组开启弱点检测。更多信息,请参见发现应用弱点

说明

PHP应用不支持该功能。

内存马检测

选择是否为当前应用分组开启内存马检测。更多信息,请参见内存马防御

说明

PHP应用不支持该功能。

常用配置

检测超时时间

攻击检测的最大时间,输入范围为1~60,000毫秒,默认设置为300毫秒。若攻击检测超过设置的时间,即使未完成检测逻辑也会继续执行原始业务逻辑。如无特殊原因,建议使用默认值。

IP判断方式

  • 选择默认,系统会根据常规的源IP header值按照X-Real-IP、True-Client-IP、X-Forwarded-For的先后次序获取源IP,即当未获取到X-Real-IP的值时,会获取True-Client-IP的值作为源IP;如果X-Real-IP、True-Client-IP均未获取到,则获取X-Forwarded-For的值作为源IP。

  • 选择取自定义header的值,系统会优先根据自定义的header值获取源IP,设置多个header值时,按先后顺序依次尝试获取源IP。如果所有自定义header值未命中,则默认规则生效。

    说明

    最多支持设置5个自定义header值。

运行时熔断配置

开启该功能后,当服务器或进程的资源占用率超过CPU或内存任一熔断值时,RASP的实时防护、内存马检测和弱点检测能力将自动停止。当服务器或进程资源占用率低于设置的所有熔断值时,RASP的防护能力会自动恢复。

该功能可以保障业务在高峰情况下稳定运行,默认为关闭状态。如果您的应用为对性能敏感的计算型业务,可以开启该功能。配置说明如下:

  • 主机或容器环境CPU占比超过:可设置范围10%~99%,推荐配置95%。

  • JVM堆内存占比超过:可设置范围5%~99%,推荐配置98%。

  • JVM堆剩余内存小于:可设置范围10~99999 MB,推荐配置100 MB。

重要
  • 0.8.8及以上版本的RASP探针支持熔断功能。0.8.8以下版本的探针可通过重启应用进程自动升级到最新版。

  • 防护能力熔断时,处于防护熔断状态的实例仍占用授权数。

4. 验证应用接入情况

如果应用进程的PID展示在应用分组的已授权实例列表中,则说明该应用已正常接入应用防护。参考以下步骤可查看已接入的应用列表。

  1. 应用防护页面的应用配置页签,单击目标应用分组已授权进程列下的数字。

  2. 在进程详情面板,查看已接入的应用列表。

    如果目标服务器的应用进程PID在应用列表中,则表示该应用已成功接入应用防护。

    image.png

后续步骤

  1. 您可以随时根据业务需要调整应用分组的自动接入规则,定义哪些应用会被接入应用防护。具体操作,请参见接入规则管理

  2. 您可以根据业务需要调整应用分组的防护模式、防护策略组等配置。如果出现误告警,您可以配置防护白名单,以免后续再产生类似告警。更多信息,请参见防护策略管理

  3. 攻击告警处置

常见问题

服务器开启自动接入后,新增的Java应用会自动防护吗?后续增减应用时是否会重启进程呢?

为服务器开启自动接入后,新增的Java应用会自动接入防护。应用防护功能会使用JVM Attach能力自动识别并接入服务器中的存在监听端口的Java进程(包括容器环境),将应用防护功能集成到应用程序中。该方式可以在应用程序运行时动态地加载和卸载应用防护功能,无需重启应用进程。

服务器开启自动接入后,应用进程停止时,是否会影响其他应用的正常业务?

不影响。应用防护功能以进程为基本单位进行接入并提供防护能力,进程之间的防护是相互独立的。

应用防护是否需要占用监听端口?

不需要。应用防护通过Hook技术实时监测应用在运行时与其他系统的交互过程,实现攻击检测和防御,不会占用监听端口。

手动接入容器环境Java应用时配置的manager.key有什么作用?可以不配置吗?

manager.key填写到启动命令中的主要目的是实现资产关联,是必须要配置的。

手动接入容器应用时,必须要配置manager.key;手动接入主机环境Java应用时无需配置,服务器中的应用可以直接关联到对应资产。