PHP应用接入应用防护

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

支持范围

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

  • PHP版本支持范围: 7.0 ~ 8.3 版本,同时支持线程安全(ts,Thread Safe)和非线程安全(nts,Non-Thread Safe)版本。

  • SAPI(Server Application Programming Interface)支持范围:PHP-FPM(FastCGI Process Manager)和Apache PHP模块。

  • 操作系统支持:仅支持Linux x86架构(64位)。

  • 系统库依赖:glibc 2.14 及以上、libstdc++ 3.4.19 及以上。

接入说明

接入流程

image

接入方式说明

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

接入方式

说明

应用场景

自动接入

以服务器为单位进行接入,应用防护功能会自动识别并接入防护主机上的PHP服务进程(包括容器环境),无需重启进程。

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

  • PHP进程使用的是php-fpm部署模式。

说明

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

手动接入

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

  • 您的PHP应用在Apache服务器上运行,依赖mod_php模块解析PHP脚本。

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

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

前提条件

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

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

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

1. 新建应用分组

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

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

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

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

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

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

2. 自动接入或手动接入

自动接入

注意事项

  • 建议首次自动接入时避开业务高峰期和网关型业务进程,分批次灰度执行并观察业务监控指标。

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

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

操作步骤

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

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

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

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

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

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

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

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

    • 未接入:表示当前服务器RASP安装成功,暂无符合接入规则的进程。

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

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

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

      说明

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

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

    说明

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

手动接入

您可以参考下述步骤手动将主机或容器中的PHP应用接入应用防护。关于如何选择一键下推送安装或自定义下载安装的说明如下:

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

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

接入主机(一键推送安装)

  1. 自动/手动接入应用防护向导页面手动接入页签的主机接入指南子页签,选择应用的PHP版本一键推送安装,单击一键推送

    说明

    PHP版本选择要和业务中的实际PHP版本相符,否则会导致RASP探针加载失败。

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

  3. 推送记录子页签,等待对应服务器状态变更为已推送

  4. 主机接入指南子页签,根据应用运行环境类型参考控制台或下述步骤在应用服务器中修改php.ini配置文件。

    1. 执行下述命令打开php.ini 文件。

      说明
      • 当前步骤使用的编辑器为nano。

      • php.ini文件的位置与安装形式和发行版本有关,大部分CentOS位置为:/etc/php.ini,PHP-FPM可能会有独立的配置文件。

        RHEL、CentOS、Fedora操作系统为例,php.ini文件的默认位置为:/etc/php.ini,打开上述操作系统下php.ini文件的命令如下所示。请根据您的具体环境调整下述命令中的路径。

      sudo nano /etc/php.ini
    2. php.ini文件末尾或适当的[Extensions]段落下,添加以下内容。

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

      image

      [alirasp]
      extension=/usr/local/aegis/rasp/apps/{appId}/php-7.0/alirasp.so
      alirasp.root_dir=/usr/local/aegis/rasp/apps/{appId}/php-7.0
    3. 保存并关闭php.ini文件。

      如果您使用的是nano编辑器,可以通过按Ctrl + X,然后按Y确认保存,最后按Enter退出。

  5. 重启您的应用,重启后RASP可立即生效。

    说明

    以下命令仅供参考。具体需要重启的服务取决于实际环境中安装的服务。

    • Nginx服务重启命令

      sudo systemctl restart nginx
    • Apache服务重启命令

      sudo systemctl restart apache2

      sudo systemctl restart httpd

