收集 macOS 系统日志
解析器版本:2.0
本文档介绍了如何使用 Bindplane 将 macOS 系统日志注入到 Google Security Operations。macOS 使用 Apple 统一日志记录系统来捕获系统级事件,包括身份验证、进程执行、内核活动和应用行为。这些日志可通过 syslog 转发到远程收集器,以进行集中式安全监控和分析。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例。
- Windows 2016 或更高版本,或者带有 systemd 的 Linux 主机。
- 如果在代理后面运行,请确保根据 Bindplane 代理要求打开防火墙端口。
- 对将转发日志的 macOS 端点的管理员访问权限。
- 搭载 macOS 10.12 (Sierra) 或更高版本且支持统一日志记录。
获取 Bindplane 代理的 Google SecOps 凭证
如需向 Google SecOps 验证 Bindplane 代理,请选择以下方法之一:
- 新部署:使用 Chronicle API(选项 1)。
- 旧版部署:继续使用提取身份验证文件(方法 2),直到提取 API 于 2027 年 7 月 20 日停用。
方法 1:为 Chronicle API 创建服务账号(推荐)
- 登录 Google Cloud 控制台,然后选择与您的 Google SecOps 实例关联的 Google Cloud 项目。
- 前往 IAM 和管理 > 服务账号。
- 点击创建服务账号。
- 提供以下配置详细信息:
- 服务账号名称:输入账号的名称(例如
bindplane-ingest)。 - 服务账号说明:输入说明(例如
Bindplane agent log ingestion)。
- 服务账号名称:输入账号的名称(例如
- 点击创建并继续。
- 在向此服务账号授予对项目的访问权限部分,点击选择角色,然后选择 Chronicle Editor。
- 点击继续,然后点击完成。
- 点击您创建的服务账号,然后前往密钥标签页。
- 依次点击添加密钥 > 创建新密钥。
- 选择 JSON,然后点击创建。密钥文件会下载到您的计算机上。
- 将密钥文件另存为 Bindplane 收集器目录(Linux 上的
/opt/observiq-otel-collector/ingestion-auth.json或 Windows 上的C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)中的ingestion-auth.json,或更新config.yaml中的creds_file_path以匹配您保存该文件的路径。 - 前往 IAM 和管理 > 设置,然后复制项目编号。您在配置导出器时需要用到该名称。
方法 2:下载数据注入身份验证文件(旧版)
- 登录 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
Linux 安装
- 打开具有 root 或 sudo 权限的终端。
运行以下命令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
其他安装资源
如需了解其他安装选项,请参阅此安装指南。
配置 Bindplane 代理以注入 Syslog 并发送到 Google SecOps
访问配置文件:
- 找到
config.yaml文件。通常,它位于 Linux 上的/observiq-otel-collector/目录中,或 Windows 上的安装目录中。 - 使用文本编辑器(例如
nano、vi或记事本)打开该文件。
- 找到
按如下方式修改
config.yaml文件:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <PLACEHOLDER_CUSTOMER_ID> endpoint: chronicle.googleapis.com # Add optional ingestion labels for better organization log_type: 'MACOS' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- 根据基础架构的要求替换端口和 IP 地址。
- 将
<LOCATION>替换为 Google SecOps 实例所在的区域(例如us、europe或asia-southeast1)。导出工具会为此值添加chronicle.googleapis.com前缀。 - 将
<PROJECT_NUMBER>替换为 IAM 和管理 > 设置中的项目编号。 - 将
<PLACEHOLDER_CUSTOMER_ID>替换为实际客户 ID。 - 将
/path/to/ingestion-authentication-file.json更新为获取 Bindplane 代理的 Google SecOps 凭证部分中保存服务账号密钥文件(选项 1)的文件路径。
旧版提取 API 导出工具
如果您使用选项 2 中的提取身份验证文件,请将
exporters代码块替换为以下内容。将creds_file_path设置为提取身份验证文件的路径,如果您的实例位于美国境外,请将malachiteingestion-pa.googleapis.com替换为您的区域端点(例如europe-malachiteingestion-pa.googleapis.com)。exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <PLACEHOLDER_CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'MACOS' raw_log_field: body ingestion_labels:
重启 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"
配置 macOS syslog 转发
macOS 使用统一日志记录系统。如需通过 syslog 将日志转发到 Bindplane 代理,请在每个 macOS 端点上配置内置 syslogd 服务。
选项 1:使用 syslog.conf 配置 syslog 转发
- 在 macOS 端点上打开终端。
修改 syslog 配置文件:
sudo nano /etc/syslog.conf在文件末尾添加以下行,以通过 UDP 将所有日志转发到 Bindplane 代理:
*.* @<BINDPLANE_IP_ADDRESS>:514- 将
<BINDPLANE_IP_ADDRESS>替换为 Bindplane 代理主机的 IP 地址(例如192.168.1.100)。
- 将
保存文件并退出。
重启 syslog 守护程序:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
方法 2:使用 asl.conf 配置 syslog 转发
- 在 macOS 端点上打开终端。
修改 ASL 配置文件:
sudo nano /etc/asl.conf添加以下代码行,将日志转发到远程 syslog 服务器:
? [= Sender kernel] forward <BINDPLANE_IP_ADDRESS>:514 ? [<= Level notice] forward <BINDPLANE_IP_ADDRESS>:514- 将
<BINDPLANE_IP_ADDRESS>替换为 Bindplane 代理主机 IP 地址。
- 将
保存文件并退出。
重启 syslog 守护程序:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
验证日志转发
在 macOS 端点上,生成一条测试日志消息:
logger -p user.notice "Test syslog message for Bindplane"在 Bindplane 代理主机上,检查代理日志中是否有传入消息:
sudo journalctl -u observiq-otel-collector -f
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
activityIdentifier_label |
additional.fields |
已合并 |
backtrace_label |
additional.fields |
已合并 |
bootUUID_label |
additional.fields |
已合并 |
category_label |
additional.fields |
已合并 |
chronicle_log_type_label |
additional.fields |
已合并 |
formatString_label |
additional.fields |
已合并 |
log_type_label |
additional.fields |
已合并 |
machTimestamp_label |
additional.fields |
已合并 |
messageType_label |
additional.fields |
已合并 |
parentActivityIdentifier_label |
additional.fields |
已合并 |
processImageUUID_label |
additional.fields |
已合并 |
senderImageUUID_label |
additional.fields |
已合并 |
senderProgramCounter_label |
additional.fields |
已合并 |
subprocess_label |
additional.fields |
已合并 |
subsystem_label |
additional.fields |
已合并 |
threadID_label |
additional.fields |
已合并 |
traceID_label |
additional.fields |
已合并 |
intermediary_host |
intermediary.hostname |
直接映射 |
attributes.message |
metadata.description |
直接映射 |
description |
metadata.description |
直接映射 |
eventMessage |
metadata.description |
直接映射 |
timestamp |
metadata.event_timestamp |
解析为 ISO8601 |
has_principal |
metadata.event_type |
已映射:true → STATUS_UPDATE |
has_user |
metadata.event_type |
已映射:true → USER_UNCATEGORIZED |
attributes.process |
metadata.product_event_type |
直接映射 |
eventType |
metadata.product_event_type |
直接映射 |
attributes.host |
principal.asset.hostname |
直接映射 |
hostname |
principal.asset.hostname |
直接映射 |
source |
principal.asset.hostname |
直接映射 |
senderImagePath |
principal.file.full_path |
直接映射 |
attributes.host |
principal.hostname |
直接映射 |
hostname |
principal.hostname |
直接映射 |
source |
principal.hostname |
直接映射 |
command_line |
principal.process.command_line |
直接映射 |
processImagePath |
principal.process.file.full_path |
直接映射 |
attributes.pid |
principal.process.pid |
直接映射 |
processID |
principal.process.pid |
直接映射 |
process_id |
principal.process.pid |
直接映射 |
userID |
principal.user.userid |
直接映射 |
| 不适用 | metadata.event_type |
常量:USER_UNCATEGORIZED |
| 不适用 | metadata.product_name |
常量:MacOS |
| 不适用 | metadata.vendor_name |
常量:Apple |
| 不适用 | principal.platform |
常量:MAC |
eventMessage |
event.idm.read_only_udm.metadata.description |
从更新日志映射 |
eventType |
event.idm.read_only_udm.metadata.product_event_type |
从更新日志映射 |
senderImagePath |
event.idm.read_only_udm.principal.file.full_path |
从更新日志映射 |
processImagePath |
event.idm.read_only_udm.principal.process.file.full_path |
从更新日志映射 |
userID |
event.idm.read_only_udm.principal.user.userid |
从更新日志映射 |
activityIdentifier |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
bootUUID |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
category |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
formatString |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
machTimestamp |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
messageType |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
parentActivityIdentifier |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
processImageUUID |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
senderImageUUID |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
senderProgramCounter |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
subsystem |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
threadID |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
traceID |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
backtrace.frames |
event.idm.read_only_udm.additional.fields |
从更新日志映射 |
processID |
event.idm.read_only_udm.principal.process.pid |
从更新日志映射 |
source |
event.idm.read_only_udm.principal.hostname |
从更新日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。