一、背景
2021年12月爆出的高危漏洞 CVE-2021-44228 和CVE-2021-45045漏洞,彻底的防护措施是升级Log4J版本到官方指定版本,临时措施是通过WAF进行一定程度的防护。建议升级到Log4J 2.17版本才可以满足安全要求。
使用WAF防护的前提:
- 中国区域和海外区域,已经使用EC2、ECS容器服务、EKS容器服务,且使用ALB作为发布点,此场景可使用WAF防护
- 海外区域,没有使用ALB发布但是使用Cloudfront CDN加速,则可使用基于Cloudfront的WAF防护
- 中国区域和海外区域的WAF都不支持直接对一个EC2的80、443、8080端口进行防护
- 不支持NLB网络负载均衡器,NLB后可嵌套接入ALB(此为2021年新发布新特性)
如果您已经配置过WAF并启用了,请参考这里的changelog确认后续更新。如果还没有启用WAF,请参考如下Step-by-step配置说明如下。
二、为ALB开启WAF
进入WAF服务,请注意目前中国区WAF操作界面只有英文。
点击右侧按钮创建Create web ACL
。即可进入创建WAF界面。如下截图。

如果此前曾经创建过WAF,那么需要在左侧菜单中点击Web ACLs
按钮,进入Web ACLs
界面,并在页面上方的Region位置选择正确的AWS Region。这是因为基于ALB的WAF是Regional区域性资源,必须与Region内的ALB对应才可以启用。然后点击创建按钮。如下截图。

在创建页面上,分别填写Web ACL的Name
名称,Description
描述,CloudWatch metric name
监控指标的名称。同时选择Resource Type
资源类型是与ALB绑定的Regional
类型,区域选择北京或者宁夏正确的区域。最后点击页面最下方那个的按钮缇娜家资源Add Amazon Web Services resources
。如下截图。

在上一步点击添加资源后,会弹出新的窗口,从Resource type
资源类型中选择Application Load Balancer
即ALB,然后从下方的负载均衡器清单中选择要绑定WAF的ALB名称,然后点击添加。如下截图。

添加完毕后,页面返回到向导第一步,点击右下角的Next
下一步按钮。将进入向导第二步。如下截图。

现在进入向导第二步,添加WAF防护策略。点击页面中间的Add rules
按钮,在弹出的下拉框中选择第一项Add managed rule groups
。这一步将添加AWS提供的托管的WAF规则组,针对不同场景进行防护。如下截图。

进入添加托管规则的页面,规则组默认在折叠状态没有显示详细清单。点击页面上的三角箭头,即可显示详细的清单。如下截图。

在WAF托管规则界面,将页面向下滚动,在其中找到Known bad inputs
,点击右侧的按钮Add to web ACL
,按下后图标开关从灰色变成蓝色,表示处于启用状态。点击下方的Edit
编辑按钮即可查看详情。如下截图。

在上一步点击编辑界面后,即可查看Known bad inputs
规则所包含的防护内容。接下来的操作不需要修改任何参数,本步骤只是用于确认防护是有效的。在页面中可以看到防护规则的版本Version
位置显示Default
。这表示将使用最新版本。在本界面上不需要修改任何参数。继续向下滚动页面。如下截图。

继续向下滚动页面,查看规则详情,即可看到第一条规则就是针对Log4JRCE漏洞的防护。在这个界面上,不需要修改任何参数,本步骤只是用于确认防护是有效的。请注意Count
选项一定不要打开。当前这个选项不打开时候,表示遇到攻击就会拦截。如果打开Count就意味着当遇到攻击时候只记录不拦截。因此请对照截图确认配置正确。点击Save rule
返回上一步。如下截图。

返回到规则配置界面后,确认下Known bad inputs
是开启的,然后点击右下角Add rules
按钮。如下截图。

返回向导后,可以在Rules
界面下看到刚才添加的AWS-AWSManagedRulesKnownBadInputsRuleSet
规则。在右侧Capacity
位置可以看到数字200
表示此条防护规则消耗的计算力。页面中间位置Web ACL rule capacity units used
参数表示本WAF防护使用的计算力不能超过1500
,当前使用了200
。在下方Default web ACL action for requests that don't match any rules
位置默认选择Allow
即可无需修改。在最下方Custom request
部分默认是折叠起来的,不需要展开。最后点击右下角的Next
下一步。如下截图。

插播一下WAF配置的注意事项:
在上述步骤请注意,如果之前没有使用过WAF,本次新增WAF进行防护,那么同时选择多个规则可能会造成误杀导致应用访问不正常。因此如果大批量应用多条规则,一般需要进行应用功能测试后再对生产环境变更。本次只配置一条Log4J漏洞规则,一般不会导致应用兼容问题。
另外如果选择所有规则,那么消耗的总计算量会超过1500WCU,无法进行配置。建议可以部署一些常用防护:
- Core rule set(OWASP常见漏洞)
- Known bad inputs(包含本次Log4J漏洞)
- Linux operating system(操作系统漏洞防护)
- SQL database(SQL注入)
同时开启以上规则,使用的计算力是1300/1500WCU,未超过最大处理能力,可有效防护常见漏洞。
插播完毕,现在回到配置规则的话题。
在向导的下一个界面,如果有多条规则,可以调整其中的优先级和匹配顺序。当只有一条的时候无需调整。如果有多条,可以将AWS-AWSManagedRulesKnownBadInputsRuleSet
规则放到优先级最高位置即可。如下截图。

在监控Cloudwatch配置参数上,使用当前页面的默认值即可。点击右下角的Next
下一步按钮继续。如下截图。

在向导最后一步,回顾刚才所有设置,无需调整,将页面向下滚动。如下截图。

点击右下角的Create web ACL
按钮完成创建过程。如下截图。

页面显示绿色的提示信息表示创建成功。如下截图。

三、查看防护效果
为了确认防护生效,您可以通过WAF ACL界面的规则取样信息位置查看计数器,显示是否遇到攻击和有效防护。将页面向下滚动,可以显示更多Sampled requests
访问记录取样。如下截图。

为了测试生效,可以选择一个Windows、Linux、或者Mac环境,对ALB的入口发起操作,请求URI包含关键字${jndi:ldap:
。注意这个关键字不是发起攻击造成溢出的完整字符串,不会导致被测试环境的问题。如下结果。
curl "http://alb-1435392491.cn-northwest-1.elb.amazonaws.com.cn/$\{jndi:ldap://a/"
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>
可看到返回结果是403被禁止。这个403并非是目录没有权限被Web Server禁止,而是被WAF拦截的禁止。
现在回到WAF的ACL界面上,向下滚动,可以在Sampled requests
位置中看到规则生效,并且触发了Block行为。如下截图。

至此防护完成。
四、更多参考
请查看AWS官方说明(英文):
https://aws.amazon.com/cn/security/security-bulletins/AWS-2021-005/
使用AWS安全工具防护(英文):