收集 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 : 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”或“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 字段中获取的值。硬编码的值。硬编码的值。 |
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。