亚马逊AWS官方博客

通过 Elasticsearch 构建WAF日志分析系统

方案介绍

构建在AWS上的IT系统通常会启动WAF、Shield等安全产品去防御DDoS攻击,但很多企业发现使用了WAF服务后,却不知道其防御的效果与性能,因为他们没有一个统一的日志分析系统和可视化工具去分析系统所遭受的攻击情况。企业也很难使用这部分的日志数据去做进一步的安全忧化和服务改进的探索,只能沿用传统的IT运维模式,做事后安全事件处理,而不能做到实时和提前防护,这种状况对于绝大部分企业是不可接受的。

AWS大中华区企业支持团队根据与企业客户协作的实际经验,创建了基于Elasticsearch的WAF日志分析系统方案,让AWS用户快速实现具有忧良展示度的日志分析Dashboard(仪表盘),风控管理人员可以方便地可视化系统的安全情况,查看应用的正常流量与攻击流量,分析攻击的类型及其趋势,攻击的来源IP与国家,以及系统受攻击的访问路径等信息。

通过查看WAF Dashboard,我们可以非常容易分析应用的正常流量与攻击流量,非常直观的看到攻击的类型及其趋势,和攻击的来源IP与国家。

当发现系统有可疑攻击时,安全管理员可以快速从Dashboard中捕获相关攻击IP信息。通过进一步过滤筛选IP,我们可以很容易的分析其攻击的具体模式,例如下面案例,我们可以快速了解到该IP来源于美国,15分钟内有146次攻击请求;该IP进行了随机混合7层攻击,有Cookie层的SQL注入,Argument层的SQL注入,XSS等攻击;并发现它主要会尝试攻击“product.php”链接。有时候安全管理员想定制化查看更详细的攻击信息,也可以使用“Discover”并通过使用Elasticsearch查询语法去自定义查看系统的安全情况。

当锁定某个攻击IP时,往往需要对其具体攻击类型进行分析以确认是否需要将该IP加入WAF黑名单。这时管理员可以查看该攻击请求的具体JSON信息,分析其详细的攻击来源、IP、国家等,并知道其命中的规则,以及具体命中位置等信息。

方案架构


在CloudFront、ALB等7层服务上绑定了AWS WAF服务,并开启日志功能。参照AWS安全最佳实践,将 Elasticsearch服务步署在私有子网中,并使用位于公有子网的代理服务器 (Proxy)去访问Kibana。

日志分析系统的处理流程:
1. WAF生成的日志实时发送到Kinesis Firehose流
2. Kinesis Firehose接收到日志后,会把日志打上相应的索引标签并发送到Elasticsearch,并保存副本到S3上
3. Elasticsearch会根据索引模板对WAF的日志进行格式化并保存
4. 管理人员通过访问EC2跳板机,访问Kibana去查看WAF的日志分析仪表盘

准备工作

1. 参考”AWS WAF入门”启用 WAF保护,并绑定相应的受保护资源。

如果需要在生产环境中测试WAF的功能,推荐先开启Count计数模式,待验证功能后再启用正常的拦截模式。

2. 创建ElasticSearch

(1) 登录AWS控制台,选择 Elasticsearch Service,选择 Create a new domain (创建新域)
(2) 选择Production(生产环境),并选择6.8版本 (推荐选用最新稳定的新版本)

(3) 输入域的名称 “elasticsearch-logs”

(4) 对于 Data nodes (数据节点),选择 r5.large.elasticsearch 实例类型,并选用2个可用区,2个实例。
(5) 对于 Data nodes storage (数据节点存储),为数据节点配置合适的存储大小

(6) 测试机器可以不启用Dedicated master nodes和UltraWarm data nodes。 生产环境推荐开启Dedicated master nodes保证集群横向扩展过程高可用性
(7) Snapshot configuration和 Optional Elasticsearch cluster setting保持默认配置,选择 Next

(8) 对于 Network configuration (网络配置),请选择 VPC access (VPC访问)。
注意:我们的ES服务是放在Private的VPC Subnet的,因为我们选了两个2-AZ,所以我们需要选择两个在不同AZ的subnet,并选择安全组开放443/80端口给内网主机

(9) 不启用 Fine-grained access control (精细访问控制)和Amazon Cognito 身份验证
(10) 对于 Access policy (访问策略),选择“Allow Open access to this domainy”,我们通过private subnet和security group去控制权限

(11) 加密设置保留为默认值,然后选择 Next;在 Review页面上,仔细检查您的配置并选择 Confirm;待域初始化后,请记下AES的终端节点。

3. 使用跳板机访问位于VPC私有子网的ElasticSearch

由于我们的ElasticSearch 创建在VPC私有子网,因此推荐使用代理服务器进行访问,最简单的方式是在Public Subnet创建好EC2,并给这个EC2附加访问ElasticSearch的权限后,通过ssh tunnel 进行端口转发来进行访问。
(1) 创建一台Public Subnet的EC2
(2) 在本地Terminal连接跳板机EC2
sudo ssh -L 443:<elasticsearch endpoint>:443 -i "<ec2>.pem" ec2-user@<ec2 ip>
(3) 当使用ssh tunnel成功连接到跳板机EC2后,就可以在本地访问位于私有子网的ElasticSearch了

