收集 Fastly CDN 日志

解析器版本:2.0

支持的平台:

本文档介绍了如何使用 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 令牌

  1. 访问 https://manage.fastly.com,登录 Fastly 控制台。
  2. 点击右上角的用户图标。
  3. 前往账号 > 个人 API 令牌。
  4. 点击创建令牌。
  5. 在创建 API 令牌 对话框中,提供以下信息:
    • 名称:输入一个描述性名称(例如 Google SecOps S3 Logging Configuration)。
    • 类型:选择用户令牌。
    • 范围:选择全球访问权限(配置日志记录端点时必须选择此选项)。
    • 失效:选择永不过期或设置合适的失效日期。
  6. 点击创建令牌。
  7. 复制并妥善保存 API 令牌。

为 Google SecOps 配置 AWS S3 存储桶和 IAM

  1. 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
  2. 保存存储桶名称和区域以供日后参考(例如,fastly-cdn-logs)。
  3. 按照以下用户指南创建用户:创建 IAM 用户。
  4. 选择创建的用户。
  5. 选择安全凭据标签页。
  6. 在访问密钥部分中,点击创建访问密钥。
  7. 选择第三方服务作为使用情形。
  8. 点击下一步。
  9. 可选:添加说明标记。
  10. 点击创建访问密钥。
  11. 点击下载 .csv 文件以保存访问密钥和密钥,供日后参考。
  12. 点击完成。
  13. 选择权限标签页。
  14. 在权限政策部分中,点击添加权限。
  15. 选择添加权限。
  16. 选择直接附加政策。
  17. 搜索 AmazonS3FullAccess 政策。
  18. 选择相应政策。
  19. 点击下一步。
  20. 点击添加权限。

配置 Fastly S3 日志记录端点

方案 A:通过 Fastly 控制面板进行配置

  1. 登录 Fastly 控制台 (https://manage.fastly.com)
  2. 选择要为其配置日志记录的服务。
  3. 点击修改配置,然后选择克隆有效版本以创建新的草稿版本。
  4. 点击左侧导航菜单中的日志记录。
  5. 在 Amazon Web Services S3 部分中,点击创建端点。
  6. 在创建 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(每小时最终确定一次日志)。
  7. 点击高级选项以展开其他设置:

    高级设置:

    • 路径:输入 fastly-cdn/(用于在存储桶中整理日志的可选前缀)。
    • PGP 公钥:留空(此集成不需要加密)。
    • 选择日志行格式:选择空白(我们将使用自定义 JSON 格式)。
    • 压缩:选择 gzip(建议选择此选项以降低存储费用)。
    • 冗余级别:选择标准。
    • ACL:选择私密(推荐)。
    • 服务器端加密:选择无(或根据您的安全要求进行配置)。
    • 字节数上限:输入 0(无文件大小上限)。
  8. 点击创建以创建日志记录端点。

  9. 点击右上角的启用。

  10. 选择在正式版中启用以部署配置更改。

  11. 在确认对话框中,点击启用进行确认。

方案 B:通过 Fastly API 进行配置

如果您希望通过 API 配置日志记录,请使用以下方法:

  1. 通过控制面板或列出服务来获取 Fastly 服务 ID:

    curl -H "Fastly-Key: YOUR_FASTLY_TOKEN" https://api.fastly.com/service
    
  2. 克隆有效版本以创建新的草稿版本:

    curl -X PUT -H "Fastly-Key: YOUR_FASTLY_TOKEN" \
      "https://api.fastly.com/service/SERVICE_ID/version/ACTIVE_VERSION/clone"
    
  3. 在新草稿版本上创建 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"}'
    
  4. 激活新版本:

    curl -X PUT -H "Fastly-Key: YOUR_FASTLY_TOKEN" \
      "https://api.fastly.com/service/SERVICE_ID/version/NEW_VERSION/activate"
    

验证日志是否已传送到 S3

  1. 等待大约 1 小时(根据配置的周期),直到第一个日志文件最终确定。
  2. 在 AWS 控制台中,依次前往 S3 > 存储桶。
  3. 点击您的存储桶名称(例如 fastly-cdn-logs)。
  4. 前往 fastly-cdn/ 前缀文件夹。
  5. 验证是否正在创建命名模式类似于以下内容的日志文件:

    fastly-cdn/YYYY-MM-DD-HH-MM-SS-RANDOM_STRING.log.gz
    
  6. 下载示例日志文件,并验证 JSON 格式是否与您的配置相符。

在 Google SecOps 中配置 Feed 以注入 Fastly CDN 日志

  1. 前往 SIEM 设置 > Feed。
  2. 点击添加新 Feed。
  3. 在下一页上,点击配置单个 Feed。
  4. 为Feed 名称输入一个唯一的名称。
  5. 选择 Amazon S3 V2 作为来源类型。
  6. 选择 Fastly CDN 作为日志类型。
  7. 点击下一步,然后点击提交。
  8. 为以下字段指定值:

    • S3 URI:s3://fastly-cdn-logs/fastly-cdn/。
    • 源删除选项:根据您的偏好选择删除选项。
    • 文件存在时间上限:包含在过去指定天数内修改过的文件(默认值为 180 天)。
    • 访问密钥 ID:具有 S3 存储桶访问权限的用户访问密钥。
    • 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
    • 资源命名空间:资源命名空间。
    • 注入标签:要应用于此 Feed 中事件的标签。
  9. 点击下一步,然后点击提交。

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 专业人士的解答。