收集 Fastly CDN 日志
解析器版本:2.0
支持的平台:
Google SecOps
SIEM
本文档介绍了如何使用 Amazon S3 将 Fastly CDN 日志注入到 Google Security Operations。
Fastly 是一种内容分发网络 (CDN) 和边缘云平台,可提供实时内容分发、安全和边缘计算服务。Fastly 的实时日志流式传输功能可以将 CDN 访问日志、WAF 事件和其他遥测数据发送到各种目标位置(包括 Amazon S3),以进行安全监控和分析。
准备工作
请确保您满足以下前提条件:
- Google SecOps 实例
- 对 Fastly 控制面板或 API 的特权访问权限
- 对 AWS(S3、IAM)的特权访问权限
- 具有
global或global:read范围的 Fastly API 令牌
创建 Fastly API 令牌
- 访问 https://manage.fastly.com,登录 Fastly 控制台。
- 点击右上角的用户图标。
- 前往账号 > 个人 API 令牌。
- 点击创建令牌。
- 在创建 API 令牌 对话框中,提供以下信息:
- 名称:输入一个描述性名称(例如
Google SecOps S3 Logging Configuration)。 - 类型:选择用户令牌。
- 范围:选择全球访问权限(配置日志记录端点时必须选择此选项)。
- 失效:选择永不过期或设置合适的失效日期。
- 名称:输入一个描述性名称(例如
- 点击创建令牌。
- 复制并妥善保存 API 令牌。
为 Google SecOps 配置 AWS S3 存储桶和 IAM
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域以供日后参考(例如,
fastly-cdn-logs)。 - 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 .csv 文件以保存访问密钥和密钥,供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 AmazonS3FullAccess 政策。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
配置 Fastly S3 日志记录端点
方案 A:通过 Fastly 控制面板进行配置
- 登录 Fastly 控制台 (https://manage.fastly.com)
- 选择要为其配置日志记录的服务。
- 点击修改配置,然后选择克隆有效版本以创建新的草稿版本。
- 点击左侧导航菜单中的日志记录。
- 在 Amazon Web Services S3 部分中,点击创建端点。
在创建 Amazon S3 端点表单中,提供以下配置详细信息:
基本设置:
- 名称:输入一个描述性名称(例如
secops-s3-logs)。 - 展示位置:选择格式版本默认(推荐)。
日志格式:输入以下 JSON 格式字符串:
{"timestamp":"%{begin:%Y-%m-%dT%H:%M:%S%z}t","client_ip":"%{req.http.Fastly-Client-IP}V","geo_country":"%{client.geo.country_name}V","geo_city":"%{client.geo.city}V","geo_region":"%{client.geo.region}V","datacenter":"%{server.datacenter}V","host":"%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V","url":"%{json.escape(req.url)}V","request_method":"%{json.escape(req.method)}V","request_protocol":"%{json.escape(req.proto)}V","request_referer":"%{json.escape(req.http.referer)}V","request_user_agent":"%{json.escape(req.http.User-Agent)}V","response_state":"%{json.escape(fastly_info.state)}V","response_status":%{resp.status}V,"response_reason":%{if(resp.response, "\"%22\"+json.escape(resp.response)+\"%22\", \"null\")}V,"response_body_size":%{resp.body_bytes_written}V,"response_header_size":%{resp.header_bytes_written}V,"request_body_size":%{req.body_bytes_read}V,"request_header_size":%{req.header_bytes_read}V,"cache_status":"%{fastly_info.state}V","is_tls":"%{if(req.is_ssl, \"true\", \"false\")}V","tls_protocol":"%{cstr_escape(tls.client.protocol)}V","tls_cipher":"%{cstr_escape(tls.client.cipher)}V","server_identity":"%{json.escape(server.identity)}V","is_edge":%{if(fastly.ff.visits_this_service == 0, "true", "false")}V,"time_elapsed_usec":%{time.elapsed.usec}V,"time_start_sec":%{time.start.sec}V}
- 时间戳格式:保留默认值(与 strftime 兼容的字符串)。
- 名称:输入一个描述性名称(例如
S3 存储桶配置:
- 存储桶名称:输入 S3 存储桶名称(例如
fastly-cdn-logs)。 - 网域:如果您的存储桶位于美国标准区域,请留空。对于其他区域,请输入相应的 S3 端点(例如,对于 us-west-2 区域,请输入
s3-us-west-2.amazonaws.com)。 - 分发方法:选择用户凭据
- 访问密钥:输入第 11 步中的 AWS 访问密钥。
- 密钥:输入第 11 步中的 AWS 私有访问密钥。
- 周期:输入
3600(每小时最终确定一次日志)。
点击高级选项以展开其他设置:
高级设置:
- 路径:输入
fastly-cdn/(用于在存储桶中整理日志的可选前缀)。 - PGP 公钥:留空(此集成不需要加密)。
- 选择日志行格式:选择空白(我们将使用自定义 JSON 格式)。
- 压缩:选择 gzip(建议选择此选项以降低存储费用)。
- 冗余级别:选择标准。
- ACL:选择私密(推荐)。
- 服务器端加密:选择无(或根据您的安全要求进行配置)。
- 字节数上限:输入
0(无文件大小上限)。
- 路径:输入
点击创建以创建日志记录端点。
点击右上角的启用。
选择在正式版中启用以部署配置更改。
在确认对话框中,点击启用进行确认。
方案 B:通过 Fastly API 进行配置
如果您希望通过 API 配置日志记录,请使用以下方法:
通过控制面板或列出服务来获取 Fastly 服务 ID:
curl -H "Fastly-Key: YOUR_FASTLY_TOKEN" https://api.fastly.com/service克隆有效版本以创建新的草稿版本:
curl -X PUT -H "Fastly-Key: YOUR_FASTLY_TOKEN" \ "https://api.fastly.com/service/SERVICE_ID/version/ACTIVE_VERSION/clone"在新草稿版本上创建 S3 日志记录端点:
curl -X POST -H "Fastly-Key: YOUR_FASTLY_TOKEN" \ -H "Content-Type: application/x-www-form-urlencoded" \ "https://api.fastly.com/service/SERVICE_ID/version/NEW_VERSION/logging/s3" \ --data-urlencode 'name=secops-s3-logs' \ --data-urlencode 'bucket_name=fastly-cdn-logs' \ --data-urlencode 'access_key=YOUR_AWS_ACCESS_KEY' \ --data-urlencode 'secret_key=YOUR_AWS_SECRET_KEY' \ --data-urlencode 'path=fastly-cdn/' \ --data-urlencode 'period=3600' \ --data-urlencode 'gzip_level=9' \ --data-urlencode 'format_version=2' \ --data-urlencode 'format={"timestamp":"%{begin:%Y-%m-%dT%H:%M:%S%z}t","client_ip":"%{req.http.Fastly-Client-IP}V","geo_country":"%{client.geo.country_name}V","geo_city":"%{client.geo.city}V","host":"%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V","url":"%{json.escape(req.url)}V","request_method":"%{json.escape(req.method)}V","response_status":%{resp.status}V,"cache_status":"%{fastly_info.state}V"}'激活新版本:
curl -X PUT -H "Fastly-Key: YOUR_FASTLY_TOKEN" \ "https://api.fastly.com/service/SERVICE_ID/version/NEW_VERSION/activate"
验证日志是否已传送到 S3
- 等待大约 1 小时(根据配置的周期),直到第一个日志文件最终确定。
- 在 AWS 控制台中,依次前往 S3 > 存储桶。
- 点击您的存储桶名称(例如
fastly-cdn-logs)。 - 前往
fastly-cdn/前缀文件夹。 验证是否正在创建命名模式类似于以下内容的日志文件:
fastly-cdn/YYYY-MM-DD-HH-MM-SS-RANDOM_STRING.log.gz下载示例日志文件,并验证 JSON 格式是否与您的配置相符。
在 Google SecOps 中配置 Feed 以注入 Fastly CDN 日志
- 前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 为Feed 名称输入一个唯一的名称。
- 选择 Amazon S3 V2 作为来源类型。
- 选择 Fastly CDN 作为日志类型。
- 点击下一步,然后点击提交。
为以下字段指定值:
- S3 URI:
s3://fastly-cdn-logs/fastly-cdn/。 - 源删除选项:根据您的偏好选择删除选项。
- 文件存在时间上限:包含在过去指定天数内修改过的文件(默认值为 180 天)。
- 访问密钥 ID:具有 S3 存储桶访问权限的用户访问密钥。
- 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
- 资源命名空间:资源命名空间。
- 注入标签:要应用于此 Feed 中事件的标签。
- S3 URI:
点击下一步,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| request_protocol、response_state、response_reason、response_body_size、fastly_server、fastly_is_edge | additional.fields | 如果非空,则与根据每个字段创建的标签合并 |
| metadata.event_type | 设置为“GENERIC_EVENT”,如果 principal_mid_present 为 true,则设置为“STATUS_UPDATE” | |
| request_method | network.http.method | 直接复制值 |
| request_user_agent | network.http.parsed_user_agent | 转换为 parseduseragent,然后重命名 |
| request_referer | network.http.referral_url | 直接复制值 |
| response_status | network.http.response_code | 转换为字符串,然后再转换为整数 |
| request_user_agent | network.http.user_agent | 直接复制值 |
| 主机 | principal.asset.hostname | 直接复制值 |
| client_ip | principal.asset.ip | 直接复制的值(在通过 grok 验证后作为 IP) |
| 主机 | principal.hostname | 直接复制值 |
| client_ip | principal.ip | 直接复制的值(在通过 grok 验证后作为 IP) |
| geo_city | principal.location.city | 直接复制值 |
| geo_country | principal.location.country_or_region | 直接复制值 |
| security_result | security_result | 直接复制值 |
| 网址 | target.url | 直接复制值 |
| metadata.product_name | 设置为“FASTLY_CDN” | |
| metadata.vendor_name | 设置为“FASTLY_CDN” |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。