(4) 打开本机浏览器,输入https://localhost/_plugin/kibana/app/kibana 访问Kibana的管理控制台

4. 创建KinesisFirehose

(1) 打开Kinesis控制台,点击Create Delivery stream,新建传输流
注意:传输流的名称必须以aws-waf-logs 开头

(2) 点击下一步,下一步,目标位置选择Amazon Elasticsearch Service,并按如下进行配置,后期配置如缓冲条件根据需求配置,当选择相应的ES domain后,firehose会自动从ES cluster中读取相应的VPC信息
注意:为防止后期ES数据热点问题,并方便后期的Index Management管理,建议对index进行rotation设置,并设置为“Every Day”每天。开启rotation后,Index名字会自动加上日期,如“awswaf-2020-11-06”

(3) 为Firehose 创建一个专属的S3桶用来放全量的WAF日志,以备后续需要使用Athena进行更久远的WAF日志分析

(4) 点击下一步, 在权限配置上,让IAM自动创建相应的Role

(5) 最后完成Firehose的创建

配置WAF Logging

1. 在WAF控制台的WebACL 中找到 Enable Logging

2. 选择刚才创建的Kinesis firehose 流,点击Enable Logging完成日志流配置

配置ElasticSearch Kibanna控制台

1. 创建Kibana template

(1) 打开Kibana Console中 Dev Tools

(2) 在console 中输入以下代码创建 document template,后点击运行
注意:当前模板是使用5个shards, 1份replica,并格式化WAF的日期数据。生产环境一定要开启至少一份replicas,以防止数据节点出现故障时AES可以自动恢复,而不需要重建索引而导致数据丟失。

PUT  _template/awswaf-logs
{
    "index_patterns": ["awswaf*"],
    "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
    },
    "mappings": {
      "waflog": {
        "properties": {
          "httpRequest": {
            "properties": {
              "clientIp": {
                "type": "keyword",
                "fields": {
                  "keyword": {
                    "type": "ip"
                  }
                }
              }
            }
          },
          "timestamp": {
            "type": "date",
            "format": "epoch_millis"
          }
      }
    }
  }
}


创建完成后,会返回 “acknowledged” : true。

2. 创建Index pattern

(3) 返回kibana控制台, 找到Create index pattern,输入awswaf*

(4) 下一步,在“Time Filter field name”中选择timestamp,点击“Create index pattern”

3. 创建Visualize和Dashboard

我们可以根据用户的需求,轻松做用Kibana构建日志分析的Dashboard。为了方便使用和快速上手,您也可以使用如下AWS企业级支持团队构建的WAF Dashboard。
(5) 打开GitHub链接,选择 “Code → Download ZIP ” 下载展示模板(Visualize)和仪表盘模板(Dashboard)

(6) 在“Management”中选择”Saved Objects“,点击“Import”

(7) 导入已经制做好的Visulisation。(把waf_visualize_GCR_TAM_Production.json拖入上传对话框)

(8) 选择”Import”,如果出现warming时,选择”awswaf*”,然后点击”Confirm all changes”

(9) 用相同的方式上传已经创建好的Dashboard “waf_dashboard_GCR_TAM_Production.json”

4. 查看Dashboard, 并为WAF保护网站注入测试流量

(10) 返回Visualize中可以看到模板已经导入

(11) 在Dashboard中找到前期导入的WAF 中文监控Dashboard
注意:如果WAF是开启Count计数模式,也可以使用Count仅计数Dashboard

(12) 查看Dashboard情况,如果当前选择的时间区间没有流量,Dashboard显示为空,需要导入测试流量才会有数据显示出来

(13) 进行正常流量与攻击流量测试
#可以通过一个简单的while循环输入正常流量

while true
do
curl http://dkbXXXX.cloudfront.net
done

#尝试输入SQL注入攻击流量:

while true
do
curl http://dkbXXXX.cloudfront.net/product.php?username=1%27%20or%20%271%27%20=%20%271%27%20LIMIT%201/*&password=foo&dd=1
sleep 1
done

查看WAF 防护效果

如“方案介绍”章节所介绍,通过查看WAF Dashboard,我们可以非常容易分析应用的正常流量与攻击流量,非常直观的看到攻击的类型及其趋势,和攻击的来源IP与国家。

总结

运行在AWS上的IT系统,可以很方便的通过使用Elasticsearch去构建WAF日志分析系统,以帮助企业实时分析当前系统的安全情况。通过分析WAF的日志,我们可以分析出攻击者的具体攻击模式,和平台的安全脆弱点,以做针对性的安全防护。后续您可以使用类似的方式去分析其它如ALB、 EKS等日志数据,去进一步忧化系统的安全性和稳定性。

 

本篇作者

谢志鹏

AWS技术客户经理,负责企业级客户的架构和成本优化、技术支持等工作,致力于金融区块链等行业,曾供职于IBM,拥有8年IT架构、运维经验。