收集 Microsoft IIS 日志
本指南介绍了如何使用 Bindplane 将 Microsoft Internet Information Services (IIS) 日志注入到 Google Security Operations。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 安装了 IIS 的 Windows Server 2016 或更高版本
- 对 IIS 服务器的管理员访问权限
- 如果通过代理运行,请确保防火墙端口已根据 Bindplane 代理要求打开
获取 Google SecOps 注入身份验证文件
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载注入身份验证文件。将文件安全地保存在将要安装 Bindplane 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 个人资料。
- 复制并保存组织详细信息部分中的客户 ID。
配置 IIS W3C 扩展日志记录
打开 IIS 管理器
- 点击开始。
- 输入
inetmgr并按 Enter 键。 - 系统会打开 Internet Information Services (IIS) 管理器窗口。
替代方法:
- 按 Windows 键 + R。
- 输入
inetmgr并按 Enter 键。
前往日志记录配置
- 在连接窗格中,展开您的服务器名称。
- 如需配置服务器范围的日志记录(推荐):
- 点击根级别的服务器名称。
- 如需配置特定于网站的日志记录,请执行以下操作:
- 展开网站,然后点击具体网站(例如,默认网站)。
- 在功能视图中,双击日志记录。
选择 W3C 扩展日志格式
- 在日志记录页面上的日志文件部分中:
- 在格式下拉菜单中,选择 W3C。
- 点击选择字段按钮。
配置 W3C 日志记录字段
在 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)
模式 2:基本模式,包含子状态和效果
如果您需要详细的错误代码(子状态、Win32 状态)和请求时间来排查问题,请使用此模式。
按以下确切顺序启用这些字段:
- Date(日期)
- 时间(时间)
- 服务器 IP 地址 (s-ip)
- 方法(cs-method)
- URI 词干 (cs-uri-stem)
- 服务器端口(s-port)
- 用户名 (cs-username)
- 客户端 IP 地址 (c-ip)
- 用户代理 (cs(User-Agent))
- 引荐来源网址 (cs(Referer))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 所用时间 (time-taken)
模式 3:包含完整指标的网站上下文(推荐用于生产环境)
如果您需要包含网站标识、详细错误、带宽指标和性能数据的全面日志记录,请使用此模式。
按以下确切顺序启用这些字段:
- 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))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 发送的字节数 (sc-bytes)
- 接收的字节数 (cs-bytes)
- 所用时间 (time-taken)
模式 4:具有完整上下文的多网站
此模式在功能上与模式 3 完全相同。
如果您有多个网站,并且需要全面的可观测性,请使用此模式。
按以下确切顺序启用这些字段:
- 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))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 发送的字节数 (sc-bytes)
- 接收的字节数 (cs-bytes)
- 所用时间 (time-taken)
模式 5:包含完整指标的网站上下文(替代)
此模式在功能上与模式 3 和 4 完全相同。
按以下确切顺序启用这些字段:
- 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))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 发送的字节数 (sc-bytes)
- 接收的字节数 (cs-bytes)
- 所用时间 (time-taken)
模式 6:具有子状态和性能的 TLS 感知
当您需要跟踪 HTTP/HTTPS 协议版本(HTTP/1.1、HTTP/2、HTTP/3)以进行安全分析或 TLS 故障排除时,请使用此模式。
按以下确切顺序启用这些字段:
- Date(日期)
- 时间(时间)
- 服务器 IP 地址 (s-ip)
- 方法(cs-method)
- URI 词干 (cs-uri-stem)
- URI 查询 (cs-uri-query)
- 服务器端口(s-port)
- 用户名 (cs-username)
- 客户端 IP 地址 (c-ip)
- 协议版本 (cs-version)
- 用户代理 (cs(User-Agent))
- 引荐来源网址 (cs(Referer))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 所用时间 (time-taken)
模式 7:支持 TLS 但没有性能指标
在以下情况下使用此模式:与模式 6 相同,但您不需要“完成时间”指标。
按以下确切顺序启用这些字段:
- Date(日期)
- 时间(时间)
- 服务器 IP 地址 (s-ip)
- 方法(cs-method)
- URI 词干 (cs-uri-stem)
- URI 查询 (cs-uri-query)
- 服务器端口(s-port)
- 用户名 (cs-username)
- 客户端 IP 地址 (c-ip)
- 协议版本 (cs-version)
- 用户代理 (cs(User-Agent))
- 引荐来源网址 (cs(Referer))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
模式 8:极简风格,兼具性能
如果您需要包含效果指标的最低限度日志记录,但不在意查询字符串、引荐来源网址或协议版本,请使用此模式。
按以下确切顺序启用这些字段:
- Date(日期)
- 时间(时间)
- 服务器 IP 地址 (s-ip)
- 方法(cs-method)
- URI 词干 (cs-uri-stem)
- 服务器端口(s-port)
- 用户名 (cs-username)
- 客户端 IP 地址 (c-ip)
- 用户代理 (cs(User-Agent))
- 协议状态 (sc-status)
- 协议子状态 (sc-substatus)
- Win32 状态 (sc-win32-status)
- 所用时间 (time-taken)
模式选择指南
对于大多数部署,请使用模式 1 或模式 3。
- 模式 1:最适合注重安全性的部署,包含多个网站(包括引荐来源网址、查询字符串、网站名称)。
- 模式 3:最适合需要全面指标(包括子状态、Win32 错误、带宽、时间、网站名称)的生产环境。
- 模式 6/7:如果您需要跟踪 HTTP 协议版本(HTTP/2 采用情况、TLS 故障排除),请使用此模式。
- 模式 2/8:用于记录最少的日志,但包含错误详情。
应用配置
- 点击确定以关闭 W3C 日志记录字段对话框。
- 验证日志将写入的目录路径。
- 默认值:
%SystemDrive%\inetpub\logs\LogFiles
- 默认值:
- 在日志文件轮换下,选择每天(建议用于 Google SecOps 提取)。
- 在操作窗格中,点击应用。
验证 IIS 日志记录
- 通过在浏览器中打开网页,为您的 IIS 网站生成测试流量。
- 前往日志目录:
C:\inetpub\logs\LogFiles\W3SVC1\ - 在记事本中打开最新的日志文件(例如
u_ex251020.log)。 验证
#Fields:行是否包含您启用的所有字段。示例
#Fields:行:#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken日志条目示例:
2025-10-20 14:23:15 Default_Web_Site SERVER01 192.168.1.10 GET /index.html - 80 - 203.0.113.45 Mozilla/5.0+(Windows+NT+10.0) - 200 0 0 1234 567 125
安装 Bindplane 代理
按照以下说明在 Windows 服务器上安装 Bindplane 代理。
Windows 安装
- 以管理员身份打开命令提示符或 PowerShell。
运行以下命令:
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"
修改配置文件
- 找到
config.yaml文件。- 默认路径:
C:\Program Files\observIQ OpenTelemetry Collector\config.yaml
- 默认路径:
- 使用文本编辑器(例如记事本、VS Code 或 Notepad++)以管理员身份打开该文件。
将整个内容替换为以下配置:
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 代理以应用更改
保存
config.yaml文件后,重启 Bindplane 服务:Start-Service "observIQ OpenTelemetry Collector"验证服务是否正在运行:
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 | 任务的名称。 |
| 时间 | 用于在原始日志时间戳无效时构建事件时间戳。 | |
| 所用时间 | 请求的时长(以毫秒为单位)。 | |
| 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 专业人士的解答。