收集 IBM 大型主机存储日志
本文档介绍了如何使用 Bindplane 将 IBM Mainframe Storage 日志收集到 Google Security Operations。
IBM 大型机存储包括 IBM DS8000 系列(包括 DS8900F 和 DS8880)和 IBM FlashSystem 系列(包括 FlashSystem 5000、5200、5300、7200、7300、9200 和 9500)。这些企业存储系统可为大型机和开放式系统环境提供高性能块存储,并内置了 syslog 转发功能,可用于转发审核日志、系统事件、身份验证事件和操作消息。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- Windows Server 2016 或更高版本,或者具有
systemd的 Linux 主机 - Bindplane 代理与 IBM 存储系统管理 IP 地址之间的网络连接
- 如果在代理后面运行,请确保防火墙端口已根据 Bindplane 代理要求打开
- 对 IBM DS8000 存储管理 GUI 或 IBM FlashSystem 管理 GUI 的管理员级访问权限
- 对于 IBM FlashSystem,对 CLI 的 SSH 访问权限(可选,用于基于 CLI 的配置)
获取 Google SecOps 注入身份验证文件
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载数据注入身份验证文件。将该文件安全地保存在将要安装 Bindplane 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 配置文件。
- 复制并保存组织详细信息部分中的客户 ID。
安装 Bindplane 代理
按照以下说明在 Windows 或 Linux 操作系统上安装 Bindplane 代理。
Windows 安装
- 以管理员身份打开命令提示符或 PowerShell。
运行以下命令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet等待安装完成。
运行以下命令,验证安装是否成功:
sc query observiq-otel-collector
该服务应显示为 正在运行。
Linux 安装
- 打开具有 root 或 sudo 权限的终端。
运行以下命令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh等待安装完成。
运行以下命令,验证安装是否成功:
sudo systemctl status observiq-otel-collector该服务应显示为有效(正在运行)。
其他安装资源
如需了解其他安装选项和问题排查信息,请参阅 Bindplane 代理安装指南。
配置 Bindplane 代理以注入 syslog 并将其发送到 Google SecOps
找到配置文件
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
修改配置文件
将
config.yaml的全部内容替换为以下配置:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/ibm_storage: compression: gzip creds_file_path: '<CREDS_FILE_PATH>' customer_id: '<CUSTOMER_ID>' endpoint: <REGION_ENDPOINT> log_type: IBM_MAINFRAME_STORAGE raw_log_field: body ingestion_labels: log_source: ibm_storage service: pipelines: logs/ibm_storage_to_chronicle: receivers: - udplog exporters: - chronicle/ibm_storage
配置参数
替换以下占位符。
导出器配置:
<CREDS_FILE_PATH>:提取身份验证文件的完整路径: - Linux:/etc/bindplane-agent/ingestion-auth.json- Windows:C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json<CUSTOMER_ID>:从 Google SecOps 控制台复制的客户 ID<REGION_ENDPOINT>:区域端点网址: - 美国:malachiteingestion-pa.googleapis.com- 欧洲:europe-malachiteingestion-pa.googleapis.com- 亚洲:asia-southeast1-malachiteingestion-pa.googleapis.com- 如需查看完整列表,请参阅区域端点配置示例(通过 UDP syslog 的 IBM FlashSystem)
receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/ibm_storage: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6' endpoint: malachiteingestion-pa.googleapis.com log_type: IBM_MAINFRAME_STORAGE raw_log_field: body ingestion_labels: log_source: ibm_storage service: pipelines: logs/ibm_storage_to_chronicle: receivers: - udplog exporters: - chronicle/ibm_storage配置示例(通过 TCP syslog 的 IBM DS8000)
receivers: tcplog: listen_address: "0.0.0.0:514" exporters: chronicle/ibm_storage: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6' endpoint: malachiteingestion-pa.googleapis.com log_type: IBM_MAINFRAME_STORAGE raw_log_field: body ingestion_labels: log_source: ibm_ds8000 service: pipelines: logs/ibm_storage_to_chronicle: receivers: - tcplog exporters: - chronicle/ibm_storage
保存配置文件
修改后,保存文件:
- Linux:依次按
Ctrl+O、Enter和Ctrl+X - Windows:依次点击文件 > 保存
重启 Bindplane 代理以应用更改
如需在 Linux 中重启 Bindplane 代理,请执行以下操作:
运行以下命令:
sudo systemctl restart observiq-otel-collector验证服务是否正在运行:
sudo systemctl status observiq-otel-collector检查日志是否存在错误:
sudo journalctl -u observiq-otel-collector -f
如需在 Windows 中重启 Bindplane 代理,请执行以下操作:
请从下列选项中选择一项:
以管理员身份运行命令提示符或 PowerShell:
net stop observiq-otel-collector && net start observiq-otel-collector服务控制台:
- 按
Win+R,输入services.msc,然后按 Enter 键。 - 找到 observIQ OpenTelemetry 收集器。
- 右键点击并选择重新启动。
- 按
验证服务是否正在运行:
sc query observiq-otel-collector检查日志是否存在错误:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
配置 IBM Mainframe Storage syslog 转发
在特定的 IBM 存储系统上配置 syslog 转发。请按照适用于您产品系列的说明操作。
选项 A:在 IBM DS8000 系列(DS8900F、DS8880)上配置 syslog
IBM DS8000 存储管理 GUI 支持将审核日志、GUI 事件信息、登录/退出事件和命令审核轨迹转发到远程 Syslog 服务器。DS8000 最多支持 8 个 syslog 目标服务器。默认情况下,DS8000 syslog 使用端口 514 上的 TCP 协议。
- 使用具有管理员角色的账号登录 DS8000 存储管理 GUI。
- 依次前往设置 > 通知。
- 在 Syslog 页面上,点击添加 Syslog 服务器。
- 在添加 Syslog 服务器窗口中,提供以下配置详细信息:
- IP 地址:输入 Bindplane 代理主机(例如
192.168.1.100)的 IP 地址。 - 端口:输入
514。
- IP 地址:输入 Bindplane 代理主机(例如
点击确定。
选项 B:在 IBM FlashSystem(5000、5200、5300、7200、7300、9200、9500)上配置 syslog
基于 IBM Storage Virtualize 的 IBM FlashSystem 系统支持通过管理 GUI 和 CLI 进行 syslog 转发。系统最多支持 6 个 syslog 服务器,并且可以使用 UDP、TCP 或 TLS 协议传输消息。
使用管理 GUI
- 登录 IBM FlashSystem 管理 GUI。
- 依次前往设置 > 通知 > Syslog。
- 点击添加 Syslog 服务器,打开添加 Syslog 服务器窗口。
- 选择协议:
- UDP:减少系统和网络开销。默认端口为
514。 - TCP:提供可靠的传送。默认端口为
6514。 - TLS:使用 TLS 发送加密的 syslog 消息。
- UDP:减少系统和网络开销。默认端口为
- 输入 Bindplane 代理主机和端口号的 IP 地址。
- 点击 Add(添加)。
使用 CLI (SSH)
- 使用管理员账号通过 SSH 连接到 IBM FlashSystem 系统。
运行以下命令以创建启用了所有日志类型的 syslog 服务器:
mksyslogserver -name chronicle -ip <BINDPLANE_IP> -protocol udp -port 514 -facility 4 -error on -warning on -info on -audit on -login on将
<BINDPLANE_IP>替换为 Bindplane 代理主机 IP 地址。运行以下命令,验证 syslog 服务器是否已创建:
lssyslogserver输出会显示已配置的 syslog 服务器及其 ID、名称、IP 地址、端口、协议和通知设置。
常见配置的 CLI 示例
创建具有以下功能的 Syslog 服务器:使用 UDP 协议、端口 514、扩展格式、审核和身份验证日志记录:
mksyslogserver -name chronicle -ip 192.168.1.100 -facility 4 -protocol udp -port 514 -error on -warning on -info on -audit on -login on创建使用 TCP 端口 6514 的 Syslog 服务器:
mksyslogserver -name chronicle -ip 192.168.1.100 -facility 4 -protocol tcp -port 6514 -error on -warning on -info on -audit on -login on修改现有 syslog 服务器以启用审核日志记录:
chsyslogserver -audit on <syslog_server_id>移除 syslog 服务器:
rmsyslogserver <syslog_server_id>
FlashSystem syslog 通知类型
下表介绍了 IBM FlashSystem 上可用的 syslog 通知类型:
| 通知类型 | CLI 参数 | 默认 | 说明 |
|---|---|---|---|
| 错误 | -error on|off |
开启 | 系统存在严重问题 |
| 警告 | -warning on|off |
开启 | 问题或意外情况 |
| 信息 | -info on|off |
开启 | 预期操作已完成 |
| 审核日志 | -audit on|off |
关闭 | CLI 或管理 GUI 操作 |
| 身份验证日志 | -login on|off |
关闭 | 成功和失败的身份验证尝试 |
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| device_vendor | about.asset.asset_id | 由 device_vendor、device_product 和 deviceExternalId 连接而成,格式为“%{device_vendor}.%{device_product}:%{deviceExternalId}” |
| device_product | about.asset.asset_id | |
| deviceExternalId | about.asset.asset_id | |
| IPv6_Address | about.ip | 直接复制值 |
| dvcmac | about.mac | 如果 dvcmac 中的 MAC 有效,则为 dvcmac 中的值;否则,如果已提取,则为 mac_address 中的值 |
| mac_address | about.mac | |
| fname | about.file.full_path | 如果不是“N/A”,则直接复制值 |
| fileHash | about.file.full_path | 如果不是哈希,则直接复制值 |
| fileHash | about.file.sha256 | 如果匹配哈希模式,则直接复制值 |
| _hash | about.file.sha256 | 直接复制值 |
| fsize | about.file.size | 已转换为 uinteger |
| File_name | about.file.full_path | 如果 File_name 不为空,则使用 File_name 中的值;否则,如果 Object 不为空,则使用 Object 中的值;否则,如果 Objekt 不为空,则使用 Objekt 中的值;否则,使用 Infected_Resource 中的值 |
| 对象 | about.file.full_path | |
| Objekt | about.file.full_path | |
| Infected_Resource | about.file.full_path | |
| 关于 | 关于 | 合并自“关于”页面 |
| additional_cs1 | additional.fields | 从各种 additional_* 字段(例如 additional_cs1、additional_cs2 等)合并而来。 |
| additional_cs2 | additional.fields | |
| cs1 | additional.fields | 来自 cs1Label 的键,来自 cs1 的值 |
| cs1Label | additional.fields | |
| cs2 | additional.fields | 来自 cs2Label 的键,来自 cs2 的值 |
| cs2Label | additional.fields | |
| cs3 | additional.fields | 来自 cs3Label 的键,来自 cs3 的值(如果不为空) |
| cs3Label | additional.fields | |
| cs4 | additional.fields | 来自 cs4Label 的键,来自 gsub 后的 cs4 的值 |
| cs4Label | additional.fields | |
| cs5 | additional.fields | 如果不是“NA”,则键来自 cs5Label,值来自 cs5 |
| cs5Label | additional.fields | |
| cs6 | additional.fields | 来自 cs6Label 的键,来自 cs6 的值(如果不为空) |
| cs6Label | additional.fields | |
| cs7 | additional.fields | 来自 cs7Label 的键,来自 cs7 的值(如果不为空) |
| cs7Label | additional.fields | |
| flexString1 | additional.fields | 键来自 flexString1Label,值来自 flexString1 |
| flexString1Label | additional.fields | |
| cn1 | additional.fields | 键来自 cn1Label,值来自 cn1 |
| cn1Label | additional.fields | |
| cn2 | additional.fields | 键来自 cn2Label,值来自 cn2 |
| cn2Label | additional.fields | |
| cn3 | additional.fields | 来自 cn3Label 的键,来自 cn3 的值(如果不为空) |
| cn3Label | additional.fields | |
| cfp1 | additional.fields | 键来自 cfp1Label,值来自 cfp1 |
| cfp1Label | additional.fields | |
| cfp2 | additional.fields | 键来自 cfp2Label,值来自 cfp2 |
| cfp2Label | additional.fields | |
| cfp3 | additional.fields | 键来自 cfp3Label,值来自 cfp3 |
| cfp3Label | additional.fields | |
| cfp4 | additional.fields | 来自 cfp4Label 的键,来自 cfp4 的值 |
| cfp4Label | additional.fields | |
| eventId | additional.fields | 键“eventId”,值来自 eventId |
| devicePayloadId | additional.fields | 键“devicePayloadId”,来自 devicePayloadId 的值 |
| fname | additional.fields | 键“fname”,如果 fname 不是“N/A”,则值为 fname |
| cs3Label | additional.fields | 键“cs3Label”,如果 cs3 为空,则使用 cs3Label 中的值 |
| cs4Label | additional.fields | 键“cs4Label”,如果 cs4 为空,则使用 cs4Label 中的值 |
| cs5 | additional.fields | 键“cs5 Label”,如果 cs5Label 为空,则取自 cs5 的值 |
| principal_asset_hostname | additional.fields | 键“asset_host_name”,如果与 principal_asset_hostname 不同,则取自该值 |
| target_asset_hostname | additional.fields | 键“device_host_name”,如果不同,则为 target_asset_hostname 中的值 |
| ssh_key | additional.fields | 键“ssh_key”,如果不是哈希值,则为 ssh_key 中的值 |
| 评论 | additional.fields | 键“Comment”,来自 try_message 的值 |
| 操作名称 | additional.fields | 键“操作名称”,值来自 action_name |
| 错误代码 | additional.fields | 键“错误代码”,值来自 error_code |
| rsyslog 模块 | additional.fields | 键“rsyslog Module”,值来自模块或 module_name |
| 更多信息 | additional.fields | 键“更多信息”,值来自 try_message |
| 操作类型 | additional.fields | 键“Action Type”,值来自 action_type |
| 已收到 | metadata.collected_timestamp | 使用日期匹配功能从 Received 或 Mottatt 中解析 |
| Mottatt | metadata.collected_timestamp | |
| rt | metadata.event_timestamp | 通过日期匹配(带时区)从 rt 解析 |
| file_full_path | metadata.event_type | 如果 file_full_path 不为空,则设置为“PROCESS_UNCATEGORIZED”;如果 event_name 位于特定值中,则设置为“SCAN_UNCATEGORIZED”;如果 duser 不为空,则设置为“USER_UNCATEGORIZED”;如果 principal_hostname_found 和 target_ip_found 为 true,则设置为“NETWORK_CONNECTION”;如果 principal_hostname_found 或 src 不为空,则设置为“STATUS_UPDATE”;否则设置为“GENERIC_EVENT” |
| event_name | metadata.event_type | |
| duser | metadata.event_type | |
| principal_hostname_found | metadata.event_type | |
| device_product | metadata.product_name | 直接复制值 |
| device_vendor | metadata.vendor_name | 直接复制值 |
| device_version | metadata.product_version | 直接复制值 |
| externalId | metadata.product_log_id | 直接复制值 |
| event_name | metadata.product_event_type | 如果两者都存在,则串联为“[%{device_event_class_id}] - %{event_name}”,否则为 device_event_class_id 或 event_name |
| device_event_class_id | metadata.product_event_type | |
| app_protocol_src | network.application_protocol | 根据 app_protocol_src 匹配预定义的值(例如“22”到“SSH”、“25”到“SMTP”等)进行设置。 |
| deviceDirection | network.direction | 如果 deviceDirection 为“0”,则设置为“INBOUND”;如果为“1”,则设置为“OUTBOUND” |
| 英寸 | network.received_bytes | 如果大于 0,则转换为 uinteger |
| out | network.sent_bytes | 如果大于 0,则转换为 uinteger |
| proto | network.ip_protocol | 根据 protocol_number_src 匹配的数字进行设置,例如 1 对应“ICMP”,6 对应“TCP”,等等。 |
| destinationTranslatedPort | network.target.nat_port | 如果不是 0,则转换为整数 |
| sourceTranslatedPort | network.principal.nat_port | 如果不是 0,则转换为整数 |
| dpt | network.target.port | 如果不是 0 且有效,则转换为整数 |
| spt | network.principal.port | 如果不是 0 且不是“{srcPort}”,则转换为整数 |
| 请求 | network.target.url | 直接复制值 |
| requestMethod | network.http.method | 大写 |
| requestClientApplication | network.http.user_agent | 直接复制值 |
| principal_hostname | principal.asset.hostname | 如果 principal_hostname 中的值不为空且与 principal_asset_hostname 不同,则使用该值;否则,设置为 principal_hostname |
| principal_asset_hostname | principal.asset.hostname | |
| Device_name | principal.hostname | 如果 Device_name 不为空,则为 Device_name 中的值,否则为 Enhetsnavn |
| Enhetsnavn | principal.hostname | |
| shost | principal.hostname | 如果不是 IP,则直接复制值 |
| shost | principal.ip | 如果与 IP 模式匹配,则提取为 IP |
| sourceTranslatedAddress | principal.nat_ip | 如果以数字开头,则直接复制值 |
| smac | principal.mac | 在 gsub 后提取为 MAC |
| spid | principal.process.pid | 直接复制值 |
| sproc | principal.process.command_line | 直接复制值 |
| suser | principal.user.user_display_name | 如果值不以“{”开头,则直接复制 |
| suid | principal.user.userid | 直接复制值 |
| spriv | principal.user.attribute.roles.name | 直接复制值 |
| sntdom | principal.administrative_domain | 直接复制值 |
| sourceServiceName | principal.application | 直接复制值 |
| Group_name | principal.group.group_display_name | 如果 Group_name 不为空,则使用 Group_name 中的值,否则使用 Gruppenavn |
| Gruppenavn | principal.group.group_display_name | |
| 操作 | principal.user.user_authentication_status | 如果操作在接受的值范围内,则设置为“ACTIVE”;如果断开连接,则设置为“NO_ACTIVE_CREDENTIALS”;如果已断开连接,则设置为“SUSPENDED” |
| act | security_result.action | 如果操作在允许条件或结果匹配的情况下进行,则设置为“ALLOW”;如果操作被拒绝或阻止,则设置为“BLOCK”;如果结果失败,则设置为“FAIL” |
| outcome | security_result.action | |
| act | security_result.action_details | 直接复制值 |
| Action_Taken | security_result.action_details | 直接复制值 |
| categoryOutcome | security_result.category_details | 直接复制值 |
| 和程度上减少 | security_result.severity | 如果值为 [0,1,2,3,"LOW"],则设置为“LOW”;如果值为 [4,5,6,"MEDIUM","SUBSTANTIAL","INFO"],则设置为“MEDIUM”;如果值为 [7,8,"HIGH","SEVERE"],则设置为“HIGH”;如果值为 [9,10,"VERY-HIGH","CRITICAL"],则设置为“CRITICAL” |
| 间谍软件 | security_result.threat_name | 如果间谍软件的值不为空,则为该值;否则为 Virus_Malware_Name;否则为 Unknown_Threat |
| Virus_Malware_Name | security_result.threat_name | |
| Unknown_Threat | security_result.threat_name | |
| 类型 | security_result.description | 如果 Type 不为空,则为 Type 中的值;否则为 Scan_Type |
| Scan_Type | security_result.description | |
| msg_data_2 | security_result.description | 如果 msg_data_2 不为空,则为 msg_data_2 中的值,否则为 msg |
| msg | security_result.description | |
| reason | security_result.summary | 如果值不为空或不包含空格,则直接复制该值 |
| appcategory | security_result.summary | 直接复制值 |
| 结果 | security_result.summary | 直接复制值 |
| mwProfile | security_result.rule_name | 直接复制值 |
| 操作 | security_result.detection_fields | 键“Operation”,值来自 Operation 或 Operasjon |
| Operasjon | security_result.detection_fields | |
| 权限 | security_result.detection_fields | 键“Permission”,值来自 Permission 或 Tillatelse |
| Tillatelse | security_result.detection_fields | |
| Infection_Channel | security_result.detection_fields | 键“Infection Channel”,值来自 Infection_Channel |
| Spyware_Grayware_Type | security_result.detection_fields | 键“Spyware/Grayware_Type”,值来自 Spyware_Grayware_Type |
| Threat_Probability | security_result.detection_fields | 键“Threat_Probability”,值来自 Threat_Probability |
| Resource_Type | security_result.detection_fields | 键“Resource_Type”,值来自 Resource_Type |
| security_result | security_result | 从 security_result 合并 |
| target_hostname | target.asset.hostname | 如果 target_hostname 中的值不为空且与 target_asset_hostname 不同,则使用 target_hostname 中的值;否则,设置为 target_hostname |
| target_asset_hostname | target.asset.hostname | |
| temp_dhost | target.hostname | 如果不是 IP,则直接复制值 |
| temp_dhost_ip | target.hostname | 如果已提取 IP,则设置为空 |
| temp_dhost_ip | target.ip | 如果已提取,则直接复制值 |
| temp_dhost_ip | target.ip | 来自 temp_dhost_ip 或 IPv6_Address 的值 |
| IPv6_Address | target.ip | |
| temp_dhost_ip | target.asset.ip | 如果已提取,则直接复制值 |
| destinationTranslatedAddress | target.nat_ip | 提取为 IP |
| dmac | target.mac | 在 gsub 后提取为 MAC |
| dpid | target.process.pid | 直接复制值 |
| dproc | target.process.command_line | 直接复制值 |
| temp_duser | target.user.user_display_name | 直接复制值 |
| temp_duid | target.user.userid | 使用 grok 提取,值已复制 |
| 用户 | target.user.userid | 如果 User 中的值不为空,则返回该值,否则返回 Bruker |
| Bruker | target.user.userid | |
| CustomerName | target.user.user_display_name | 直接在 gsub 之后复制的值 |
| dpriv | target.user.attribute.roles.name | 直接复制值 |
| dntdom | target.administrative_domain | 直接复制值 |
| destinationServiceName | target.application | 直接复制值 |
| File_name | target.process.file.full_path | 如果 File_name 不为空,则使用 File_name 中的值;否则,如果 Object 不为空,则使用 Object 中的值;否则,如果 Objekt 不为空,则使用 Objekt 中的值;否则,使用 Infected_Resource 中的值 |
| 对象 | target.process.file.full_path | |
| Objekt | target.process.file.full_path | |
| Infected_Resource | target.process.file.full_path | |
| oldFileSize | target.src.file.size | 如果不是 0,则转换为无符号整数 |
| oldFilePath | target.src.file.full_path | 直接复制值 |
| oldFilePermission | target.src.resource.attribute.permissions.name | 直接复制值 |
| filePermission | target.resource.attribute.permissions.name | 直接复制值 |
| resource_Type_label | target.resource.attribute.labels | 与键“Resource_Type”合并,值来自 Resource_Type |
| metadata.vendor_name | metadata.vendor_name | 设置为“IBM” |
| metadata.product_name | metadata.product_name | 设置为“大型机存储空间” |
cs3Label", and "cs4Label |
additional.fields |
从变更日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。