亚马逊AWS官方博客
使用 AWS WAF 完整日志、Amazon Athena 以及 Amazon QuickSight 实现无服务器安全分析
Original URL: https://aws.amazon.com/cn/blogs/security/enabling-serverless-security-analytics-using-aws-waf-full-logs/
在传统上,要对数据日志进行分析,我们需要首先对数据进行提取、转换与加载,而后使用多种数据仓库与商务智能工具从中提取洞见结论,同时注意维护各工具运行所处的服务器设施。
在今天的文章中,我们将向您介绍如何在无需启动任何服务器的前提下,分析AWS Web Application Firewall(AWS WAF)日志并快速构建多套仪表板。借助新的AWS WAF全日志记录功能,大家现在可以通过配置Amazon Kinesis Data Firehose将AWS WAF的全部检查流量记录至Amazon Simple Storage Service (Amazon S3)存储桶当中。在本次演练中,我们将创建一条用于发送AWS WAF全日志记录的Amazon Kinesis Data Firehose交付流,并对特定Web ACL启用AWS WAF日志记录。接下来,我们将设置一项AWS Glue爬取作业以及一张Amazon Athena表。最后,我们设置一套Amazon QuuickSight仪表板,用于实现Web应用程序的安全可视化能力。当然,大家也可以使用相同的步骤构建其他可视化功能,用以从AWS WAF规则以及遍历AWS WAF层的Web流量中提取洞见。安全与运营团队可以直接监控这些仪表板,在无需其他团队配合的前提下实现日志分析。
以下架构图,重点介绍了这套解决方案中所使用的各项AWS服务:
图一:架构示意图
AWS WAF是一款Web应用程序防火墙,允许用户监控访问Amazon API Gateway API、Amazon CloudFront或者应用程序负载均衡器的各类HTTP与HTTPS请求。AWS WAF还允许用户控制对内容的访问。根据您指定的条件(例如发出请求的IP地址或者查询字符串的值),API Gateway、CloudFront或者应用程序负载均衡器会使用请求的内容或HTTP 403状态码对请求做出响应(禁止)。大家还可以配置CloudFront,在请求被阻止时返回自定义错误页面。
Amazon Kinesis Data Firehose是一项全托管服务,用于向目的地(例如Amazon S3、Amazon Redshift、Amazon Elasticsearch Service以及Splunk)交付实时流式数据。使用Kinesis Data Firehose,您无需编写任何应用程序或者管理资源。您可以配置数据生产程序以将数据传递至Kinesis Data Firehose,由后者进一步完成指向特定目标的自动数据交付。您还可以配置Kinesis Data Firehose在数据实际交付之前执行数据转换操作。
AWS Glue 可用于对您的Amazon S3数据湖进行无服务器查询。AWS Glue可以对您的S3存储数据进行分类,并通过Amazon Athena与Amazon Redshift Spectrum执行进一步查询。使用爬取程序,您的元数据将与基础数据始终保持同步(后文将介绍更多关于爬取程序的详细信息)。
Amazon Athena是一项交互式查询服务,可帮助您轻松使用标准SQL直接分析在Amazon S3中的数据。Athena采用无服务器架构,因此大家只需为实际运行的查询付费,且不必管理任何基础设施。
Amazon QuickSight是一项BI分析服务,可用于构建可视化视图、执行一次性分析,并从数据当中提取商业洞见。它可以自动识别AWS数据源,也能够配合您指定的数据源一起使用。Amazon QuickSight使组织得以利用强大的内存内引擎SPICE为成千上万用户服务,提供极为强大的响应性能。
SPICE 是极快(Super-fast)、并行(Parallel)、内存内(In-memory)计算(Calculation)引擎(Engine)的缩写。SPICE支持丰富的计算功能,可帮助用户在摆脱基础设施置备或管理等繁琐工作的同时,快速通过分析得出洞见结论。SPICE还能够自动复制数据以实现高可用性,推动Amazon QuickSight面向成千上万用户进行扩展。二者相结合,即可跨越多种AWS数据源执行快速交互分析。
步骤1:设置一条新的Amazon Kinesis Data Firehose交付流
- 在AWS管理控制台中,打开 Amazon Kinesis Data Firehose服务并选择创建新流按钮。
图二:选择交付流的名称与数据源
- 接下来,如果大家需要先转换数据,再将结果传输至目的地,则应选择启用AWS Lambda。(关于数据转换的更多详细信息,请参阅 Amazon Kinesis Data Firehose说明文档。) 在本次演练中,我们不需要执行任何转换,因此请在 Record transformation部分选择 Disabled。
图三:在Record transformation部分选择“Disabled”
图四:选择“Disabled”,不对JSON对象进行转换
图五:选择传输目的地
图六:输入S3存储桶名称,而后在源记录S3备份处选择“Disabled”
- 在下一步中,直接保留Buffer size, Buffer interval, S3 compression 以及 S3 encryption的默认设定。但在这里,我们建议大家将 Error logging 设置为 Enabled以进行故障排查。
图七:选择“Allow”以创建 “firehose_delivery_role” IAM角色
- 在配置的最后一步,检查之前我们选定的所有选项,而后选择 Create delivery stream。接下来,交付流状态将在Status下显示为“Creating”。几分钟之后,状态将变更为“Active”,如以下截屏所示。
Figure 8: Review the options you selected
步骤2:为特定Web ACL启用AWS WAF日志记录
- 在 AWS Management Console部分打开 AWS WAF服务,而后选择Web ACLs。打开您的Web ACL资源,该资源可被部署在CloudFront发行版或者应用程序负载均衡器当中。
图九:选择“Enable Logging”
- 下一页中将显示所有以aws-waf-logs开头的交付流。在这里,请选择我们在演练开头处为AWS WAF日志创建的Amazon Kinesis Data Firehose交付流。 (In the screenshot below, our example stream name is 如以下截屏所示,我们的示例流名称为aws-waf-logs-us-east-1。)
图十:选择您的交付流,而后选择“Create”
几分钟之后,我们即可检查Kinesis Data Firehose交付流中定义的S3存储桶。日志文件将按年、月、日及小时的目录结构创建。
步骤3:设置AWS Glue爬取器以及Amazon Athena表
数据目录中爬取器的作用,在于遍历数据存储(例如Amazoon S3)并提取文件中的元数据字段。爬取器的输出将包含一个或者多个在数据目录中定义的元数据表。在爬取器运行过程中,列表中第一个成功识别您数据存储的分类器将负责为表创建schema。AWS Glue提供内置的分类器,能够将通用文件导出为JSON、CSV以及Apache Avro等多种格式。
- 在AWS Management Console当中打开AWS Glue 服务,而后选择Crawler以设置一项爬取作业。
- 选择Add crawler以启动爬取作业安装导航。在 Crawler name部分,输入一个相关名称,而后选择Next。
图十一:输入“Crawler name”,而后选择“Next”
图十二:选择数据存储
图十三:选择“Create an IAM role”并输入名称
图十四:将“Frequency”设置为“Run on demand”
图十五:选择数据库,而后输入前缀
- 查看您为爬取器作业选择的所有选项,而后选择 Finish按钮以完成向导。
- 现在您已经设置了爬取器作业参数,请在控制台的左侧面板上选择Crawlers以选定您的作业,而后选择 Run crawler。该作业会创建一个Amazon Athena表。持续时间取决于日志文件的实际大小。
图十六:选择“Run crawler”以创建Amazon Athena表
- 要查看由AWS Glue爬取器作业创建的Amazon Athena表,请在 AWS Management Console中打开Amazon Athena 服务。您可以根据表名称前缀进行过滤。
图十七:选择“Preview table”以查看数据
步骤4:使用Amazon QuickSight创建可视化结果
- 在AWS Management Console当中,打开Amazon QuickSight。
- 在Amazon QuickSight容器的左上角,选择New Analysis。选择New Data set,而后在数据源部分选择 Athena。为该数据源输入适当名称,而后选择 Create data source。
图十八:输入“Data source name”,而后选择“Create data source”
- 接下来,选择Use custom SQL以提取JSON对象中的所有字段,具体SQL查询如下:
```
with d as (select
waf.timestamp,
waf.formatversion,
waf.webaclid,
waf.terminatingruleid,
waf.terminatingruletype,
waf.action,
waf.httpsourcename,
waf.httpsourceid,
waf.HTTPREQUEST.clientip as clientip,
waf.HTTPREQUEST.country as country,
waf.HTTPREQUEST.httpMethod as httpMethod,
map_agg(f.name,f.value) as kv
from sampledb.jsonwaflogs_useast1 waf,
UNNEST(waf.httprequest.headers) as t(f)
group by 1,2,3,4,5,6,7,8,9,10,11)
select d.timestamp,
d.formatversion,
d.webaclid,
d.terminatingruleid,
d.terminatingruletype,
d.action,
d.httpsourcename,
d.httpsourceid,
d.clientip,
d.country,
d.httpMethod,
d.kv['Host'] as host,
d.kv['User-Agent'] as UA,
d.kv['Accept'] as Acc,
d.kv['Accept-Language'] as AccL,
d.kv['Accept-Encoding'] as AccE,
d.kv['Upgrade-Insecure-Requests'] as UIR,
d.kv['Cookie'] as Cookie,
d.kv['X-IMForwards'] as XIMF,
d.kv['Referer'] as Referer
from d;
```
图十九:在“New custom SQL query”当中粘贴SQL查询
图二十:选择 “Spice”,而后选择“Finish”
图二十一:在Amazon QuickSight控制台中,将数据类型更改为 “Date”
图二十二:为可视化结果输入名称,而后选择“Save”
- 现在,您可以使用拖放功能创建具有多种视觉类型的各类可视化仪表板。您可以播放多种字段组合,例如Action, Client IP, Country, Httpmethod以及 User Agents。您也可以在Date 上添加过滤器以查看仪表板上的特定时间轴。以下为部分示例截屏:
图二十三a:可视化仪表板示例
图二十三b:可视化仪表板示例
图二十三c:可视化仪表板示例
图二十三d:可视化仪表板示例
总结
您可以在Amazon S3存储桶上启用AWS WAF日志,并通过配置Amazon Kinesis Data Firehose对日志进行分析与流式传输。您可以通过数据流自动化,结合特定要求使用AWS Lambda进行多种数据转换操作,借此进一步增强这套解决方案。配合Amazon Athena与Amazon QuickSight,用户还可以轻松分析日志内容并为领导团队构建良好的可视化结果与仪表板。整套体系完全以无服务器架构运行,AWS将为您分担各类繁重的运营工作。