收集 Symantec VIP Authentication Hub 日志
本文档介绍了如何使用 Bindplane 代理将 Symantec VIP Authentication Hub 日志注入到 Google Security Operations。
Symantec VIP Authentication Hub 是一个基于云的身份和身份验证平台,可为身份验证事件、用户同步、API 访问、OAuth 流程和 LDAP 目录操作生成 syslog 消息。解析器会从 JSON 格式的日志中提取字段,并将其映射到统一数据模型 (UDM)。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- Windows Server 2016 或更高版本,或者具有
systemd的 Linux 主机 - Bindplane 代理与 Symantec VIP 身份验证中心之间的网络连接
- 如果在代理后面运行,请确保防火墙端口已根据 Bindplane 代理要求打开
- 对 Symantec VIP Gateway 网页界面的管理员访问权限
获取 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该服务应显示为 正在运行。
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 /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
修改配置文件
将
config.yaml的全部内容替换为以下配置:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/symantec_vip_authhub: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: SYMANTEC_VIP_AUTHHUB raw_log_field: body service: pipelines: logs/symantec_vip_authhub_to_chronicle: receivers: - udplog exporters: - chronicle/symantec_vip_authhub
配置参数
替换以下占位符:
接收器配置:
listen_address:要监听的 IP 地址和端口:0.0.0.0侦听所有接口(推荐)- 端口
514是标准 syslog 端口(在 Linux 上需要 root 权限;对于非 root 用户,请使用1514)
导出器配置:
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 - 如需查看完整列表,请参阅区域级端点
- 美国:
保存配置文件
- 修改后,保存文件:
- 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"
- 按
在 Symantec VIP Authentication Hub 中配置 syslog
- 登录 Symantec VIP Gateway 网页界面。
- 依次前往日志 > Syslog 配置。
- 如果这是您首次配置 Syslog,请在系统提示时选择是。如果已配置,请点击修改。
- 提供以下配置详细信息:
- Syslog Facility:选择 LOG_LOCAL0。
- Syslog Host:输入 Bindplane 代理 IP 地址。
- Syslog 端口:输入 Bindplane 代理端口号(例如,UDP 为
514)。
- 点击保存。
- 前往身份提供商 > 自助服务门户配置。
- 修改以下配置详细信息:
- 日志记录级别:选择信息。
- Enable Syslog(启用 Syslog):选择 Yes(是)。
- 点击提交。
- 依次前往身份提供方 > VIP 管理器身份验证配置。
- 修改以下配置详细信息:
- 日志记录级别:选择信息。
- Enable Syslog(启用 Syslog):选择 Yes(是)。
- 点击提交。
- 前往用户存储区 > LDAP 目录同步。
- 修改以下配置详细信息:
- 日志级别:选择信息。
- Enable Syslog(启用 Syslog):选择 Yes(是)。
- 点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
/auth/v1/authenticate |
security_result.detection_fields[].value |
该值取自原始日志中的 /auth/v1/authenticate 字段,并分配给键为 api 的 security_result.detection_fields 对象。 |
__isAuditIdLcmIdStore |
additional.fields[].value.string_value |
该值取自原始日志中的 __isAuditIdLcmIdStore 字段,并分配给键为 __isAuditIdLcmIdStore 的 additional.fields 对象。 |
accessTokenScopes |
security_result.detection_fields[].value |
该值取自原始日志中的 accessTokenScopes 字段,并分配给键为 accessTokenScopes 的 security_result.detection_fields 对象。 |
accessTokenTid |
security_result.detection_fields[].value |
该值取自原始日志中的 accessTokenTid 字段,并分配给键为 accessTokenTid 的 security_result.detection_fields 对象。 |
api |
security_result.detection_fields[].value |
该值取自原始日志中的 api 字段,并分配给键为 api 的 security_result.detection_fields 对象。 |
appId |
additional.fields[].value.string_value |
该值取自原始日志中的 appId 字段,并分配给键为 appId 的 additional.fields 对象。 |
appName |
principal.application |
该值取自原始日志中的 appName 字段。 |
azpName |
additional.fields[].value.string_value |
该值取自原始日志中的 azpName 字段,并分配给键为 azpName 的 additional.fields 对象。 |
bytes_sent |
network.sent_bytes |
该值取自原始日志中的 bytes_sent 字段。 |
client |
principal.asset.ip,principal.ip |
系统会使用 grok 模式从原始日志的 client 字段中提取 IP 地址,并将其添加到 principal.ip 和 principal.asset.ip 字段中。 |
clientId |
additional.fields[].value.string_value,principal.user.userid |
该值取自原始日志中的 clientId 字段,并分配给键为 clientId 的 additional.fields 对象。如果 clientId 字段不为空,系统还会使用它来填充 principal.user.userid 字段。 |
clientIp |
principal.asset.ip,principal.ip |
该值取自原始日志中的 clientIp 字段,并添加到 principal.ip 和 principal.asset.ip 字段中。 |
clientTid |
additional.fields[].value.string_value |
该值取自原始日志中的 clientTid 字段,并分配给键为 clientTid 的 additional.fields 对象。 |
clientTxnId |
additional.fields[].value.string_value |
该值取自原始日志中的 clientTxnId 字段,并分配给键为 clientTxnId 的 additional.fields 对象。 |
contentType |
additional.fields[].value.string_value |
该值取自原始日志中的 contentType 字段,并分配给键为 contentType 的 additional.fields 对象。 |
countryISO |
principal.location.country_or_region |
该值取自原始日志中的 countryISO 字段。 |
eventId |
metadata.product_event_type |
该值取自原始日志中的 eventId 字段。 |
flowStateId |
additional.fields[].value.string_value |
该值取自原始日志中的 flowStateId 字段,并分配给键为 flowStateId 的 additional.fields 对象。 |
geo.city_name |
principal.location.city |
该值取自原始日志中的 geo.city_name 字段。 |
geo.country_name |
principal.location.country_or_region |
该值取自原始日志中的 geo.country_name 字段。 |
geo.location.lat |
principal.location.region_coordinates.latitude |
该值取自原始日志中的 geo.location.lat 字段,转换为浮点数,并重命名为 principal.location.region_coordinates.latitude。 |
geo.location.lon |
principal.location.region_coordinates.longitude |
该值取自原始日志中的 geo.location.lon 字段,转换为浮点数,并重命名为 principal.location.region_coordinates.longitude。 |
guid |
metadata.product_log_id |
该值取自原始日志中的 guid 字段。 |
host |
principal.asset.hostname,principal.hostname |
该值取自原始日志中的 host 字段,去除了所有引号,并添加到了 principal.hostname 和 principal.asset.hostname 字段中。 |
httpMethod |
network.http.method |
该值取自原始日志中的 httpMethod 字段。 |
httpReferrer |
network.http.referral_url |
该值取自原始日志中的 httpReferrer 字段。 |
identitySourceId |
additional.fields[].value.string_value |
该值取自原始日志中的 identitySourceId 字段,并分配给键为 identitySourceId 的 additional.fields 对象。 |
internal-user-sync-ext-resourceGuid |
target.user.userid |
该值取自原始日志中的 internal-user-sync-ext-resourceGuid 字段。 |
internal-user-sync-ext-resourceName |
target.user.email_addresses |
该值取自原始日志中的 internal-user-sync-ext-resourceName 字段,并添加到 target.user.email_addresses 字段中。 |
issuerUrl |
target.url |
该值取自原始日志中的 issuerUrl 字段。 |
kubernetes.annotations.cni.projectcalico.org_containerID |
target.resource.product_object_id |
该值取自原始日志中的 kubernetes.annotations.cni.projectcalico.org_containerID 字段。 |
kubernetes.annotations.cni.projectcalico.org_podIP |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.annotations.cni.projectcalico.org_podIP 字段,并分配给键为 podIP 的 target.resource.attribute.labels 对象。 |
kubernetes.annotations.cni.projectcalico.org_podIPs |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.annotations.cni.projectcalico.org_podIPs 字段,并分配给键为 podIPs 的 target.resource.attribute.labels 对象。 |
kubernetes.container_hash |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.container_hash 字段,并分配给键为 container_hash 的 target.resource.attribute.labels 对象。 |
kubernetes.container_image |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.container_image 字段,并分配给键为 container_image 的 target.resource.attribute.labels 对象。 |
kubernetes.container_name |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.container_name 字段,并分配给键为 container_name 的 target.resource.attribute.labels 对象。 |
kubernetes.docker_id |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.docker_id 字段,并分配给键为 docker_id 的 target.resource.attribute.labels 对象。 |
kubernetes.host |
principal.asset.hostname,principal.hostname |
该值取自原始日志中的 kubernetes.host 字段,并添加到 principal.hostname 和 principal.asset.hostname 字段中。 |
kubernetes.labels.app |
此字段未映射到 UDM 中的 IDM 对象。 | |
kubernetes.labels.app.kubernetes.io/component |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/component 字段,并分配给键为 io_component 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.app.kubernetes.io/instance |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/instance 字段,并分配给键为 io_instance 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.app.kubernetes.io/managed-by |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/managed-by 字段,并分配给键为 io_managed-by 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.app.kubernetes.io/name |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/name 字段,并分配给键为 io_name 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.app.kubernetes.io/part-of |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/part-of 字段,并分配给键为 io_part-of 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.app.kubernetes.io/version |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.app.kubernetes.io/version 字段,并分配给键为 io_version 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.helm.sh/chart |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.helm.sh/chart 字段,并分配给键为 helm_sh_chart 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.helmChartName |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.helmChartName 字段,并分配给键为 helmChartName 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.imageTag |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.imageTag 字段,并分配给键为 imageTag 的 target.resource.attribute.labels 对象。 |
kubernetes.labels.pod-template-hash |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.labels.pod-template-hash 字段,并分配给键为 pod-template-hash 的 target.resource.attribute.labels 对象。 |
kubernetes.namespace_name |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.namespace_name 字段,并分配给键为 namespace_name 的 target.resource.attribute.labels 对象。 |
kubernetes.pod_id |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.pod_id 字段,并分配给键为 pod_id 的 target.resource.attribute.labels 对象。 |
kubernetes.pod_name |
target.resource.attribute.labels[].value |
该值取自原始日志中的 kubernetes.pod_name 字段,并分配给键为 pod_name 的 target.resource.attribute.labels 对象。 |
level |
security_result.severity |
如果原始日志中的 level 字段与 notice 或 info(不区分大小写)匹配,则 security_result.severity 字段设置为 INFORMATIONAL。 |
log |
security_result.description、level、kv_data |
level 和 kv_data 字段使用 grok 模式从原始日志的 log 字段中提取。security_result.description 字段填充了整个 log 字段。 |
logtag |
additional.fields[].value.string_value |
该值取自原始日志中的 logtag 字段,并分配给键为 logtag 的 additional.fields 对象。 |
method |
network.http.method |
该值取自原始日志中的 method 字段。 |
msg |
metadata.event_type,security_result.description |
该值取自原始日志中的 msg 字段,并用于填充 security_result.description 字段。metadata.event_type 字段根据 msg 字段的内容确定:* 如果 msg 包含 Internal user created or updated,则为 USER_CREATION。* 如果 msg 包含 Authorization Initiated Succesfully、Authentication Initiated Successfully 或 Authentication Successful,则为 USER_LOGIN。* 如果 msg 包含 Token Generated 或 token verified,则为 USER_RESOURCE_ACCESS。* 如果 has_principal 和 has_target 均为 true,则为 NETWORK_CONNECTION。* 如果 has_principal 为 true,则为 STATUS_UPDATE。* 否则为 GENERIC_EVENT。 |
path |
principal.file.full_path |
该值取自原始日志中的 path 字段。 |
principalId |
additional.fields[].value.string_value,principal.user.userid |
该值取自原始日志中的 principalId 字段,并分配给键为 principalId 的 additional.fields 对象。如果 principalId 字段不是 clientId 且不为空,则还会用于填充 principal.user.userid 字段。 |
principalType |
additional.fields[].value.string_value |
该值取自原始日志中的 principalType 字段,并分配给键为 principalType 的 additional.fields 对象。 |
protocol |
network.application_protocol |
如果原始日志中的 protocol 字段与 HTTP(不区分大小写)匹配,则 network.application_protocol 字段设置为 HTTP。 |
referrer |
network.http.referral_url |
该值取自原始日志中的 referrer 字段,去除所有引号,并分配给 network.http.referral_url 字段。 |
relVersion |
metadata.product_version |
该值取自原始日志中的 relVersion 字段。 |
remoteAddr |
additional.fields[].value.string_value |
该值取自原始日志中的 remoteAddr 字段,并分配给键为 remoteAddr 的 additional.fields 对象。 |
requestId |
additional.fields[].value.string_value |
该值取自原始日志中的 requestId 字段,并分配给键为 requestId 的 additional.fields 对象。 |
requestTime |
additional.fields[].value.string_value |
该值取自原始日志中的 requestTime 字段,并分配给键为 requestTime 的 additional.fields 对象。 |
responseCode |
network.http.response_code |
使用 grok 模式从原始日志的 responseCode 字段中提取数值,将其转换为整数,并分配给 network.http.response_code 字段。 |
request |
method、path、protocol |
method、path 和 protocol 字段是从原始日志的 request 字段中提取的,方法是使用 grok 模式剥离所有引号。 |
server |
target.asset.hostname,target.hostname |
该值取自原始日志中的 server 字段,并添加到 target.hostname 和 target.asset.hostname 字段中。 |
service |
additional.fields[].value.string_value |
该值取自原始日志中的 service 字段,并分配给键为 service 的 additional.fields 对象。 |
status |
network.http.response_code |
该值取自原始日志中的 status 字段,转换为整数,并分配给 network.http.response_code 字段。 |
stream |
additional.fields[].value.string_value |
该值取自原始日志中的 stream 字段,并分配给键为 stream 的 additional.fields 对象。 |
sub |
additional.fields[].value.string_value |
该值取自原始日志中的 sub 字段,并分配给键为 sub 的 additional.fields 对象。 |
subType |
additional.fields[].value.string_value |
该值取自原始日志中的 subType 字段,并分配给键为 subType 的 additional.fields 对象。 |
tid |
additional.fields[].value.string_value |
该值取自原始日志中的 tid 字段,并分配给键为 tid 的 additional.fields 对象。 |
timestamp |
metadata.event_timestamp |
该值取自原始日志中的 timestamp 字段,并解析为 ISO8601 时间戳。 |
tname |
additional.fields[].value.string_value |
该值取自原始日志中的 tname 字段,并分配给键为 tname 的 additional.fields 对象。 |
txnId |
additional.fields[].value.string_value |
该值取自原始日志中的 txnId 字段,并分配给键为 txnId 的 additional.fields 对象。 |
type |
additional.fields[].value.string_value |
该值取自原始日志中的 type 字段,并分配给键为 type 的 additional.fields 对象。 |
userAgent |
network.http.parsed_user_agent,network.http.user_agent |
该值取自原始日志中的 userAgent 字段,并分配给 network.http.user_agent 和 network.http.parsed_user_agent 字段。然后,network.http.parsed_user_agent 字段会转换为已解析的用户代理对象。 |
userDN |
additional.fields[].value.string_value |
该值取自原始日志中的 userDN 字段,并分配给键为 userDN 的 additional.fields 对象。 |
userGuid |
additional.fields[].value.string_value |
该值取自原始日志中的 userGuid 字段,并分配给键为 userGuid 的 additional.fields 对象。 |
userIdpGuid |
additional.fields[].value.string_value |
该值取自原始日志中的 userIdpGuid 字段,并分配给键为 userIdpGuid 的 additional.fields 对象。 |
userIP |
principal.asset.ip、principal.ip、target.asset.ip、target.ip、intermediary.ip |
系统会使用 Grok 模式从原始日志的 userIP 字段中提取 IP 地址。第一个 IP 地址会添加到 principal.ip 和 principal.asset.ip 字段中。第二个 IP 地址已添加到 target.ip 和 target.asset.ip 字段中。第三个 IP 地址已添加到 intermediary.ip 字段中。 |
userLoginId |
target.user.email_addresses |
如果原始日志中的 userLoginId 字段不为空且与电子邮件地址模式匹配,则会将其添加到 target.user.email_addresses 字段。 |
userLoginIdAttributeMappingName |
target.user.user_display_name |
该值取自原始日志中的 userLoginIdAttributeMappingName 字段。 |
userRiskLevel |
additional.fields[].value.string_value |
该值取自原始日志中的 userRiskLevel 字段,并分配给键为 userRiskLevel 的 additional.fields 对象。 |
userRiskScore |
additional.fields[].value.string_value |
该值取自原始日志中的 userRiskScore 字段,并分配给键为 userRiskScore 的 additional.fields 对象。 |
userIp |
principal.asset.ip,principal.ip |
该值取自原始日志中的 userIp 字段,并添加到 principal.ip 和 principal.asset.ip 字段中。 |
userUniversalId |
additional.fields[].value.string_value |
该值取自原始日志中的 userUniversalId 字段,并分配给键为 userUniversalId 的 additional.fields 对象。 |
vhost |
additional.fields[].value.string_value |
该值取自原始日志中的 vhost 字段,并分配给键为 vhost 的 additional.fields 对象。 |
| 不适用 | extensions.auth.type |
如果 metadata.event_type 字段为 USER_LOGIN,则该值设置为 SSO。 |
| 不适用 | metadata.log_type |
该值设置为 SYMANTEC_VIP_AUTHHUB。 |
azserver-idp-response-verify-cert-ext-idpId", "__THIS_RESOURCE_ID" and "admin-identityprovider-create-ext-resourceGuid |
principal.user.attribute.cloud.project.id |
从变更日志映射 |
thread |
additional.fields |
从变更日志映射 |
remoteUser |
additional.fields |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_component |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_instance |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_name |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_managed-by |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_part-of |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.app.kubernetes.io_version |
target.resource.attribute.labels |
从变更日志映射 |
kubernetes.labels.helm.sh_chart |
target.resource.attribute.labels |
从变更日志映射 |
reqLength |
additional.fields |
从变更日志映射 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。