收集 Microsoft IIS 日志

支持的平台:

本文档介绍了如何使用 Bindplane 将 Microsoft Internet Information Services (IIS) 日志收集到 Google Security Operations。解析器首先会尝试通过移除不必要的字符和标准化字段名称来清理和规范化输入数据。然后,它使用一系列 grok 模式从各种 Microsoft IIS 日志格式中提取相关字段,并将它们映射到统一数据模型 (UDM)。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • 安装了 IIS 的 Windows Server 2016 或更高版本
  • 对 IIS 服务器的管理员访问权限
  • 如果通过代理运行,请确保防火墙端口已根据 Bindplane 代理要求打开

获取 Google SecOps 注入身份验证文件

  1. 登录 Google SecOps 控制台。
  2. 依次前往 SIEM 设置 > 收集代理
  3. 下载注入身份验证文件。将该文件安全地保存在将要安装 Bindplane 的系统上(例如,C:\SecOps\ingestion-auth.json)。

获取 Google SecOps 客户 ID

  1. 登录 Google SecOps 控制台。
  2. 依次前往 SIEM 设置 > 配置文件
  3. 复制并保存组织详细信息部分中的客户 ID

配置 IIS W3C 扩展日志记录

这是最关键的一步。您必须在 IIS 管理器中启用正确的 W3C 字段,以便 Google SecOps 能够正确解析您的日志,并可靠地进行检测。

打开 IIS 管理器

  1. 点击开始
  2. 输入 inetmgr 并按 Enter 键。
  3. 系统会打开 Internet Information Services (IIS) 管理器窗口。

替代方法

  1. Windows 键 + R
  2. 输入 inetmgr 并按 Enter 键。
  1. 连接窗格(左侧)中,展开您的服务器名称。
  2. 如需配置服务器范围的日志记录(推荐):
    • 点击根级别的服务器名称
  3. 如需配置特定于网站的日志记录,请执行以下操作:
    • 展开网站 > 点击特定网站(例如,默认网站)。
  4. 功能视图(中间窗格)中,双击 Logging

选择 W3C 扩展日志格式

  1. 日志记录页面上的日志文件部分中:
    • 格式下拉菜单中,选择 W3C
  2. 点击选择字段按钮。

配置 W3C 日志记录字段

重要提示:Google SecOps IIS 解析器支持正好 8 个字段配置。您必须启用以下模式中所有字段中的一个。启用不同的字段或混合使用模式会导致解析失败。

W3C 日志记录字段对话框中,根据以下一种模式选择字段:

