收集 Versa Networks 安全访问服务边缘 (SASE) 日志
支持的平台:
Google SecOps
SIEM
本文档介绍了如何收集 Versa Networks 安全访问服务边缘 (SASE) 日志。解析器会在初始 Grok 过滤器之后提取键值对。然后,它会将这些值映射到统一数据模型 (UDM),处理防火墙事件、应用日志和警报日志等各种日志格式,并针对 IP 协议和风险评分等特定字段执行转换和丰富操作。
准备工作
- 确保您有一个 Google Security Operations 实例。
- 确保您使用的是 Windows 2016 或更高版本,或者使用了带有
systemd
的 Linux 主机。 - 如果在代理后面运行,请确保防火墙端口处于打开状态。
- 确保您拥有对 Versa SASE 的特权访问权限。
获取 Google SecOps 提取身份验证文件
- 登录 Google SecOps 控制台。
- 依次前往 SIEM 设置 > 收集代理。
- 下载提取身份验证文件。将该文件安全地保存在将安装 BindPlane 的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 依次选择 SIEM 设置 > 配置文件。
- 复制并保存组织详细信息部分中的客户 ID。
安装 BindPlane Agent
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 Agent 以提取 Syslog 并将其发送到 Google SecOps
访问配置文件:
- 找到
config.yaml
文件。通常,在 Linux 上,该目录位于/etc/bindplane-agent/
目录中;在 Windows 上,该目录位于安装目录中。 - 使用文本编辑器(例如
nano
、vi
或记事本)打开该文件。
- 找到
按如下方式修改
config.yaml
文件:receivers: tcplog: # Replace the port and IP address as required listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: `/path/to/ingestion-authentication-file.json` # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: SYSLOG namespace: versa_networks_sase raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - tcplog exporters: - chronicle/chronicle_w_labels
根据基础架构中的需要替换端口和 IP 地址。
将
<customer_id>
替换为实际的客户 ID。在获取 Google SecOps 提取身份验证文件部分,将
/path/to/ingestion-authentication-file.json
更新为身份验证文件的保存路径。
重启 BindPlane 代理以应用更改
在 Linux 中,如需重启 BindPlane 代理,请运行以下命令:
sudo systemctl restart bindplane-agent
在 Windows 中,如需重启 BindPlane Agent,您可以使用 Services 控制台,也可以输入以下命令:
net stop BindPlaneAgent && net start BindPlaneAgent
配置 Versa Networks SASE
管理员必须在每个 Versa Analytics 节点上配置远程收集器,以将日志转发到第三方系统。
如需配置 Versa 分析节点,请执行以下操作:
- 启用日志转发
- 启用会话 ID 日志记录
启用日志转发
- 登录 Versa 分析服务器。
- 运行
cli
命令,前往 CLI。 - 运行
configure
命令切换到配置模式,然后输入load merge terminal
。 复制并粘贴以下命令以设置日志转发:
- 将
<collector_ip>
和<collector_port>
替换为 syslog 收集器 (Bindplane) 的 IP 地址和端口。
set system analytics log-collector-exporter destination-address <collector_ip> set system analytics log-collector-exporter destination-port <collector_port> set system analytics log-collector-exporter transport tcp set system analytics log-collector-exporter log-types firewall-log set system analytics log-collector-exporter log-types threat-log commit
- 将
保存配置:
save
启用会话 ID 日志记录
如需记录 IP 地址相关信息,请启用会话 ID 日志记录。
- 登录 Versa Director。
- 切换到导演视图。
- 依次前往配置 > 设备 > 租户 > 设备,以访问设备视图。
- 依次选择配置 > 其他 > 系统 > 配置 > 配置。
- 在参数窗格中,点击修改。
- 在修改参数窗口中,选择 LEF。
在防火墙部分,选中包含会话 ID 日志记录复选框。
点击确定。
UDM 映射表
日志字段 | UDM 映射 | 逻辑 |
---|---|---|
accCkt |
additional.fields[].key :“accCkt”additional.fields[].value.string_value :accCkt |
直接从 accCkt 字段中获取的值。 |
accCktId |
additional.fields[].key :“accCktId”additional.fields[].value.string_value :accCktId |
直接从 accCktId 字段中获取的值。 |
accCktName |
additional.fields[].key :“accCktName”additional.fields[].value.string_value :accCktName |
直接从 accCktName 字段中获取的值。 |
accessType |
additional.fields[].key :“accessType”additional.fields[].value.string_value :accessType |
直接从 accessType 字段中获取的值。 |
action |
security_result.action :action |
如果 action 、type 、idpAction 、avAction 或 urlAction 为“允许”,则为 ALLOW 。如果 action 、type 、idpAction 、avAction 或 urlAction 为“拒绝”“舍弃”“屏蔽”“拒绝”,则为 BLOCK 。如果 idpAction 是任何其他值,则为 UNKNOWN_ACTION 。 |
alarmCause |
security_result.detection_fields[].key :“alarmCause”security_result.detection_fields[].value :alarmCause |
直接从 alarmCause 字段中提取的值。 |
alarmClass |
security_result.detection_fields[].key :“alarmClass”security_result.detection_fields[].value :alarmClass |
直接从 alarmClass 字段中提取的值。 |
alarmClearable |
security_result.detection_fields[].key :“alarmClearable”security_result.detection_fields[].value :alarmClearable |
直接从 alarmClearable 字段中获取的值。 |
alarmEventType |
metadata.product_event_type :alarmEventType |
直接从 alarmEventType 字段中提取的值。 |
alarmKey |
security_result.detection_fields[].key :“alarmKey”security_result.detection_fields[].value :alarmKey |
直接从 alarmKey 字段中提取的值。 |
alarmKind |
security_result.detection_fields[].key :“alarmKind”security_result.detection_fields[].value :alarmKind |
直接从 alarmKind 字段中获取的值。 |
alarmOwner |
security_result.detection_fields[].key :“alarmOwner”security_result.detection_fields[].value :alarmOwner |
直接从 alarmOwner 字段中提取的值。 |
alarmSeqNo |
security_result.detection_fields[].key :“alarmSeqNo”security_result.detection_fields[].value :alarmSeqNo |
直接从 alarmSeqNo 字段中获取的值。 |
alarmSeverity |
security_result.severity_details :alarmSeverity |
直接从 alarmSeverity 字段中提取的值。 |
alarmText |
security_result.summary :alarmText |
直接从 alarmText 字段中提取的值,已移除双引号。 |
alarmType |
security_result.description :alarmType |
直接从 alarmType 字段中获取的值。 |
appFamily |
metadata.product_event_type :appFamily security_result.detection_fields[].key :“appFamily”security_result.detection_fields[].value :appFamily |
直接从 appFamily 字段中提取的值。 |
appId |
security_result.detection_fields[].key :“应用 ID”security_result.detection_fields[].value :appId |
直接从 appId 字段中获取的值。 |
appIdStr |
security_result.detection_fields[].key :“appIdStr”security_result.detection_fields[].value :appIdStr |
直接从 appIdStr 字段中获取的值。 |
applianceName |
principal.hostname :applianceName |
直接从 applianceName 、siteName 或 site 字段中提取的值。 |
appProductivity |
security_result.detection_fields[].key :“appProductivity”security_result.detection_fields[].value :appProductivity |
直接从 appProductivity 字段中获取的值。 |
appRisk |
security_result.severity_details :appRisk |
直接从 appRisk 字段中获取的值。 |
appSubFamily |
security_result.detection_fields[].key :“appSubFamily”security_result.detection_fields[].value :appSubFamily |
直接从 appSubFamily 字段中获取的值。 |
avAccuracy |
additional.fields[].key :“avAccuracy”additional.fields[].value.string_value :avAccuracy |
直接从 avAccuracy 字段中获取的值。 |
avAction |
security_result.action :avAction |
如需了解逻辑,请参阅 action 。 |
avMalwareName |
security_result.threat_name :avMalwareName |
直接从 avMalwareName 字段中提取的值。 |
avMalwareType |
security_result.category_details :avMalwareType |
直接从 avMalwareType 字段中提取的值。 |
classMsg |
security_result.description :classMsg |
直接从 classMsg 字段中提取的值,已移除双引号。 |
clientIPv4Address |
target.ip :clientIPv4Address |
直接从 clientIPv4Address 字段中提取的值。 |
destIp |
target.ip :destIp destinationIPv4Address :destIp |
直接从 destIp 字段中提取的值。 |
destinationIPv4Address |
target.ip :destinationIPv4Address |
直接从 destinationIPv4Address 中获取的值或从 networkPrefix 字段派生的值。 |
destinationIPv6Address |
target.ip :destinationIPv6Address |
直接从 destinationIPv6Address 字段中获取的值。 |
destinationPort |
target.port :destinationPort |
直接从 destinationPort 字段中提取并转换为整数的值。 |
destinationTransportPort |
target.port :destinationTransportPort |
直接从 destinationTransportPort 字段中提取并转换为整数的值。 |
deviceKey |
about.resource.attribute.labels[].key :“deviceKey”about.resource.attribute.labels[].value :deviceKey |
如果不是“未知”,则直接从 deviceKey 字段中获取的值。 |
deviceName |
about.resource.attribute.labels[].key :“deviceName”about.resource.attribute.labels[].value :deviceName |
如果不是“未知”,则直接从 deviceName 字段中获取的值。 |
duration |
network.session_duration.seconds :duration |
直接从 duration 字段中提取并转换为整数的值。 |
egressInterfaceName |
additional.fields[].key :“egressInterfaceName”additional.fields[].value.string_value :egressInterfaceName |
直接从 egressInterfaceName 字段中获取的值。 |
event.type |
metadata.event_type :event.type |
如果同时存在 applianceName (或 sourceIPv4Address 、user 或 sourceIPv6Address )和 destinationIPv4Address (或 remoteSite 、destinationIPv6Address 、clientIPv4Address 或 hostname ),则为 NETWORK_CONNECTION 。否则,STATUS_UPDATE 。如果 applianceName 为空,则为 GENERIC_EVENT 。 |
eventType |
principal.resource.attribute.labels[].key :“eventType”principal.resource.attribute.labels[].value :eventType |
直接从 eventType 字段中提取的值。 |
family |
security_result.detection_fields[].key :“family”security_result.detection_fields[].value :family |
直接从 family 字段中提取的值。 |
fc |
security_result.detection_fields[].key :“ForwardingClass”security_result.detection_fields[].value :fc |
直接从 fc 字段中获取的值。 |
fileTransDir |
additional.fields[].key :“fileTransDir”additional.fields[].value.string_value :fileTransDir |
直接从 fileTransDir 字段中提取的值。 |
filename |
target.file.names :filename |
直接从 filename 字段中提取的值。 |
flowCookie |
metadata.collected_timestamp :flowCookie |
直接从 flowCookie 字段中提取的值,并使用 UNIX 格式转换为时间戳。 |
flowId |
principal.resource.product_object_id :flowId |
直接从 flowId 字段中获取的值。 |
forwardForwardingClass |
security_result.detection_fields[].key :“forwardForwardingClass”security_result.detection_fields[].value :forwardForwardingClass |
直接从 forwardForwardingClass 字段中获取的值。 |
fromCountry |
principal.location.country_or_region :fromCountry target.location.country_or_region :fromCountry |
直接从 fromCountry 字段中获取的值。 |
fromUser |
principal.user.userid :fromUser |
直接从 fromUser 字段(如果不为空)获取的值,或“unknown”或“未知”。 |
fromZone |
additional.fields[].key :“fromZone”additional.fields[].value.string_value :fromZone |
直接从 fromZone 字段中提取的值。 |
generateTime |
metadata.collected_timestamp :generateTime |
直接从 generateTime 字段中提取的值,并使用 UNIX 格式转换为时间戳。 |
hostname |
target.hostname :hostname |
直接从 hostname 字段中获取的值。 |
httpUrl |
target.url :httpUrl |
直接从 httpUrl 字段中提取的值。 |
icmpTypeIPv4 |
additional.fields[].key :“icmpTypeIPv4”additional.fields[].value.string_value :icmpTypeIPv4 |
直接从 icmpTypeIPv4 字段中获取的值。 |
idpAction |
security_result.action :idpAction |
如需了解逻辑,请参阅 action 。 |
ingressInterfaceName |
additional.fields[].key :“ingressInterfaceName”additional.fields[].value.string_value :ingressInterfaceName |
直接从 ingressInterfaceName 字段中获取的值。 |
ipsApplication |
additional.fields[].key :“ipsApplication”additional.fields[].value.string_value :ipsApplication |
直接从 ipsApplication 字段中获取的值。 |
ipsDirection |
security_result.detection_fields[].key :“ipsDirection”security_result.detection_fields[].value :ipsDirection |
直接从 ipsDirection 字段中获取的值。 |
ipsProfile |
security_result.detection_fields[].key :“ipsProfile”security_result.detection_fields[].value :ipsProfile |
直接从 ipsProfile 字段中获取的值。 |
ipsProfileRule |
security_result.rule_name :ipsProfileRule |
直接从 ipsProfileRule 字段中提取的值。 |
ipsProtocol |
network.ip_protocol :ipsProtocol |
直接从 ipsProtocol 字段中提取的值。 |
log_type |
metadata.description :log_type metadata.log_type :log_type |
直接从 log_type 字段中提取的值。 |
mstatsTimeBlock |
metadata.collected_timestamp :mstatsTimeBlock |
直接从 mstatsTimeBlock 字段中提取的值,并使用 UNIX 格式转换为时间戳。 |
mstatsTotRecvdOctets |
network.received_bytes :mstatsTotRecvdOctets |
直接从 mstatsTotRecvdOctets 字段中提取的值,并转换为无符号整数。 |
mstatsTotSentOctets |
network.sent_bytes :mstatsTotSentOctets |
直接从 mstatsTotSentOctets 字段中提取的值,并转换为无符号整数。 |
mstatsTotSessCount |
additional.fields[].key :“mstatsTotSessCount”additional.fields[].value.string_value :mstatsTotSessCount |
直接从 mstatsTotSessCount 字段中获取的值。 |
mstatsTotSessDuration |
network.session_duration.seconds :mstatsTotSessDuration |
直接从 mstatsTotSessDuration 字段中提取并转换为整数的值。 |
mstatsType |
security_result.category_details :mstatsType |
直接从 mstatsType 字段中提取的值。 |
networkPrefix |
target.ip :networkPrefix target.port :networkPrefix |
从 networkPrefix 字段中提取的 IP 地址。从 networkPrefix 字段中提取并转换为整数的端口。 |
protocolIdentifier |
network.ip_protocol :protocolIdentifier |
直接从 protocolIdentifier 字段中提取的值,转换为整数,并使用查找功能映射到 IP 协议名称。 |
recvdOctets |
network.received_bytes :recvdOctets |
直接从 recvdOctets 字段中提取的值,并转换为无符号整数。 |
recvdPackets |
network.received_packets :recvdPackets |
直接从 recvdPackets 字段中提取并转换为整数的值。 |
remoteSite |
target.hostname :remoteSite |
直接从 remoteSite 字段中获取的值。 |
reverseForwardingClass |
security_result.detection_fields[].key :“reverseForwardingClass”security_result.detection_fields[].value :reverseForwardingClass |
直接从 reverseForwardingClass 字段中提取的值。 |
risk |
security_result.risk_score :risk |
直接从 risk 字段中提取并转换为浮点值。 |
rule |
security_result.rule_name :rule |
直接从 rule 字段中提取的值。 |
sentOctets |
network.sent_bytes :sentOctets |
直接从 sentOctets 字段中提取的值,并转换为无符号整数。 |
sentPackets |
network.sent_packets :sentPackets |
直接从 sentPackets 字段中提取并转换为整数的值。 |
serialNum |
security_result.detection_fields[].key :“serialNum”security_result.detection_fields[].value :serialNum |
直接从 serialNum 字段中提取的值。 |
signatureId |
security_result.detection_fields[].key :“signatureID”security_result.detection_fields[].value :signatureId |
直接从 signatureId 字段中获取的值。 |
signatureMsg |
security_result.detection_fields[].key :“signatureMsg”security_result.detection_fields[].value :signatureMsg |
直接从 signatureMsg 字段中获取的值。 |
signaturePriority |
security_result.severity :signaturePriority |
如果 signaturePriority 为“low”(不区分大小写),则为 LOW 。如果 signaturePriority 为“medium”(不区分大小写),则 MEDIUM 。如果 signaturePriority 为“high”(不区分大小写),则为 HIGH 。 |
site |
principal.hostname :site applianceName :site |
直接从 site 字段中提取的值。 |
siteId |
additional.fields[].key :“siteId”additional.fields[].value.string_value :siteId |
直接从 siteId 字段中提取的值。 |
siteName |
principal.hostname :siteName applianceName :siteName |
直接从 siteName 字段中提取的值。 |
sourceIPv4Address |
principal.ip :sourceIPv4Address |
直接从 sourceIPv4Address 字段中获取的值。 |
sourceIPv6Address |
principal.ip :sourceIPv6Address |
直接从 sourceIPv6Address 字段中获取的值。 |
sourcePort |
principal.port :sourcePort |
直接从 sourcePort 字段中提取并转换为整数的值。 |
sourceTransportPort |
principal.port :sourceTransportPort |
直接从 sourceTransportPort 字段中提取并转换为整数的值。 |
subFamily |
security_result.detection_fields[].key :“subFamily”security_result.detection_fields[].value :subFamily |
直接从 subFamily 字段中提取的值。 |
tcpConnAborted |
additional.fields[].key :“tcpConnAborted”additional.fields[].value.string_value :tcpConnAborted |
直接从 tcpConnAborted 字段中获取的值(如果不为空或“0”)。 |
tcpConnRefused |
additional.fields[].key :“tcpConnRefused”additional.fields[].value.string_value :tcpConnRefused |
直接从 tcpConnRefused 字段中获取的值(如果不为空或“0”)。 |
tcpPktsFwd |
network.sent_packets :tcpPktsFwd |
直接从 tcpPktsFwd 字段中提取并转换为整数的值。 |
tcpPktsRev |
network.received_packets :tcpPktsRev |
直接从 tcpPktsRev 字段中提取并转换为整数的值。 |
tcpReXmitFwd |
additional.fields[].key :“tcpReXmitFwd”additional.fields[].value.string_value :tcpReXmitFwd |
直接从 tcpReXmitFwd 字段中获取的值(如果不为空或“0”)。 |
tcpReXmitRev |
additional.fields[].key :“tcpReXmitRev”additional.fields[].value.string_value :tcpReXmitRev |
直接从 tcpReXmitRev 字段中获取的值(如果不为空或“0”)。 |
tcpSAA |
additional.fields[].key :“tcpSAA”additional.fields[].value.string_value :tcpSAA |
直接从 tcpSAA 字段中获取的值(如果不为空或“0”)。 |
tcpSSA |
additional.fields[].key :“tcpSSA”additional.fields[].value.string_value :tcpSSA |
直接从 tcpSSA 字段中获取的值(如果不为空或“0”)。 |
tcpSessCnt |
additional.fields[].key :“tcpSessCnt”additional.fields[].value.string_value :tcpSessCnt |
直接从 tcpSessCnt 字段中提取的值。 |
tcpSessDur |
network.session_duration.seconds :tcpSessDur |
直接从 tcpSessDur 字段中提取并转换为整数的值。 |
tcpSynAckReXmit |
additional.fields[].key :“tcpSynAckReXmit”additional.fields[].value.string_value :tcpSynAckReXmit |
直接从 tcpSynAckReXmit 字段中获取的值(如果不为空或“0”)。 |
tcpSynReXmit |
additional.fields[].key :“tcpSynReXmit”additional.fields[].value.string_value :tcpSynReXmit |
直接从 tcpSynReXmit 字段中获取的值(如果不为空或“0”)。 |
tcpTWHS |
additional.fields[].key :“tcpTWHS”additional.fields[].value.string_value :tcpTWHS |
直接从 tcpTWHS 字段中获取的值(如果不为空或“0”)。 |
tenantId |
principal.resource.attribute.labels[].key :“tenantId”principal.resource.attribute.labels[].value :tenantId |
直接从 tenantId 字段中提取的值。 |
tenantName |
observer.hostname :tenantName |
直接从 tenantName 字段中获取的值。 |
threatType |
security_result.detection_fields[].key :“threatType”security_result.detection_fields[].value :threatType |
直接从 threatType 字段中提取的值。 |
toCountry |
target.location.country_or_region :toCountry |
直接从 toCountry 字段中提取的值。 |
toZone |
additional.fields[].key :“toZone”additional.fields[].value.string_value :toZone |
直接从 toZone 字段中提取的值。 |
traffType |
additional.fields[].key :“traffType”additional.fields[].value.string_value :traffType |
直接从 traffType 字段中获取的值。 |
ts |
metadata.event_timestamp :ts |
直接从 ts 字段中提取并转换为时间戳的值。 |
type |
security_result.action :type |
如需了解逻辑,请参阅 action 。 |
urlAction |
security_result.action :urlAction |
如需了解逻辑,请参阅 action 。 |
urlActionMessage |
security_result.summary :urlActionMessage |
直接从 urlActionMessage 字段中获取的值。 |
urlCategory |
principal.resource.attribute.labels[].key :“urlCategory”principal.resource.attribute.labels[].value :urlCategory |
直接从 urlCategory 字段中获取的值。 |
urlProfile |
additional.fields[].key :“urlProfile”additional.fields[].value.string_value :urlProfile |
直接从 urlProfile 字段中获取的值。 |
urlReputation |
security_result.severity_details :urlReputation |
直接从 urlReputation 字段中获取的值。 |
user |
principal.ip :user |
直接从 user 字段中获取的值。 |
vsnId |
principal.resource.attribute.labels[].key :“vsnId”principal.resource.attribute.labels[].value :vsnId |
直接从 vsnId 字段中获取的值。硬编码的值。硬编码的值。 |
更改
2024-06-03
- 将“idpAction”映射到“security_result.action”。
- 将“threatType”映射到“security_result.detection_fields”。
- 将“ipsDirection”映射到“security_result.detection_fields”。
- 将“ipsProfile”映射到“security_result.detection_fields”。
- 将“signaturePriority”映射到“security_result.severity”。
- 将“signatureMsg”映射到“security_result.detection_fields”。
- 将“signatureId”映射到“security_result.detection_fields”。
- 将“ipsApplication”映射到“security_result.detection_fields”。
- 将“classMsg”映射到“security_result.description”。
- 将“ipsProfileRule”映射到“security_result.rule_name”。
- 将“ipsProtocol”映射到“network.ip_protocol”。
2023-07-03
- 添加了对“entitlementlog”“monstatslog”和“tcpappmonlog”的支持。
2022-11-04
- 新创建了解析器。