接入主机(自定义下载安装)

  1. 自动/手动接入应用防护向导页面手动接入页签的主机接入指南子页签,选择应用的PHP版本自定义下载安装,单击RASP安装包右侧的下载

    说明

    PHP版本选择要和业务中的实际PHP版本相符,否则会导致RASP探针加载失败。

  2. 将下载的RASP安装包上传到服务器上,并执行下述命令解压该安装包。

    user.pathRASP安装包在服务器上的存储路径。

    unzip <安装包名称> -d <user.path>
  3. 根据应用运行环境类型参考控制台或下述步骤在应用服务器中修改php.ini配置文件。

    1. 执行下述命令打开php.ini 文件。

      说明
      • 当前步骤使用的编辑器为nano。

      • php.ini文件通常位于/etc/php/7.0/fpm/php.ini/etc/php/7.0/apache2/php.ini。请根据您的具体环境调整下述命令中的路径。

      sudo nano /etc/php/7.0/fpm/php.ini

      sudo nano /etc/php/7.0/apache2/php.ini
    2. php.ini文件末尾或适当的[Extensions]段落下,添加以下内容。

      将下述代码块中的<user.path>替换为安装包解压后的目录。

      [alirasp]
      extension=<user.path>/alirasp.so
      alirasp.root_dir=<user.path>
      说明

      请检查并确保解压的目录及其父目录,以及目录中的文件对 PHP 的 worker 启动用户有可读取和可进入的权限。

    3. 保存并关闭php.ini文件。

      如果您使用的是nano编辑器,可以通过按Ctrl + X,然后按Y确认保存,最后按Enter退出。

  4. 重启您的应用,重启后RASP可立即生效。

    说明

    以下命令仅供参考。具体需要重启的服务取决于实际环境中安装的服务。

    • Nginx服务重启命令

      sudo systemctl restart nginx
    • Apache服务重启命令

      sudo systemctl restart apache2

      sudo systemctl restart httpd

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

  1. 自动/手动接入应用防护向导页面手动接入页签的容器接入指南子页签,选择应用的PHP版本一键推送安装,单击一键推送

    说明

    PHP版本选择要和业务中的实际PHP版本相符,否则会导致RASP探针加载失败。

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

  3. 推送记录子页签,等待对应服务器状态变更为已推送

  4. 容器接入指南子页签,参考控制台说明或下述步骤部署探针。

    • 方法一:写入Dockerfile方式

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

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

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

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

        COPY rasp /rasp/
        说明

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

      4. Dockerfile中修改PHPphp.ini配置并添加 RASP扩展,内容如下:

        [alirasp]
        extension=/rasp/alirasp.so
        alirasp.root_dir=/rasp
      5. 重新生成镜像,并启动容器。

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

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

        docker run -itd --privileged=true -v /usr/local/aegis/rasp/apps/<应用分组ID>/php-7.0:/rasp/ 镜像ID
      2. Dockerfile中修改PHPphp.ini配置并添加 RASP扩展,内容如下:

        [alirasp]
        extension=/rasp/alirasp.so
        alirasp.root_dir=/rasp
      3. 重新生成镜像,并启动容器。

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

  1. 自动/手动接入应用防护向导页面手动接入页签的容器接入指南子页签,选择应用的PHP版本自定义下载安装,单击RASP安装包右侧的下载

    说明

    PHP版本选择要和业务中的实际PHP版本相符,否则会导致RASP探针加载失败。

  2. 容器接入指南子页签,根据应用运行环境类型参考控制台或下述步骤部署探针。

    • 方法一:写入Dockerfile方式

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

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

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

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

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

        COPY rasp /rasp/
        说明

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

      4. Dockerfile中修改PHPphp.ini配置并添加 RASP扩展,内容如下:

        [alirasp]
        extension=/rasp/alirasp.so
        alirasp.root_dir=/rasp
      5. 重新生成镜像,并启动容器。

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

      1. 将下载的RASP安装包上传到服务器上,并执行下述命令解压该安装包。

        user.pathRASP安装包在服务器上的存储路径。

        unzip <安装包名称> -d <user.path>
      2. 执行下述命令在创建容器时将服务器上的rasp目录挂载到容器指定目录。

        docker run -itd  -v /{user.path}/rasp:/rasp/ 镜像ID
      3. Dockerfile中修改PHPphp.ini配置并添加 RASP扩展,内容如下:

        [alirasp]
        extension=/rasp/alirasp.so
        alirasp.root_dir=/rasp
      4. 重新生成镜像,并启动容器。

3. 设置防护策略

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

重要

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

分类

配置项

说明

防护策略

应用分组名称

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

防护状态

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

防护模式

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

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

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

防护策略组

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

检测类型

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

常用配置

检测超时时间

攻击检测的最大时间,输入范围为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%。

  • 主机或容器环境内存占比超过:可设置范围5%~99%,推荐配置98%。

  • 主机或容器环境剩余内存小于:可设置范围10~99999 MB,推荐配置100 MB。

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

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

4. 验证应用接入情况

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

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

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

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

    image

后续步骤

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

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

  3. 攻击告警处置