亚马逊AWS官方博客
如何使用 Amazon Elasticsearch Service 分析 AWS WAF 日志
Original URL:https://thinkwithwp.com/cn/blogs/security/how-to-analyze-aws-waf-logs-using-amazon-elasticsearch-service/
日志分析,对于理解安全解决方案的实际有效性无疑至关重要,同时也有助于我们对日常故障排查及安全环境的整体性能做出准确评估。
AWS WAF是一款Web应用程序防火墙,能够帮助我们保护Web应用程序免受各类常见恶意活动的影响,保障应用程序始终拥有合理的可用性、安全性与资源需求水平。AWS WAF还提供可自定义的Web安全规则,允许用户根据实际需要允许或阻止Web应用程序访问特定流量。
在保护您的Web应用程序的同时,通过获取对AWS WAF完整日志的访问权限,您现在可以查看由AWS WAF生成的所有日志。此外,您也可以使用Amazon Kinesis Data Firehose将日志转发至Amazon Simple Storage Service (Amazon S3)进行归档,并转发至Amazon Elasticsearch Service以分析对Web应用程序的访问活动。
在本文中,我们将了解如何使用Amazon Elasticsearch Service (Amazon ES)分析AWS WAF日志,具体包括如何以近实时方式触发AWS WAF规则、追溯触发原因以及明确具体由哪条请求触发等。我们还将探讨如何为Web应用程序创建访问趋势历史视图以实现长期分析。
架构概述
启用AWS WAF日志记录功能,选择将日志发送至Amazon Kinesis Data Firehose。日志发送到Firehose后,您可以决定如何进行后续处理。在本文这套架构中,我们首先将日志转发至Amazon ES进行分析,而后转发至Amazon S3进行长期存储。
图一:架构概述
在本文中,我们将展示如何通过以下操作步骤,将AWS WAF日志记录传递至Amazon ES:
- 创建一个Amazon Elasticsearch Service域。
- 配置Kinesis Data Firehose进行日志传递。
- 在Web访问控制列表(ACL)上启用AWS WAF日志,并将数据发送至Kinesis Data Firehose。
- 在Amazon ES当中分析AWS WAF日志。
注意:请保证启用Kinesis Data Firehose的区域与部署AWS WAF Web ACL的区域相互匹配。如果要为部署在Amazon CloudFront上的AWS WAF启用日志记录,则只能在北弗吉尼亚州AWS区域创建Kinesis Data Firehose。
准备Amazon Elasticsearch Service
如果您还没有运行在AWS上的Amazon ES环境,则需要首先创建此环境。首先通过AWS控制台前往Elasticsearch Service,而后选择Create a new domain。在这里,大家可以定义Elasticsearch集群的命名空间,并选择您打算使用的具体版本。在本文的设置中,我们使用awswaf-logs作为命名空间,Elasticsearch版本为6.3。
图二:定义Amazon ES域
您也可以指定更多其他参数,例如集群中的节点数以及如何访问仪表板。关于自定义ES环境的更多详细信息,请参阅 Amazon Elasticsearch Service说明文档或者回顾之前的相关博文,其中深入介绍了Amazon ES的设置流程。
环境准备就绪之后,大家可以点击命名空间并找到指向Kibana仪表板的链接。Kibana是Elasticsearch的数据可视化插件,用于分析日志内容。
图三:识别Kibana管理URL
尽管Elasticsearch能够自动对AWS WAF日志中的大部分字段进行分类,但您仍需要告知Elasticsearch如何解释某些带有特定格式的字段。因此,在开始向Elasticsearch发送日志之前,我们需要创建一套索引模式模板,以便Elasticsearch正确识别AWS WAF日志并对字段做出分类。
接下来使用的模式模板将应用于所有以字符串awswaf-开头的索引。因为在本示例中,Elasticsearch中创建的所有AWS WAF日志索引文件将始终以字符串awswaf-开头,随后为日志日期。
这套模式模板由日志中的两个字段进行定义。模板首先向Elasticsearch表明httpRequest.clientIp字段使用的是IP地址格式,并通过timestamp字段显示请求时间。日志中的其他字段将自动进行分类。
在此模板中,我们还设置了索引中使用的Elasticsearch的分片数量。设置分片,有助于对大规模数据进行分布式存储,具体数量则取决于索引本身的大小——索引越大,则应部署更多分片。在本示例中,我们将只使用一个分片,其中的索引小于30 GB。关于适当调整分片大小的更多建议,请参阅Jon Handler关于使用Amazon Elasticsearch Service的博文。
PUT _template/awswaf-logs
{
"index_patterns": ["awswaf-*"],
"settings": {
"number_of_shards": 1
},
"mappings": {
"waflog": {
"properties": {
"httpRequest": {
"properties": {
"clientIp": {
"type": "keyword",
"fields": {
"keyword": {
"type": "ip"
}
}
}
}
},
"timestamp": {
"type": "date",
"format": "epoch_millis"
}
}
}
}
}
这里,我们将使用Kibana开发者界面(位于Kibana仪表板的Dev Tools选项卡之下)将这套模板应用于Elasticsearch,但大家也可以通过调用Amazon ES端点API实现同样的效果。
图四:在Kibana中应用索引模式模板
这套模板将应用于全部以awswaf-前缀开头的日志索引。稍后,我们也将在Kinesis Data Firehose配置中使用同样的前缀名称。
设置Kinesis进行日志传递
现在,Amazon ES已经做好接收AWS WAF日志的准备,下面我们将一同了解如何使用Amazon Kinesis Data Firehose将日志记录传递至Amazon S3与Amazon ES。我们需要先完成这一步,而后才能在AWS WAF中启用日志记录功能。
首先,前往AWS控制台中的Kinesis service部分,在Data Firehose选项卡中选择Create delivery stream。如果由WAF日志使用此Data Firehose流,则其名称开头应设置为aws-waf-logs-。这里我们使用OWASP十大安全漏洞防护示例中的现成Web ACL,因此这里就将delivery stream直接命名为aws-awf-logs-owasp了。
其余设置直接保留默认形式即可,直至进入Select destination页面。在此页面中,我们将Amazon Elasticsearch Service配置为日志记录目的地。请注意将索引命名为awswaf,并在类型中选择waflog以匹配我们先前在Elasticsearch中创建的索引模式模板。
图五:将Amazon ES设置为Data Firehose日志记录目的地
在此页面中,您也可以设置指向Amazon S3的备份记录内容——例如保存全部记录或者只保存故障记录。接下来,您需要指定要使用的存储桶、前缀,而后选择Next。
图六:在Data Firehose中设置S3备份
在下一页面中,我们可以选择更新缓冲区的条件——例如指定大小以及间隔。这些选项负责控制Kinesis Data Firehose将新数据发送至Amazon ES的频率。设置的值越低,则日志传递就越接近实时。在我们的示例中,缓冲区大小设置为1 MB,缓冲区间隔则设置为60秒。
图七:设置Data Firehose缓冲区条件
接下来,大家需要指定一个IAM角色,以使Kinessis Data Firehose有权限能够将数据发送于Amazon S3与Amazon ES。您可以选择一个现有IAM或者创建一个全新角色。关于创建IAM角色的更多详细信息,请参阅使用Amazon Kinesis Data Firehose实现访问控制。
最后,查看所有设置,确认无误后完成Kinesis Data Firehose创建。
启用AWS WAF日志记录
现在,我们的Kinesis Data Firehose已经准备就绪,接下来可以启用AWS WAF Web ACL的日志记录功能了。大家可以在AWS控制台的AWS WAF & AWS Shield服务下,前往Web ACLs选项卡,并选定您希望启动记录的具体Web ACL而后,在Logging选项卡下,选择Enable Logging。
图八:启动AWS WAF Web ACL
在下一页面中,指定需要传递至Kinesis Data Firehose的日志。如果在下拉列表中看不到任何选项,请检查之前配置的Kinesis Data Firehose与要启用日志记录功能的Web ACL是否部署在相同的区域当中,且名称以aws-waf-logs-开头。请注意,对于使用CloudFront Web ACL进行的部署,Kinesis Data Firehose只能创建在北弗吉尼亚区域当中。
日志搜索
在重新登录至Amazon ES的Kibana仪表板后,大家应该看到一份名为awswaf-<date>的新索引。这里需要定义一种索引模式,其中应包含所有可能的awswaf日志条目。将索引模式描述配置为awswaf-*,而后在下一页面中选择timestamp作为时间过滤器。
图九:配置Kibana索引模式
图十:为索引模式配置一项时间过滤器
在完成索引模式设置之后,大家可以前往Kibana中的Discover选项卡对日志进行全面搜索了。搜索操作可以基于AWS WAF日志中的任意字段。例如,您可以查找特定的HTTP标头、查询字符串或者源IP地址,了解有哪些指向它们的操作。要了解关于AWS WAF日志中可用字段的更多详细信息,请参阅《AWS WAF开发者指南》。
在以下搜索示例中,我们查找的是所有由Web ACL阻断了流量,且HTTP参数等于name=badname的所有日志条目。
图十一:即席搜索示例
这种方法可以帮助大家根据相关参数(例如Cookie、主机标头、查询字符串等)识别特定请求,了解其受到阻止(或允许)的原因,以及具体阻止由哪个Web ACL执行等。这种能力对于调整AWS WAF以匹配Web应用程序拥有非常重要的实际意义。
构建一套仪表板
大家也可以使用Amazon ES创建自定义图表,借此查看长期趋势并将图表合并至仪表板当中。例如,您可能希望按IP地址查看被阻止或允许的请求数量,借此识别潜在的恶意IP地址。
要了解各个IP地址的请求明细,我们需要首先设置一份图表,用于显示各个源AWS WAF阻止及允许的请求数量。为此,请前往Kibana仪表板中的Visualize部分,并创建一个新的可视化视图。大家可以从多种可视化选项中选择,在以下示例中,我们使用横向条形图。
图十二:配置主存储桶参数
- 选择索引,而后配置您的图形选项。在横向条形图中,Y轴代表请求数,X轴代表主存储桶占用量,而后调整字段以显示源IP地址与操作:
图十三:配置存储桶序列
- 接下来,展开 Split Series部分,并调整下拉菜单中的以下字段:
图十四:示例Kibana图
图十五:选择“Apply changes”按钮
大家可以将图形组合至仪表板中,借此汇总关于AWS WAF功能的相关信息。在以下示例仪表板中,可以看到多个可视化对象,且分别集中在不同的维度之上,包括各个国家/地区的请求、IP地址以及命中次数最高的WAF规则等。
图十六:进行图形组合
感兴趣的朋友可以下载本文中的示例仪表板与示例可视化视图。您可以通过仪表板的Management/SavedObjects部分将其导入您的Kibana实例。
总结
通过AWS WAF Web ACL 的访问日志,我们可以分析Web应用程序接收到的各类请求。在本文中,我们了解了如何使用Amazon Easticsearch Service作为AWS WAF日志的发送目的地,也讲解了如何搜索日志数据并以其为基础构建图形与仪表板。Amazon ES只是原生日志交付的可选目的地之一。要了解更多详细信息,请参阅如何直接将数据发送至Amazon S3、Amazon Redshift以及Splunk说明文档。
如果您对本文还有任何建议或意见,请在下方评论区中与我们交流。如果您对本文内容抱有疑问,请在WAF论坛上启动新话题或联系AWS技术支持人员。
希望了解关于AWS Security的更多新闻?在 Twitter上关注我吧。