默认情况下,Amazon CloudFront 标准日志会捕获部分字段中的敏感数据。出于隐私考虑,我想移除这部分日志。
简短描述
**注意:**本文使用客户端 IP (c-ip) 字段的示例。
默认情况下,CloudFront 日志将捕获 c-ip 作为其字段之一。有三种方法可以从日志中移除 c-ip。
- 触发一个 AWS Lambda 函数,此函数会在日志传输到 Amazon Simple Storage Service (Amazon S3) 中时移除此字段。
- 使用按特定间隔运行的 Amazon Elastic Compute Cloud (Amazon EC2) 进程来移除该字段。
- 使用 CloudFront 标准日志,在将日志数据发送到 Amazon S3 之前移除敏感字段。
**注意:**要激活标准日志,您必须使用专业版计划或按实际使用量付费计划。有关详细信息,请参阅 Amazon CloudFront 定价。
解决方法
触发 Lambda 函数
移除 c-ip 字段的一种方法是使用 Amazon S3 通知事件。当 CloudFront 将日志文件传输到 Amazon S3 存储桶中时,配置该存储桶以触发 Lambda 函数。
创建 Lambda 函数
1. 打开 AWS Lambda 控制台。
2. 在 Functions(函数)下,创建一个具有以下配置的新 Lambda 函数:
- 使用 Amazon S3 事件中的对象名称。
- 从 S3 存储桶获取对象。
3. 移除 c-ip 列,或用匿名数据替换这些值。
**注意:**替换这些值以保持相同的格式,以防其他应用程序进一步处理这些日志。
4. 保存日志并将其上传回 Amazon S3。
创建新事件
1. 在日志目标存储桶中,前往 Properties(属性)。
2. 在 Event notifications(事件通知)下,创建新事件。
3. 选择事件类型 Put 和目标 Lambda 函数。
4. 选择在步骤 1 中创建的 Lambda 函数,然后选择 Save(保存)。
重要事项: 要避免 Lambda 函数发生递归调用(无限循环),请执行以下操作:
- 将您的 CloudFront 日志传输到初始暂存前缀。例如,“original”。
- 仅针对该前缀触发 Amazon S3 事件。
- 让 Lambda 函数将日志传输到不同的前缀中。例如,“processed”。
如果您将日志传输到相同的前缀中,Lambda 函数将再次触发并造成递归调用。有关详细信息,请参阅 Avoiding recursive invocation with Amazon S3 and AWS Lambda(避免 Amazon S3 和 AWS Lambda 发生递归调用)。
**注意:**为了保持较低的 Amazon S3 成本,请设置 Amazon S3 生命周期策略,使原始日志在一定时间段后过期。
运行 Amazon EC2 进程
使用 Amazon EventBridge 创建计划规则 (cron),按计划周期启动 EC2 实例并处理日志文件。例如,每天一次。进程完成后,停止 EC2 实例,直到下一周期到来,以节省成本。
1. 配置 EventBridge 和 Lambda 在给定时间启动 EC2 实例。有关详细信息,请参阅如何使用 Lambda 按固定间隔停止和启动 Amazon EC2 实例?
2. 在 EC2 实例上,部署用于在特定时间段内下载日志的代码。例如,一整天。移除 c-ip 列以处理日志,或将列值替换为匿名数据。将处理过的日志上传回 S3 存储桶。
**可选:**将所有处理过的日志合并到一个文件中,以节省 Amazon S3 生命周期过渡成本。如果您打算长时间存储日志,此进程很有用。
使用 Kinesis Data Firehose
使用 CloudFront 实时日志选择要保存的字段。稍后,让 Amazon Kinesis Data Firehose 将日志数据发送到 Amazon S3。
配置 CloudFront 实时日志时,每条实时日志记录中包含的字段列表都可用。每条日志记录最多包含 40 个字段。您可以选择接收所有可用字段,也可以只接收必须监控和分析其性能的字段。停用字段 c-ip,将该字段排除在日志之外。
注意:由于需要使用 Amazon Kinesis Data Streams,此选项的成本较高。不妨考虑其他两个选项(触发 Lambda 函数或运行 Amazon EC2 进程),以获得更具成本效益的解决方案。