收集 Versa Networks 安全访问服务边缘 (SASE) 日志
本文档介绍了如何收集 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 代理
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 上的/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。将
/path/to/ingestion-authentication-file.json更新为获取 Google SecOps 提取身份验证文件部分中保存身份验证文件的路径。
重启 Bindplane 代理以应用更改
在 Linux 中,如需重启 Bindplane 代理,请运行以下命令:
sudo systemctl restart bindplane-agent在 Windows 中,如需重启 Bindplane 代理,您可以使用服务控制台,也可以输入以下命令:
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 是“reject”“drop”“block”“deny”,则为 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: appFamilysecurity_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:destIpdestinationIPv4Address: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:fromCountrytarget.location.country_or_region:fromCountry |
直接从 fromCountry 字段中获取的值。 |
fromUser |
principal.user.userid:fromUser |
如果 fromUser 字段不为空、不为“unknown”或“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_typemetadata.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:networkPrefixtarget.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:siteapplianceName:site |
直接从 site 字段中获取的值。 |
siteId |
additional.fields[].key: "siteId"additional.fields[].value.string_value: siteId |
直接从 siteId 字段中获取的值。 |
siteName |
principal.hostname:siteNameapplianceName: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 字段中获取的值。硬编码的值。硬编码的值。 |
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。