收集 Ivanti Connect Secure (Pulse Secure) 日志
本文档介绍了如何使用 Bindplane 将 Ivanti Connect Secure (Pulse Secure) 日志注入到 Google Security Operations。
Ivanti Connect Secure(以前称为 Pulse Secure)是一种 SSL VPN 解决方案,可安全地远程访问企业应用、资源和网络。它支持多重身份验证、端点合规性检查,以及针对远程工作者和合作伙伴的精细访问权限政策。注意:Pulse Secure 于 2020 年被 Ivanti 收购。解析器从 Pulse Secure VPN syslog 格式的日志中提取字段。它使用 grok 解析日志消息,然后将这些值映射到统一数据模型 (UDM)。它还会为事件来源和类型设置默认元数据值。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- Windows Server 2016 或更高版本,或者具有
systemd的 Linux 主机 - 如果通过代理运行,请确保防火墙端口已根据 Bindplane 代理要求打开
- 对 Ivanti Connect Secure (Pulse Secure) 管理控制台的特权访问权限
获取 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.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
修改配置文件
将
config.yaml的全部内容替换为以下配置:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'PULSE_SECURE_VPN' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
配置参数
替换以下占位符:
接收器配置:
udplog:使用udplog表示 UDP syslog,使用tcplog表示 TCP syslog0.0.0.0:要监听的 IP 地址(0.0.0.0表示监听所有接口)514:要监听的端口号(标准 syslog 端口)
导出器配置:
creds_file_path:提取身份验证文件的完整路径:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID:从“获取客户 ID”部分获取的客户 IDendpoint:区域端点网址:- 美国:
malachiteingestion-pa.googleapis.com - 欧洲:
europe-malachiteingestion-pa.googleapis.com - 亚洲:
asia-southeast1-malachiteingestion-pa.googleapis.com - 如需查看完整列表,请参阅区域级端点
- 美国:
log_type:日志类型,与在 Chronicle 中显示的完全一致 (PULSE_SECURE_VPN)
保存配置文件
- 修改后,保存文件:
- Linux:依次按
Ctrl+O、Enter和Ctrl+X - Windows:依次点击文件 > 保存
- Linux:依次按
重启 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"
- 按
在 Ivanti Connect Secure (Pulse Secure) 上配置 Syslog 转发
- 登录 Ivanti Connect Secure(以前称为 Pulse Secure)管理控制台。
- 依次前往系统 > 日志/监控 > Syslog 服务器。
- 点击新服务器以添加 Syslog 服务器。
- 提供以下配置详细信息:
- 服务器名称/IP:输入 Bindplane 代理主机 IP 地址。
- 服务器端口:输入
514。 - 设备:选择 LOCAL0(或您偏好的设备)。
- 类型:选择 UDP。
- 在事件过滤条件部分,选择要转发的事件类型:
- 标准:适用于标准 syslog 格式
- 选择日志类别:
- 事件:选择用户访问日志、管理员日志、传感器事件。
- 严重程度:选择信息及更高级别,以进行全面的日志记录。
- 点击保存更改。
- 通过检查 Bindplane 代理日志,验证是否正在发送 syslog 消息。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 操作 | security_result.action_details | 直接从操作字段映射。 |
| 应用 | principal.application | 直接从应用字段映射。 |
| bytes_read | network.received_bytes | 直接从 bytes_read 字段映射并转换为无符号整数。 |
| bytes_written | network.sent_bytes | 直接从 bytes_written 字段映射并转换为无符号整数。 |
| client_host | principal.hostname、principal.asset.hostname | 直接从 client_host 字段映射。 |
| cmd | principal.process.command_line | 直接从 cmd 字段映射。 |
| connection_status | security_result.detection_fields.value.string_value | 直接从 connection_status 字段映射。 |
| data_time | metadata.event_timestamp.seconds | 使用各种时间戳格式(MM-dd-yyyy HH:mm:ss Z、RFC 3339、ISO8601、MMM d HH:mm:ss、MMM d HH:mm:ss)从 data_time 字段解析而来。 |
| devname | principal.hostname、principal.asset.hostname | 直接从 devname 字段映射。 |
| dstip | target.ip、target.asset.ip | 直接从 dstip 字段映射。 |
| dstport | target.port | 直接从 dstport 字段映射并转换为整数。 |
| dstcountry | target.location.country_or_region | 如果 dstcountry 字段不是“保留”或空,则直接从该字段映射。 |
| 时长 | network.session_duration.seconds | 直接从时长字段映射并转换为整数。 |
| dvc | intermediary.hostname 或 intermediary.ip | 如果 dvc 字段可以转换为 IP 地址,则会映射到 intermediary.ip。否则,它会映射到 intermediary.hostname。 |
| dvc_hostname | intermediary.hostname、principal.hostname、principal.asset.hostname 或 intermediary.ip、principal.ip、principal.asset.ip | 如果 dvc_hostname 字段可以转换为 IP 地址,则会映射到相应的 IP 字段。否则,它会映射到相应的主机名字段。 |
| event_type | metadata.product_event_type | 直接从 event_type 字段映射。 |
| failure_reason | security_result.description | 直接从 failure_reason 字段映射。如果消息包含“because host”,则会在失败原因前添加文本“host”。 |
| has_principal | event.idm.read_only_udm.principal(存在) | 如果填充了任何委托人字段,则设置为“true”,否则设置为“false”。由解析器逻辑派生。 |
| has_target | event.idm.read_only_udm.target (presence) | 如果填充了任何目标字段,则设置为“true”,否则设置为“false”。由解析器逻辑派生。 |
| has_target_user | event.idm.read_only_udm.target.user.userid(存在) | 如果 target.user.userid 已填充,则设置为“true”,否则设置为“false”。由解析器逻辑派生。 |
| host_ip | principal.ip、principal.asset.ip | 直接从 host_ip 字段映射。 |
| host_mac | principal.mac | 直接从 host_mac 字段映射,并将连字符替换为英文冒号。 |
| http_method | network.http.method | 直接从 http_method 字段映射。 |
| http_response | network.http.response_code | 直接从 http_response 字段映射并转换为整数。 |
| info_desc | about.labels.value | 直接从 info_desc 字段映射。 |
| ip_new | target.ip、target.asset.ip | 直接从 ip_new 字段映射。 |
| level | security_result.severity、security_result.severity_details | security_result.severity 派生自 level 字段(“error”/“warning”-> HIGH,“notice”-> MEDIUM,“information”/“info”-> LOW)。等级的原始值也会映射到 security_result.severity_details。 |
| logid | metadata.product_log_id | 直接从 logid 字段映射。 |
| locip | principal.ip、principal.asset.ip | 直接从 locip 字段映射。 |
| 消息 | metadata.description | 用于使用 grok 和 kv 过滤器提取各种字段。如果消息包含“EventID”,则将其视为 Windows 事件日志进行处理。 |
| message_info | metadata.description | 如果未在更具体的 grok 模式中使用,则直接映射到 metadata.description。 |
| msg | metadata.product_event_type、metadata.description | 如果存在 msg 字段,则提取商品类型并将其映射到 metadata.product_event_type,并将剩余的消息映射到 metadata.description。 |
| msg_hostname | principal.hostname、principal.asset.hostname | 直接从 msg_hostname 字段映射。 |
| msg_ip | principal.ip、principal.asset.ip | 直接从 msg_ip 字段映射。 |
| msg_user_agent | network.http.user_agent、network.http.parsed_user_agent、metadata.product_version | 用户代理字符串会映射到 network.http.user_agent,解析后的用户代理会映射到 network.http.parsed_user_agent,产品版本(如果存在)会映射到 metadata.product_version。 |
| network_duration | network.session_duration.seconds | 直接从 network_duration 字段映射并转换为整数。 |
| policyid | security_result.rule_id | 直接从 policyid 字段映射。 |
| policyname | security_result.rule_name | 直接从 policyname 字段映射。 |
| policytype | security_result.rule_type | 直接从 policytype 字段映射。 |
| priority_code | about.labels.value | 直接从 priority_code 字段映射,还用于派生“严重程度”键的 about.labels.value(请参阅逻辑)。 |
| prod_name | metadata.product_name | 直接从 prod_name 字段映射。 |
| product_type | metadata.product_event_type | 直接从 product_type 字段映射。 |
| product_version | metadata.product_version | 直接从 product_version 字段映射。 |
| proto | network.ip_protocol | 在通过查找转换为 IP 协议名称后,映射到 network.ip_protocol。 |
| pwd | principal.process.file.full_path | 直接从 pwd 字段映射。 |
| 大区 | principal.group.attribute.labels.value | 直接从 realm 字段映射。 |
| rcvdbyte | network.received_bytes | 直接从 rcvdbyte 字段映射,并转换为无符号整数。 |
| remip | target.ip | 直接从 remip 字段映射。 |
| 资源名称 | target.resource.name | 直接从 resource_name 字段映射,但会移除开头/结尾处的空格和连字符。 |
| resource_status | security_result.description | 直接从 resource_status 字段映射。 |
| resource_user_group | principal.user.group_identifiers | 直接从 resource_user_group 字段映射。 |
| resource_user_name | principal.user.userid | 直接从 resource_user_name 字段映射。 |
| 角色 | principal.user.group_identifiers | 直接从 roles 字段映射。 |
| sentbyte | network.sent_bytes | 直接从 sentbyte 字段映射并转换为无符号整数。 |
| session_id | network.session_id | 直接从 session_id 字段映射。 |
| sessionid | network.session_id | 直接从 sessionid 字段映射。 |
| srcip | principal.ip、principal.asset.ip | 直接从 srcip 字段映射。 |
| srcport | principal.port | 直接从 srcport 字段映射并转换为整数。 |
| srccountry | principal.location.country_or_region | 如果 srccountry 字段不是“保留”或空,则直接从该字段映射。 |
| 子类型 | metadata.product_event_type | 与 type 结合使用,以形成 metadata.product_event_type。 |
| target_file | target.file.full_path | 直接从 target_file 字段映射。 |
| target_host | target.hostname、target.asset.hostname | 直接从 target_host 字段映射。 |
| target_ip | target.ip、target.asset.ip | 直接从 target_ip 字段映射。 |
| target_port | target.port | 直接从 target_port 字段映射并转换为整数。 |
| target_url | target.url | 直接从 target_url 字段映射。 |
| 时间 | metadata.event_timestamp.seconds | 使用“yyyy-MM-dd HH:mm:ss”格式从时间字段解析。 |
| 类型 | metadata.product_event_type | 与子类型结合使用,以形成 metadata.product_event_type。 |
| u_event_source_ip | principal.ip、principal.asset.ip 或 target.ip | 如果存在 target_ip 或 target_host,则 u_event_source_ip 会映射到 principal.ip 和 principal.asset.ip。否则,如果 target_ip、target_host 和 target_url 均为空,则 u_event_source_ip 会映射到 target.ip。 |
| u_observer_ip | observer.ip | 直接从 u_observer_ip 字段映射。 |
| u_prin_ip | principal.ip、principal.asset.ip | 直接从 u_prin_ip 字段映射。 |
| 用户 | target.user.userid | 直接从用户字段映射。 |
| user_agent | network.http.user_agent、network.http.parsed_user_agent | 用户代理字符串会映射到 network.http.user_agent,而解析后的用户代理会映射到 network.http.parsed_user_agent。 |
| user_group_identifier | target.user.group_identifiers 或 principal.user.group_identifiers | 在大多数情况下,映射到 target.user.group_identifiers。在 IP 更改 (USER_UNCATEGORIZED) 和 Realm 限制事件中,映射到 principal.user.group_identifiers。 |
| user_ip | principal.ip、principal.asset.ip | 直接从 user_ip 字段映射。如果为空且 u_event_source_ip 不为空,则取 u_event_source_ip 的值。 |
| 用户名 | principal.user.userid 或 target.user.userid | 在大多数情况下,映射到 principal.user.userid。在某些特定场景下(例如,当 detect_user_logout_failed 为 false 且 detect_policy_change_failed 为 false 时),映射到 target.user.userid。 |
| username_removed | target.user.userid | 直接从 username_removed 字段映射。 |
| vd | principal.administrative_domain | 直接从 vd 字段映射。 |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。