收集 Fortinet FortiClient 日志
本文档介绍了如何使用 Bindplane 代理将 Fortinet FortiClient 日志注入到 Google Security Operations。
FortiClient 是一款端点安全解决方案,可为 Windows、macOS、Linux 和 Chromebook 端点提供防病毒、网页过滤、VPN、漏洞扫描和应用防火墙功能。FortiClient 通过 FortiClient EMS(端点管理服务器)集中管理,该服务器会将安全政策和配置配置文件推送到端点。
准备工作
确保您满足以下前提条件:
- Google SecOps 实例
- Windows Server 2016 或更高版本,或者带有 systemd 的 Linux 主机
- Bindplane 代理与 FortiClient 端点之间的网络连接
- 如果在代理后面运行,请确保防火墙端口根据 Bindplane 代理要求处于开放状态
- 对 FortiClient EMS 管理控制台的特权访问权限
- FortiClient EMS 版本 7.0 或更高版本,且具有许可的 FortiClient 端点
获取 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
该服务应显示为 RUNNING。
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.yaml
Windows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
修改配置文件
将 config.yaml 的全部内容替换为以下配置:
receivers:
udplog:
listen_address: "0.0.0.0:514"
exporters:
chronicle/forticlient:
compression: gzip
creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
customer_id: 'your-customer-id-here'
endpoint: malachiteingestion-pa.googleapis.com
log_type: FORTINET_FORTICLIENT
raw_log_field: body
ingestion_labels:
env: production
source: forticlient
service:
pipelines:
logs/forticlient_to_chronicle:
receivers:
- udplog
exporters:
- chronicle/forticlient
配置参数
替换以下占位符:
接收器配置:
listen_address:要监听的 IP 地址和端口。使用0.0.0.0:514在端口 514 上监听所有接口。
导出器配置:
creds_file_path:提取身份验证文件的完整路径:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id:Google SecOps 控制台中的客户 IDendpoint:区域端点网址:- 美国:
malachiteingestion-pa.googleapis.com - 欧洲:
europe-malachiteingestion-pa.googleapis.com - 亚洲:
asia-southeast1-malachiteingestion-pa.googleapis.com - 如需查看完整列表,请参阅区域级端点
- 美国:
log_type:FORTINET_FORTICLIENTingestion_labels:YAML 格式的可选标签
保存配置文件
修改后,保存文件:
- Linux:依次按
Ctrl+O、Enter和Ctrl+X - Windows:依次点击文件 > 保存
重启 Bindplane 代理以应用更改
Linux
sudo systemctl restart observiq-otel-collector验证服务是否正在运行:
sudo systemctl status observiq-otel-collector检查日志是否存在错误:
sudo journalctl -u observiq-otel-collector -f
Windows
请从下列选项中选择一项:
以管理员身份使用命令提示符或 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"
- 按
配置 FortiClient 端点日志记录,以将日志发送到 Bindplane 代理
FortiClient 端点日志记录通过 FortiClient EMS 集中配置,方法是使用 XML 配置编辑端点配置文件。EMS 将日志记录配置推送到 FortiClient 端点,然后这些端点将日志直接发送到 Bindplane 代理 syslog 监听器。
登录 FortiClient EMS
- 登录 FortiClient EMS Web 控制台。
- 依次前往端点配置文件 > 管理配置文件。
修改或创建端点配置文件
- 选择要修改的现有个人资料,或点击添加以创建新的个人资料。
- 在配置文件名称字段中,输入一个描述性名称(例如
Chronicle-Logging-Profile)。 - 点击高级。
- 点击 XML 配置标签页。
- 点击修改。
在 XML 中配置远程日志记录
EMS 会显示两个窗格。使用右侧窗格修改 XML 配置。
在 <system> 中找到 <log_settings> 部分。如果不存在,请添加。在 <log_settings> 中,找到或添加 <remote_logging> 部分,并按如下方式进行配置:
<forticlient_configuration>
<system>
<log_settings>
<onnet_local_logging>1</onnet_local_logging>
<level>6</level>
<log_events>ipsecvpn,sslvpn,scheduler,update,firewall,av,proxy,shield,webfilter,endpoint,fssoma,configd,vuln,sandboxing,antiexploit</log_events>
<remote_logging>
<log_upload_enabled>1</log_upload_enabled>
<log_protocol>syslog</log_protocol>
<netlog_server>192.168.1.100</netlog_server>
<netlog_categories>7</netlog_categories>
<log_upload_freq_minutes>5</log_upload_freq_minutes>
</remote_logging>
</log_settings>
</system>
</forticlient_configuration>
配置参数:
<log_upload_enabled>:设置为1可启用远程日志记录。<log_protocol>:设置为syslog可将日志发送到 syslog 服务器。请改用faz将日志发送到 FortiAnalyzer。<netlog_server>:输入 Bindplane 代理主机(例如192.168.1.100)的 IP 地址。此参数仅在<log_protocol>设置为syslog时使用。<netlog_categories>:输入要上传的日志类别的位掩码:1= 流量日志2= 漏洞日志4= 事件日志7= 所有类别 (1 + 2 + 4)
<log_upload_freq_minutes>:以分钟为单位输入日志上传频率(例如,5表示每 5 分钟上传一次)。<level>:FortiClient 日志记录级别。输入以下任一内容:0= 紧急1= 提醒2= 严重3= 错误4= 警告5= 通知6= 信息(推荐)7= 调试
<log_events>:要记录的 FortiClient 事件或进程的英文逗号分隔列表。添加要捕获的事件(例如ipsecvpn,sslvpn,firewall,av,webfilter,endpoint)。
保存配置文件
- 点击 Test XML 以验证 XML 配置。
- 点击保存以保存配置文件。
将配置文件应用于端点
- 依次前往端点政策 > 管理政策。
- 选择现有政策,或点击添加以创建新政策。
- 在个人资料下拉菜单中,选择您创建或修改的个人资料。
- 在端点组部分中,选择要应用相应政策的端点组。
- 点击保存。
EMS 会在下一次遥测通信时将配置文件配置推送到端点。FortiClient 端点将开始向 Bindplane 代理 syslog 监听器发送日志。
验证日志转发
在 Bindplane 代理主机上,检查代理日志以验证是否正在接收日志:
Linux:
sudo journalctl -u observiq-otel-collector -fWindows:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"在 FortiClient 端点上,通过检查 FortiClient 日志来验证远程日志记录是否已启用:
Windows:
C:\Program Files\Fortinet\FortiClient\logs\macOS:
/Library/Application Support/Fortinet/FortiClient/logs/Linux:
/var/log/forticlient/在 Google SecOps 控制台中,验证是否正在提取 FortiClient 日志:
- 前往搜索。
- 输入 FortiClient 日志的搜索查询(例如,
metadata.log_type = "FORTINET_FORTICLIENT")。 - 验证日志是否显示在搜索结果中。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| emsserial、devid、usingpolicy、itime、fctsn、logver、site、fctver、browsetime、event_id、SubjectUserName、SubjectLogonId、ThreadID | additional.fields | 使用每个字段中的键和值创建的标签,合并到 additional.fields 中 |
| 时间戳 | metadata.collected_timestamp | 解析为 UNIX 时间戳 |
| ts | metadata.event_timestamp | 使用“MMM d HH:mm:ss”“MMM d HH:mm:ss”“yyyy-MM-dd HH:mm:ss”格式通过日期过滤器进行解析 |
| deviceip、client_ip、devicemac、hostname、user、uid | metadata.event_type | 如果用户/uid 和机器 ID 都存在,则设置为 USER_RESOURCE_ACCESS;如果机器 ID 存在,则设置为 USER_UNCATEGORIZED;否则设置为 GENERIC_EVENT |
| eventtype | metadata.product_event_type | 直接复制值 |
| id | metadata.product_log_id | 已转换为字符串,值已复制 |
| 服务 | network.application_protocol | 大写,然后如果与列表匹配,则设置为预定义协议(例如 “SSH”表示“22”“SSH”“SSHD”;“HTTP”表示“80”“8080”“HTTP”),否则如果服务在扩展列表中,则为服务,否则为空 |
| 方向 | network.direction | 如果与 (?i)inbound 匹配,则设置为 INBOUND;如果与 (?i)outbound 匹配,则设置为 OUTBOUND |
| proto | network.ip_protocol | 如果 proto == "6",则设置为“TCP” |
| rcvdbyte | network.received_bytes | 转换为无符号整数,如果非空/非 0,则复制值 |
| sentbyte | network.sent_bytes | 转换为无符号整数,如果非空/非 0,则复制值 |
| sessionid | network.session_id | 直接复制值 |
| pcdomain | principal.administrative_domain | 直接复制值 |
| srcproduct | principal.application | 直接复制值 |
| 主机名 | principal.hostname | 直接复制值 |
| deviceip、client_ip | principal.ip | 如果 deviceip 不为空,则取自 deviceip;否则,如果 client_ip 是有效的 IP,则取自 client_ip |
| devicemac | principal.mac | 转换为 MAC 格式,如果有效则复制值 |
| 操作系统、来源 | principal.platform | 如果操作系统/来源与 (?i)windows 匹配,则设置为 WINDOWS;如果与 (?i)mac|ios 匹配,则设置为 MAC;如果与 (?i)linux 匹配,则设置为 LINUX |
| source_ver | principal.platform_version | 直接复制值 |
| srcport | principal.port | 已转换为整数,值已复制 |
| ProcessId | principal.process.pid | 直接复制值 |
| srcname、source_type、type | principal.resource.attribute.labels | 使用每个字段中的键和值创建的标签,合并到 attribute.labels 中 |
| devname | principal.resource.name | 直接复制值 |
| ProviderGuid | principal.resource.product_object_id | 直接复制值 |
| 子类型 | principal.resource.resource_subtype | 直接复制值 |
| 网址 | principal.url | 直接复制值 |
| uid、fctuid | principal.user.product_object_id | 如果 uid 不为空,则返回 uid 中的值;否则返回 fctuid |
| 用户 | principal.user.user_display_name | 直接复制值 |
| 用户 | principal.user.userid | 直接复制值 |
| SubjectUserSid | principal.user.windows_sid | 如果与 SID 正则表达式匹配,则复制值 |
| utmaction | security_result.action | 如果为 [accept,allow,passthrough,pass,permit,detected],则设置为 ALLOW;如果为 [deny,dropped,blocked,block],则设置为 BLOCK;否则设置为 UNKNOWN_ACTION |
| utmevent | security_result.category_details | 直接复制值 |
| utmaction | security_result.description | 设置为“utmaction: |
| userinitiated | security_result.detection_fields | 使用键“userinitiated”和来自 userinitiated 的值创建的标签,已合并 |
| level | security_result.severity | 如果级别为“info”,则设置为 INFORMATIONAL |
| 威胁 | security_result.threat_name | 直接复制值 |
| emshostname、remotename | target.hostname | 如果 emshostname 不为空,则为 emshostname 中的值;否则为 remotename |
| dstip | target.ip | 从 dstip 中提取了有效的 IP |
| dstport | target.port | 转换为整数,如果不是 0,则复制值 |
| metadata.product_name | 设置为“FORTINET_FORTICLIENT” | |
| metadata.vendor_name | 设置为“FORTINET_FORTICLIENT” |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。