最近很多同学都听说了 Tomcat 的关于 AJP 的漏洞,国家信息安全漏洞共享平台(CNVD) 也对此进行披露,同时该漏洞综合评级被评为“高危”,这篇文章主要用来描述,如果确认您部署在阿里云上的应用受到了影响,该如何处理。
漏洞编号:CNVD-2020-10487/CVE-2020-1938
第一种方式:直接升级 Tomcat 版本
根据官方描述,最好的方式是将 Tomcat 升级到最新版本:Tomcat7 升至 7.0.100、Tomcat8 升至 8.5.51、Tomcat 9 升至 9.0.31。
这种方式最为彻底,但是缺点也很显而易见:由于这种做法属于更换底层的基础设施,如果您是生产应用,建议将风险控制在可控范围之内再进行。
第二种方式:修改配置
由于此漏洞只会对于 AJP 协议的 Connector 有影响,默认情况下 AJP 协议是打开的,但是 AJP 必须结合 httpd 一起工作才能起作用,如果您的应用中没有使用到 httpd,是可以关闭的,关闭的方式为:
- 打开配置文件 conf/server.xml:
vim ${CATALINA_HOME}/conf/server.xml
。 - 找到
<Connector port="8009" protocol="AJP/1.3"
后,注销配置文件中的相关配置,保存退出。 - 重启应用
如果您的应用中确实使用到了 AJP 协议的话,建议您在 Connector 的配置中,加入 secret 和 secretRequired 配置项,与此同时,需要配合修改前面的 httpd 的配置;具体操作方式可搜索 httpd 和 Tomcat AJP 的配置进行修改。
这种方式,不需要升级 Tomcat 版本,但需要对我们的 Tomcat 和 httpd (如果使用到了)的配置都进行修改;同时,如果集群很大的话,修改系统级别的配置会带来不确定的风险,建议结合一些运维工具批量进行。
第三种方式,关闭不必要的端口暴露
如果不幸端口确实打开了,而又不便去修改机器上的配置时;我们可以通过使用阿里云安全组策略,添加禁用ECS 上 对 8009(默认) 的端口访问的规则,或只对部分授信的 IP 放行来达到目的。
这种方式可以快速的封堵此漏洞,且不需要动机器上的配置,只需要对 ECS 有权限的运维同学就能完成操作,避免了不必要的业务回归。但是 ECS 安全组规则具有很高的维护成本,久而久之如果管理不好的话,可能会带来额外的排查诊断的的成本。
部署在阿里云 EDAS/SAE 上的应用如何操作
漏洞出来之后,EDAS/SAE 团队第一时间审查了我们所提供的 Tomcat 版本,包括 EDAS/SAE Container 和社区版本的 Apache Tomcat,针对 ECS 集群和 Kubernetes 集群我们得出的结论和建议是:
- 如果您使用的是 FatJar 的方式部署的话,将不会收到任何影响。
- 如果您使用的是 War 包部署的话,请参见一下表格:
应用类型 | ECS 集群 | Kubernetes 集群没有绑定8009端口暴露 | Kubernetes 集群已有绑定8009端口暴露 |
---|---|---|---|
EDAS/SAE Container(HSF) 应用 | 不受影响 | 不受影响 | 不受影响 |
Spring Cloud 应用 | 不受影响 | 不受影响 | 需重新部署应用 |
Dubbo 应用 | 不受影响 | 不受影响 | 需重新部署应用 |
镜像部署 | N/A | 不受影响 | 在镜像中按第一或第二种方式修复后,重做镜像部署应用 |
- EDAS K8s 集群关于 Apache Tomcat AJP 漏洞的解决方案(2020年02月24日)>>
- EDAS K8s 客户交流钉群:23197114
- SAE 客户交流钉群:23198618