AWS WAF是一款Web应用程序防火墙,能够帮助我们保护Web应用程序免受各类常见恶意活动的影响,保障应用程序始终拥有合理的可用性、安全性与资源需求水平。AWS WAF还提供可自定义的Web安全规则,允许用户根据实际需要允许或阻止Web应用程序访问特定流量。
Amazon Elasticsearch Service (Amazon ES) 是一种托管服务,可以让您轻松在 Elasticsearch 云中部署、操作和扩展 AWS 集群。Elasticsearch 是一款流行的开源搜索和分析引擎,适用于日志分析、实时应用程序监控、点击流分析等使用案例。
AWS WAF 提供请求日志来记录相关 WebACL 流量的详细信息,日志信息包括被请求的 AWS 资源,每个请求的详细 HTTP 信息,以及每个请求匹配的规则和动作,具体日志字段请参考官方文档。
https://docs.aws.amazon.com/zh_cn/waf/latest/developerguide/logging.html
启用日志记录后,AWS WAF 的请求日志将通过用户配置的 Amazon Kinesis Data Firehose 传输到目标存储位置,例如 S3, Elasticsearch 等。
Note:用来接收 WAF 请求日志的 Amazon Kinesis Data Firehose,名称必须以 aws-waf-logs-开头。为用于保护Amazon CloudFront 的 WAF WebACL 启用日志,必须在美东区域(弗吉尼亚北部 - us-east-1)中创建 Firehose。为用于保护 ALB,API Gateway 等区域性资源的 WAF WebACL 启用日志,必须在相对应的区域中创建 Firehose。
本文档将以用于保护 CloudFront 的 WAF WebACL 举例,介绍如何为 WAF 启用日志,以及使用 Elasticsearch 分析日志。其中如何创建Elasticsearch服务,请参考步骤1:创建 Amazon ES 域。
创建AWS Elasticseatch
如何创建Elasticsearch服务,请参考步骤1:创建 Amazon ES 域。
https://docs.aws.amazon.com/zh_cn/elasticsearch-service/latest/developerguide/es-gsg-create-domain.html
重要:这是一个用于配置测试 Amazon Elasticsearch Service (Amazon ES) 域的简明教程。请勿使用此过程创建生产域。有关相同过程的综合版本,请参阅创建和管理 Amazon Elasticsearch Service 域。
https://docs.aws.amazon.com/zh_cn/elasticsearch-service/latest/developerguide/es-createupdatedomains.html
创建Kinesis Data Firehose
进入位于us-east-1(弗吉尼亚北部区域) 的Kinesis Data Firehose控制台,并点击 创建传输流;
1.在“新的传输流”页面上:
传输流名称:aws-waf-logs-demo
源:Direct PUT或其他源(默认)
点击【下一步】按钮。
2.在“处理记录”页面上:
数据转换:禁用(默认)
记录格式转换:禁用(默认)
点击【下一步】按钮。
3.在“选择一个目标”页面上:
目标:Amazon Elasticsearch
域:选择您自己创建的Elasticsearch域
索引:awswaf
索引轮换:每天(按需选择即可)
目标VPC连接:由于我测试是使用公共终端节点的 Amazon ES 域,因此不需要配置VPC、子网以及安全组(如有开启,请选择Elasticearch所在的VPC和子网)。
备份模式:仅失败的记录,
备份 S3 存储桶:选择自行创建的S3桶
备份 S3 存储桶前缀:awswaflog
点击【下一步】按钮。
4.在“配置设置”页面上:
缓冲区大小:1MiB
缓冲时间间隔:60s
权限 - IAM角色:创建或更新IAM角色(默认),其他保留缺省值
点击【下一步】按钮。
5.在“审核”页面上,点击【创建传输流】按钮。
这个过程大约需要3分钟。
启用WAF日志
1.在 Kinesis Data Firehose 创建完成后,进入 AWS WAF 控制台的Web ACL界面
2.选择“ Global(CloudFront) ”。
3.点击您的WebACL进入详细界面,如没有WebACL,请参考官方文档开始使用 AWS WAF。
https://docs.aws.amazon.com/zh_cn/waf/latest/developerguide/getting-started.html
4.点击并进入“Logging and Metrics”页面。
5.点击【Enable logging】按钮。
6.点击【Select a delivery stream】按钮,选择上一步创建的Kinesis Data Firehose。
7.其他配置保留缺省值,点击【Save】按钮。
使用 Elasticsearch 分析 WAF 日志
首先需要在 Kibana 中,为用于传送 WAF 日志的 Kinesis Data Firehose 的 IAM Role 添加权限。
进入上一步中创建的kinesis data firehose的详细页面,找到权限部分,点击IAM角色,打开IAM控制台,并把这个角色的ARN拷贝下来。
进入Elasticsearch控制台,点击图中链接登录 Kibana
1. 输入用户名和密码,点开左上角的菜单,
2. 点击左边的“Security”选项,
3. 点击左边的“Roles”选项,在右边找到“all_access” role。 点击“all_access”,并点击“Mapped users”页面,点击【Manage mapping】按钮,
4. 将 Firehose 的IAM Role ARN复制到Backend Role即可,然后点击【Map】按钮即可。
然后需要使用 Index template 修改 WAF Log 对应的Mapping字段格式,否则将无法将 log 的 timestamp 字段识别为时间格式。具体操作如下:点开 Kibana 菜单,并选择“Dev Tools”,请下载awswaf-index.template
https://ecr-msp-lab.s3.amazonaws.com/awswaf-index.template
并将内容复制到左边窗口,然后执行图标。
接下来创建 Index pattern。登录 Kibana,点开菜单,点击左边的“Stack Management”选项,再点击“Index Patterns”选项,点击右边的“Create index pattern”按钮,输入awswaf-*,点击【Next step】按钮。
Note:在Kibana中创建 Index Pattern 时,如果提示 Ready to try Kibana? First, you need data.,则请对被 WAF 保护的 Web URL 发起几次请求,主动生成几条日志。
接着选择 timestamp 字段作为 Time field。点击【Create index pattern】按钮。
接着,请下载 “awswaf-dashboard.ndjson”
https://ecr-msp-lab.s3.amazonaws.com/awswaf-dashboard.ndjson
这是个用于 AWS WAF 日志可视化展示的 Kibana 模版文件。
在Kibana菜单上,
1. 进入“Stack Management”选项,
2. 然后点击“Saved Object”选项,在右边点击“Import”选项,
3. 选中“awswaf-dashboard.ndjson”文件,点击【Import】按钮,完成导入,点击【Done】。
4. 其他设置保留默认配置,
Note:如果提示Index Pattern Conflict,则从下拉菜单中选择对应的Index pattern (awswaf-*)。
Note:在导入的 objects 中,也会有一个awswaf-* index pattern,其中会多出两个 Scripted field 字段,分别为 Host 和 UserAgent, Dashboard 中有些视图会使用到这两个字段。
在Kibana菜单上,进入“Dashboard”选项,在右侧的窗口里找到、并点击名为“WAFDashboard”的dashboard,然后查看 CloudFront 实时日志可视化视图。