收集 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 令牌
- 登录 Fastly 控制台 (https://manage.fastly.com)。
- 点击右上角的用户图标 。
- 依次前往账号 > 个人 API 令牌。
- 点击 Create Token 。
- 在 Create API Token 对话框中,提供以下信息:
- 名称:输入描述性名称(例如
Google SecOps S3 Logging Configuration)。 - 类型:选择 User token。
- 范围:选择 Global access(配置日志记录端点时需要此选项)。
- 到期时间:选择 Never expire 或设置适当的到期日期。
- 名称:输入描述性名称(例如
- 点击 Create Token 。
- 复制并安全地保存 API 令牌。
为 Google SecOps 配置 AWS S3 存储桶和 IAM
- 按照以下用户指南创建 Amazon S3 存储桶 :创建存储桶。
- 保存存储桶的名称 和区域 以供日后参考(例如
fastly-cdn-logs)。 - 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户 。
- 选择安全凭据 标签页。
- 在访问密钥 部分中,点击 Create Access Key 。
- 在使用情形 部分,选择 Third-party service 。
- 点击下一步 。
- 可选:添加说明标签。
- 点击 Create access key 。
- 点击下载 .csv 文件 以保存 Access Key 和 Secret Access Key 以供日后参考。
- 点击完成 。
- 选择权限 标签页。
- 在权限政策 部分中,点击 Add permissions 。
- 选择 Add permissions 。
- 选择 Attach policies directly 。
- 搜索 AmazonS3FullAccess 政策。
- 选择该政策。
- 点击下一步 。
- 点击 Add permissions 。
配置 Fastly S3 日志记录端点
方案 A:通过 Fastly 控制台进行配置
- 登录 Fastly 控制台 (https://manage.fastly.com)
- 选择要为其配置日志记录的服务 。
- 点击 Edit configuration ,然后选择 Clone active version 以创建新的草稿版本。
- 点击左侧导航菜单中的 Logging 。
- 在 Amazon Web Services S3 部分中,点击 Create endpoint 。
在 Create an Amazon S3 endpoint 表单中,提供以下配置详细信息:
基本设置:
- 名称:输入描述性名称(例如
secops-s3-logs)。 - 放置位置:选择 Format Version Default (推荐)。
日志格式:输入以下 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)。 - 访问方法:选择 User Credentials
- 访问密钥:输入第 11 步中的 AWS 访问密钥。
- 密钥:输入第 11 步中的 AWS 私有访问密钥。
- 周期:输入
3600(日志每小时最终确定一次)。
点击高级选项 以展开其他设置:
高级设置:
- 路径:输入
fastly-cdn/(用于在存储桶中整理日志的可选前缀)。 - PGP 公钥:留空(此集成不需要加密)。
- 选择日志行格式:选择 Blank(我们将使用自定义 JSON 格式)。
- 压缩:选择 gzip (推荐,可降低存储费用)。
- 冗余级别:选择 Standard。
- ACL:选择 private (推荐)。
- 服务器端加密:选择 None (或根据您的安全要求进行配置)。
- 最大字节数:输入
0(没有文件大小上限)。
- 路径:输入
点击 Create 以创建日志记录端点。
点击右上角的 Activate 。
选择 Activate on Production 以部署配置更改。
在确认对话框中,点击 Activate 以确认。
方案 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。
- 点击 Add New Feed 。
- 在下一页上,点击 Configure a single feed 。
- 为 Feed name 输入一个唯一的名称。
- 在 Source type 部分,选择 Amazon S3 V2 。
- 在 Log type 部分,选择 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 | 直接复制值 |
| host | principal.asset.hostname | 直接复制值 |
| client_ip | principal.asset.ip | 直接复制值(在 grok 验证为 IP 后) |
| host | principal.hostname | 直接复制值 |
| client_ip | principal.ip | 直接复制值(在 grok 验证为 IP 后) |
| geo_city | principal.location.city | 直接复制值 |
| geo_country | principal.location.country_or_region | 直接复制值 |
| security_result | security_result | 直接复制值 |
| url | target.url | 直接复制值 |
| metadata.product_name | 设置为“FASTLY_CDN” | |
| metadata.vendor_name | 设置为“FASTLY_CDN” |