模式 1:包含查询字符串和字节的完整网站上下文

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务名称 (s-sitename)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 服务器端口(s-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 发送的字节数 (sc-bytes)
  • 接收的字节数 (cs-bytes)

在以下情况下使用此模式:您的下游格式包含网站背景信息 + 查询字符串,并且您需要发送/接收的字节数,而您的流水线需要“username”和“referer”列(即使值为 -)。

模式 2:基本模式,包含子状态、Win32 状态和性能(无引荐来源网址)

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 服务器端口(s-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)
  • 所用时间 (time-taken)

在以下情况下使用此模式:您的流水线包含 Referer,但您需要详细的错误代码和延迟时间 (time-taken)。

模式 3:包含子状态、Win32 状态和性能(包含引荐来源网址)的基本模式

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 服务器端口(s-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)
  • 所用时间 (time-taken)

在以下情况下使用此模式:与模式 2 相同,但您的流水线包含 Referer 作为专用列。

模式 4:支持 TLS/协议版本,并支持 Referrer 和性能

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 客户端端口(c-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 协议版本 (cs-version)
  • 用户代理 (cs(User-Agent))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)
  • 所用时间 (time-taken)

在以下情况下使用此模式:您的下游格式明确记录了 cs-version(例如,HTTP/1.1),并包含时间信息,而且您还拥有一个专用列作为客户端端口。

模式 5:支持 TLS/协议版本且包含引荐来源网址(无性能)

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 客户端端口(c-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 协议版本 (cs-version)
  • 用户代理 (cs(User-Agent))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)

在以下情况下使用此模式:与模式 4 相同,但您的流水线不包含 time-taken

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 客户端端口(c-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • Cookie (cs(Cookie))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)

在以下情况下使用此模式:您的下游格式需要将 Cookie 和 Referer 作为专用列。

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 客户端端口(c-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • 引荐来源网址 (cs(Referer))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)

在以下情况下使用此模式:您的下游格式包含 Referer,但不包含 Cookie/时间/字节。

按以下确切顺序启用这些字段:

  • Date(日期)
  • 时间(时间)
  • 服务器 IP 地址 (s-ip)
  • 方法(cs-method)
  • URI 词干 (cs-uri-stem)
  • URI 查询 (cs-uri-query)
  • 客户端端口(c-port)
  • 用户名 (cs-username)
  • 客户端 IP 地址 (c-ip)
  • 用户代理 (cs(User-Agent))
  • 协议状态 (sc-status)
  • 协议子状态 (sc-substatus)
  • Win32 状态 (sc-win32-status)

在以下情况下使用此模式:您的下游格式不包含 Referer,并且您只需要核心请求上下文和状态代码。

请勿启用来自多个模式的字段。解析器需要以下确切配置之一。

应用配置

  1. 点击确定以关闭 W3C 日志记录字段对话框。
  2. 验证日志将写入的目录路径。
    • 默认值:%SystemDrive%\inetpub\logs\LogFiles
  3. 日志文件轮换下,选择每天(建议用于 Google SecOps 提取)。
  4. 点击操作窗格(右侧)中的应用

安装 Bindplane 代理

按照以下说明在 Windows 服务器上安装 Bindplane 代理。

Windows 安装

  1. 以管理员身份打开命令提示符PowerShell
  2. 运行以下命令:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

其他安装资源

  • 如需了解其他安装选项,请参阅此安装指南

配置 Bindplane 代理以注入 IIS 日志并将其发送到 Google SecOps

停止 Bindplane 服务

  • 在修改配置文件之前,请先停止服务:

    Stop-Service "observIQ OpenTelemetry Collector"
    

修改配置文件

  1. 找到 config.yaml 文件。
    • 默认路径:C:\Program Files\observIQ OpenTelemetry Collector\config.yaml
  2. 使用文本编辑器(例如记事本、VS Code 或 Notepad++)以管理员身份打开该文件。
  3. 将整个内容替换为以下配置:

    receivers:
      iis:
        collection_interval: 60s
    
    processors:
      resourcedetection:
        detectors: ["system"]
        system:
          hostname_sources: ["os"]
      normalizesums:
      batch:
    
    exporters:
      chronicle/iis:
        endpoint: malachiteingestion-pa.googleapis.com
        creds: 'C:\SecOps\ingestion-auth.json'
        log_type: 'IIS'
        override_log_type: false
        raw_log_field: body
        customer_id: '<CUSTOMER_ID>'
        compression: gzip
    
    service:
      pipelines:
        logs/iis:
          receivers:
            - iis
          processors:
            - resourcedetection
            - normalizesums
            - batch
          exporters:
            - chronicle/iis
    
    • 替换以下占位符:
      • creds: - 您的提取身份验证文件的路径(例如,C:\SecOps\ingestion-auth.json)。
      • customer_id: - 获取 Google SecOps 客户 ID 部分中的实际 Google SecOps 客户 ID。

重启 Bindplane 代理以应用更改

  1. 保存 config.yaml 文件后,重启 Bindplane 服务:

    Start-Service "observIQ OpenTelemetry Collector"
    
  2. 验证服务是否正在运行:

    Get-Service "observIQ OpenTelemetry Collector"
    
  • 预期输出:

    Status   Name                               DisplayName
    ------   ----                               -----------
    Running  observiq-otel-collector            observIQ OpenTelemetry Collector
    

UDM 映射表

日志字段 UDM 映射 逻辑
@timestamp metadata.event_timestamp 原始日志中记录的事件时间戳。
@version metadata.product_version IIS 服务器的版本。
AgentDevice additional.fields.AgentDevice.value.string_value 生成日志的设备。
AgentLogFile additional.fields.AgentLogFile.value.string_value 日志文件的名称。
ASP.NET_SessionId network.session_id 用户的会话 ID。
c-ip principal.ip 客户端的 IP 地址。
渠道 security_result.about.resource.attribute.labels.Channel.value 记录事件的渠道。
ChannelID security_result.about.resource.attribute.labels.ChannelID.value 记录相应事件的渠道的 ID。
计算机 target.hostname 目标机器的主机名。
cs-bytes network.received_bytes 从客户端接收的字节数。
cs-host principal.hostname、principal.asset.hostname 客户端的主机名。
cs-method network.http.method 客户端使用的 HTTP 方法。
cs-uri-query target.url 客户端请求的网址的查询字符串。
cs-uri-stem target.url 客户端所请求网址的路径。
cs-username principal.user.user_display_name 客户端的用户名。
cs-version network.tls.version_protocol 客户端使用的 HTTP 版本。
cs(Cookie) 用于提取 Cookie 信息。
cs(Referer) network.http.referral_url 将客户端引荐到当前网页的网址。
cs(User-Agent) network.http.user_agent 客户端的用户代理。
csbyte network.received_bytes 从客户端接收的字节数。
cshost principal.hostname、principal.asset.hostname 客户端的主机名。
csip principal.ip、principal.asset.ip 客户端的 IP 地址。
csmethod network.http.method 客户端使用的 HTTP 方法。
csreferer network.http.referral_url 将客户端引荐到当前网页的网址。
csuseragent network.http.user_agent 客户端的用户代理。
csusername principal.user.user_display_name 客户端的用户名。
csversion network.tls.version_protocol 客户端使用的 HTTP 版本。
日期 用于在原始日志时间戳无效时构建事件时间戳。
说明 security_result.description 活动说明。
devicename target.hostname 目标机器的主机名。
dst_ip target.ip、target.asset.ip 目标机器的 IP 地址。
dst_port target.port 目标机器的端口号。
时长 请求的时长(以毫秒为单位)。
EventEnqueuedUtcTime additional.fields.EventEnqueuedUtcTime.value.string_value 相应事件在队列中排队的时间(采用世界协调时间 [UTC])。
EventID metadata.product_log_id 活动的 ID。
EventProcessedUtcTime additional.fields.EventProcessedUtcTime.value.string_value 事件处理时间(世界协调时间)。
EventTime metadata.event_timestamp 事件的时间戳。
EventType metadata.product_event_type 事件的类型。
file_path target.file.full_path 涉及相应事件的文件的完整路径。
FilterId security_result.about.resource.attribute.labels.FilterId.value 过滤器的 ID。
FilterKey security_result.about.resource.attribute.labels.FilterKey.value 过滤器的键。
FilterName security_result.about.resource.attribute.labels.FilterName.value 过滤器的名称。
FilterType security_result.about.resource.attribute.labels.FilterType.value 过滤器的类型。
主机 target.hostname 目标机器的主机名。
host.architecture principal.asset.hardware.cpu_platform 宿主机的架构。
host.geo.name additional.fields.geo_name.value.string_value 宿主机的地理位置。
host.hostname target.hostname、target.asset.hostname 宿主机的主机名。
host.id observer.asset_id 宿主机的 ID。
host.ip principal.ip、principal.asset.ip 宿主机的 IP 地址。
host.mac principal.mac 宿主机设备的 MAC 地址。
host.os.build additional.fields.os_build.value.string_value 宿主机上操作系统的 build 编号。
host.os.kernel principal.platform_patch_level 宿主机上操作系统的内核版本。
host.os.name additional.fields.os_name.value.string_value 宿主机上操作系统的名称。
host.os.platform principal.platform 宿主机上操作系统的平台。
host.os.version principal.platform_version 宿主机上的操作系统版本。
http_method network.http.method 客户端使用的 HTTP 方法。
http_response network.http.response_code HTTP 响应代码。
http_status_code network.http.response_code 相应请求的 HTTP 状态代码。
http_substatus additional.fields.sc_substatus.value.string_value 响应的 HTTP 子状态代码。
实例 additional.fields.instance.value.string_value 任务的实例 ID。
intermediary_devicename intermediary.hostname、intermediary.asset.hostname 中间设备的 hostname。
json_message JSON 格式的原始日志消息。
kv_fields 用于从原始日志消息中提取键值对。
LayerKey security_result.about.resource.attribute.labels.LayerKey.value 图层的键。
LayerName security_result.about.resource.attribute.labels.LayerName.value 图层的名称。
LayerId security_result.about.resource.attribute.labels.LayerId.value 图层的 ID。
log.file.path target.file.full_path 日志文件的完整路径。
log.offset metadata.product_log_id 相应事件在日志文件中的偏移量。
logstash.collect.host observer.hostname 收集日志的机器的主机名。
logstash.process.host intermediary.hostname 处理日志的机器的主机名。
logstash_json_message JSON 格式的原始日志消息。
消息 security_result.description 原始日志消息。
相关政府部门 additional.fields.ministry.value.string_value 与活动相关的部门。
name 实体的名称。
NewValue additional.fields.NewValue.value.string_value 配置设置的新值。
OldValue additional.fields.OldValue.value.string_value 配置设置的旧值。
端口 principal.port 客户端的端口号。
priority_code syslog 消息的优先级代码。
ProcessID principal.process.pid 生成相应事件的进程的进程 ID。
ProviderGuid security_result.about.resource.attribute.labels.ProviderGuid.value 提供商的 GUID。
ProviderKey security_result.about.resource.attribute.labels.ProviderKey.value 提供商的密钥。
ProviderName security_result.about.resource.attribute.labels.ProviderName.value 提供方的名称。
referrer_url network.http.referral_url 将客户端引荐到当前网页的网址。
request_url target.url 客户端请求的网址。
s-computername target.hostname 目标机器的主机名。
s-ip target.ip、target.asset.ip 目标机器的 IP 地址。
s-port target.port 目标机器的端口号。
s-sitename additional.fields.sitename.value.string_value 网站的名称。
sc-bytes network.sent_bytes 发送到客户端的字节数。
sc-status network.http.response_code 相应请求的 HTTP 状态代码。
sc-substatus additional.fields.sc_substatus.value.string_value 响应的 HTTP 子状态代码。
sc-win32-status 响应的 Windows 状态代码。
scbyte network.sent_bytes 发送到客户端的字节数。
scstatus network.http.response_code 相应请求的 HTTP 状态代码。
和程度上减少 security_result.severity 事件的严重程度。
service.type additional.fields.service_type.value.string_value 服务的类型。
sIP principal.ip、principal.asset.ip 客户端的 IP 地址。
sPort principal.port 客户端的端口号。
sSiteName additional.fields.sitename.value.string_value 网站的名称。
src_ip principal.ip、principal.asset.ip、observer.ip 客户端的 IP 地址。
src_port principal.port 客户端的端口号。
sysdate syslog 消息的日期和时间。
syslog_facility security_result.severity_details syslog 消息的设备。
syslog_pri syslog 消息的优先级。
syslog_severity security_result.severity_details syslog 消息的严重程度。
syslog_severity_code syslog 消息的严重程度代码。
标签 security_result.rule_name 与活动关联的标记。
任务 additional.fields.task.value.string_value 任务的名称。
时间 用于在原始日志时间戳无效时构建事件时间戳。
time-taken 请求的时长(以毫秒为单位)。
uri_query target.url 客户端请求的网址的查询字符串。
user_agent network.http.user_agent 客户端的用户代理。
用户名 target.user.userid 用户的用户名。
UserSid target.user.windows_sid 用户的 Windows SID。
权重 security_result.about.resource.attribute.labels.Weight.value 过滤器的权重。
win32_status 响应的 Windows 状态代码。
xforwardedfor X-Forwarded-For 标头,包含以英文逗号分隔的 IP 地址列表。
metadata.log_type "IIS"
network.direction "INBOUND"
metadata.vendor_name “Microsoft”
metadata.product_name “Internet Information Server”
metadata.event_type "NETWORK_HTTP"、"USER_UNCATEGORIZED"、"GENERIC_EVENT"、"STATUS_UPDATE"、"USER_LOGOUT"、"USER_LOGIN"
extensions.auth.type "MACHINE"

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。