使用实体上下文图 (ECG)
本文档全面概述了实体上下文图 (ECG),包括其数据源、处理流水线以及在规则和搜索中的应用。ECG 是一种核心实体数据模型,可在检测规则、搜索和信息中心中为高级威胁检测、调查和威胁搜寻提供必要的背景信息。ECG 处理流水线会跨每个 Google SecOps 环境(合并)情境信息。
此外,ECG 还会计算实体的汇总指标,例如普及率(特定实体在 UDM 数据中相对于其他实体的出现频率)、实体的 first-seen-time 和 last-seen-time,以及关键的扩充来源和入侵指标 (IOC) 来源,例如 Google 威胁情报 (GTI)、Safe Browsing、WHOIS 和 VirusTotal 数据。
心电图使用 UDM 事件执行以下操作:
- 构建内部实体(资产和用户)和外部实体 (IOC) 的丰富、相关且全面的视图。
- 确定这些实体之间的关系。
心电图数据源
ECG 会整合来自以下来源的数据:
| 上下文来源 | 来源 | 说明 |
|---|---|---|
| 实体上下文 | 客户提供 | Google SecOps 可直接从外部系统提取结构化组织数据,例如有关用户和资产的权威详细信息。这些来源包括身份提供方 (IDP)、配置管理数据库 (CMDB) 系统(例如 ServiceNow CMDB、Duo User Context)和漏洞管理系统。 |
| 派生上下文 | Google SecOps 生成 | Google SecOps 会根据对提取的活动的分析生成统计数据。它可扩充您环境中各种来源(例如 Windows AD、Azure AD、Okta、 Google Cloud、IAM)的事件和实体。 例如:
|
| 全球形势 | Google 来源 | 全球来源提供内部和外部威胁情报以及声誉数据。
例如:
|
ECG 数据处理流水线
首先,UDM 别名化和扩充流水线会将原始安全事件提取并标准化为 UDM 结构。
然后,ECG 合并通过将来自多个来源(例如身份提供方、配置管理数据库 [CMDB]、威胁情报 Feed 和派生情境)的情境合并到单个整合的实体配置文件中,为每个实体构建丰富而权威的配置文件。ECG 合并会向 ECG 添加新的连接、属性和关系,并创建和更新派生上下文。
ECG 可构建有时限(时间性)实体和无时限(非时间性)实体。ECG 会评估指定规则和搜索时间范围内的有时限实体,同时评估无时限实体,而无需考虑搜索或规则的时间范围。
ECG 会通过匹配不同数据源中的通用键标识符(例如 hostname、MAC address、user ID 或 email address)来合并上下文记录。它会合并在这些值中匹配的记录,以构建实体的全面且丰富视图。
ECG 别名使用以下 UDM 字段作为“合并键”:
Assetentity.asset.product_object_identity.asset.hostnameentity.asset.asset_identity.asset.mac
Userentity.user.product_object_identity.user.useridentity.user.windows_sidentity.user.email_addressesentity.user.employee_id
Resourceentity.resource.product_object_identity.resource.name
Groupentity.group.product_object_identity.group.email_addressesentity.group.windows_sid
如果在合并过程中上述任何字段的值发生冲突,ECG 流水线将选择具有最新开始时间的值来更新实体。
ECG 会创建回溯期为 5 天的实体-情境数据。此流程可处理迟到的数据,并为实体上下文数据创建隐式存留时间。
ECG 可区分上下文数据(资产、用户、资源、群组)和入侵指标 (IOC)。
示例:通过心电图合并功能合并用户数据
Google SecOps 会从三个来源(Okta、Azure AD 和漏洞扫描器)注入用户数据,以用于 jdoe。ECG 会根据匹配的标识符(例如 jdoe@example.com)合并这三条记录,从而在 ECG 中创建一个统一的 jdoe 用户实体,其中包含来自所有三个来源的属性。
示例:消除冗余数据以创建通用实体
为了创建通用的组合实体,ECG 通过去重来消除冗余数据。为此,它会生成时间间隔,而不是匹配确切的时间戳。
例如,假设有两个实体 e1 和 e2,其时间戳分别为 t1 和 t2。如果 e1 和 e2 在其他方面完全相同,ECG 会忽略以下字段中的时间戳差异,从而对它们进行去重:
collected_timestampcreation_timestampinterval
关键实体和事件上下文 ECG 数据源
Google SecOps 需要多个特定的数据源才能创建和更新实体。
关键实体上下文 ECG 数据源
环境的用户和资产的权威数据源可提供用于构建实体数据模型的最关键的日志数据。例如:
| 类别 | 关键数据源 | 填充实体 |
|---|---|---|
| 身份和访问权限管理 | Active Directory、Azure AD、Okta、 Google Cloud Identity | user,group |
| 资产清单 | CMDB、JAMF、Microsoft Intune | asset |
| 威胁情报 | 自定义或第三方 Feed、Google Threat Intelligence (GTI) | ip_address,domain_name,file |
搜索内容示例
如需列出支持每个类别的解析器,请执行以下操作:
- 前往支持的日志类型(附带默认解析器)。
在搜索栏中输入类别,例如:
- 对于与资产清单相关的解析器,请输入
inventory或asset。 - 如需查看与身份和访问权限管理相关的解析器,请键入
identity。 - 对于与威胁情报相关的解析器,请输入
IOC。
- 对于与资产清单相关的解析器,请输入
实体分析的数据源和关键 UDM 字段
Google SecOps 会根据权威的实体背景信息数据源和关键 UDM 字段来增强实体个人资料:
| 实体类型 | 数据源 | 关键 UDM 字段(用于别名和索引编制) |
|---|---|---|
| 流程 | 端点日志提供 PSPI (`principal.process.product_specific_process_id`),这是一个稳定标识符,对于实现可靠的进程别名化至关重要。
例如 CrowdStrike EDR (CS_EDR) 和 Windows Sysmon (WINDOWS_SYSMON)。 |
source.process.product_specific_process_id |
| User | 这些来源提供用户属性和身份信息。 例如,Duo Entity context data (DUO_CONTEXT) 和 Okta (OKTA)。 |
source.user.userid、source.user.email_address、source.user.windows_sid、source.user.product_object_id |
| 资产或端点 | 这些来源可提供权威的媒体资源信息。 例如,ServiceNow CMDB (SERVICENOW_CMDB) 和 Tanium Asset (TANIUM_ASSET)。 |
source.ip、source.hostname、source.asset_id、principal.asset.hostname |
| 文件哈希值 | 提供数据内容的唯一“数字指纹”,以验证数据完整性。 | source.file.sha256、source.file.sha1、source.file.md5 |
关键事件情境数据 UDM 字段
Google SecOps 需要多个关键的事件上下文数据 UDM 字段。
最重要的 UDM 字段是充当稳定标识符和关系指示符(
principal.*、target.*、src_*和dst_*字段)的字段。查看属于
Entity graph功能领域的关键 UDM 字段的列表。如需构建全面的 ECG,请优先考虑可提供高价值标识符和关系数据的数据源。例如:
实体类型 关键数据源 用于构建实体的关键 UDM 字段 资产(主机) EDR 和 XDR、DNS 和 DHCP、防火墙、 Google Cloud 控制台审核日志 metadata.event_type、
principal.asset.asset_id、
principal.asset.hostname、
principal.ipUser 身份提供方 (IdP) 日志、HR Feed(上下文)、Cloud Identity 日志、电子邮件网关 principal.user.userid、
principal.user.email_addresses、
target.user.userid、
principal.ip网络 防火墙、VPN、DNS、VPC 流日志 principal.ip、
target.ip、
src_ip、
dst_ip、
network.direction文件和进程 EDR 和 XDR、应用日志 target.file.full_path、
target.process.file.full_path、
target.process.command_line
示例
ECG 数据依赖于这些 UDM 字段,以便在规则、搜索和信息中心内联接 ECG 数据和 UDM 事件数据。
例如,您可以在“暴力破解”监控规则中加入用户上下文数据,以便仅在相关用户也是“网域管理员”群组的成员且相关资产是网域控制器时发出提醒:
events:
$fail.metadata.event_type = "USER_LOGIN"
$fail.metadata.vendor_name = "Microsoft"
$fail.principal.hostname = $hostname
$fail.target.user.userid = $target_user
$fail.security_result.action = "BLOCK"
$fail.metadata.product_event_type = "4625"
$fail.metadata.event_timestamp.seconds < $success.metadata.event_timestamp.seconds
$success.metadata.event_type = "USER_LOGIN"
$success.metadata.vendor_name = "Microsoft"
$success.target.user.userid = $target_user
$success.principal.hostname = $hostname
$success.security_result.action = "ALLOW"
$success.metadata.product_event_type = "4624"
$user.graph.entity.user.userid = $target_user
$user.graph.metadata.entity_type = "USER"
$user.graph.metadata.source_type = "ENTITY_CONTEXT"
any $user.graph.relations.entity.group.group_display_name = "Domain Admins"
$asset.graph.entity.asset.hostname = $hostname
$asset.graph.metadata.entity_type = "ASSET"
$asset.graph.metadata.source_type = "ENTITY_CONTEXT"
any $asset.graph.relations.entity.group.group_display_name = "Domain Controllers"
match:
$target_user, $hostname over 15m
condition:
#fail > 4 and $success and $user and $asset
派生上下文丰富
Google SecOps 会根据组织在所有命名空间中的实体事件数据生成动态的事件驱动型推理数据。它会使用别名信息、来自内部丰富流程的数据和安全事件数据来建立关系(例如,asset 使用 IP address)。此流程会添加有价值的背景信息,以增强实体配置文件。
例如,它会向 file (hash) 实体添加 entity.file.sha256,并向 network (geolocation) 实体添加 (principal or target).ip_geo_artifact.location.country_or_region。
Google SecOps 会分析提取的活动中的多个指标,以丰富事件的背景信息。它会运行关键的丰富化函数来生成实体稀有度指标(例如普遍性统计信息)和时间指标(例如 first-seen-time 和 last-seen-time)。
普及率统计信息
ECG 还负责分析现有数据和传入数据,以计算和存储作为派生情境字段的流行度指标。这些指标表示您环境中 domain、file hash 或 IP address 等实体的数值“热度”值。这有助于您发现罕见或异常的活动,因为较受欢迎的实体通常不太可能是恶意实体。
Google SecOps 会定期更新这些统计信息,并将其存储在单独的实体上下文中。检测引擎可以使用这些值,您也可以使用 UDM 查询语法搜索这些值。不过,控制台不会将这些值与其他实体详细信息一起显示。
创建检测引擎规则时,您可以使用以下字段。
| 实体类型 | UDM 字段 |
|---|---|
| 网域 | entity.domain.prevalence.day_count
entity.domain.prevalence.day_max
entity.domain.prevalence.day_max_sub_domains
entity.domain.prevalence.rolling_max
entity.domain.prevalence.rolling_max_sub_domains |
| 文件(哈希) | entity.file.prevalence.day_count
entity.file.prevalence.day_max
entity.file.prevalence.rolling_max |
| IP 地址 | entity.artifact.prevalence.day_count
entity.artifact.prevalence.day_max
entity.artifact.prevalence.rolling_max |
Google SecOps 会以不同的方式计算 day_max 和 rolling_max 值,具体如下:
day_max是相应制品在一天内的最高流行度得分(一天是指世界协调时间 [UTC] 的 00:00:00 至 23:59:59)。rolling_max是相应制品在过去 10 天内的每日最高流行度得分(即day_max)。- 系统使用
day_count来计算rolling_max,其值始终为 10。
当系统为 domain 计算这些值时,day_max 与 day_max_sub_domains(以及 rolling_max 与 rolling_max_sub_domains)之间的差值如下所示:
rolling_max和day_max表示每天访问指定网域(不包括子网域)的唯一内部 IP 地址的数量。rolling_max_sub_domains和day_max_sub_domains表示访问给定网域(包括子网域)的唯一内部 IP 地址的数量。
Google SecOps 会使用新注入的实体数据计算流行度统计信息。Google SecOps 不会对之前提取的数据执行追溯计算。Google SecOps 大约需要 36 小时来计算和存储统计信息。
示例
ECG 需要这些 UDM 字段才能将相关情境数据加入规则或搜索中。您必须将所有与 ECG 相关的数据明确关联到 UDM 事件数据。
例如,您可以使用 ECG 中的 prevalence 数据来确定安全日志中与“罕见”网域的连接:
$dns.metadata.event_type = "NETWORK_DNS"
$dns.network.dns.questions.name != ""
$dns.network.dns.questions.name = $domain
$prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
$prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
$prevalence.graph.entity.hostname = $domain
$prevalence.graph.entity.domain.prevalence.day_count = 10
$prevalence.graph.entity.domain.prevalence.rolling_max > 0
$prevalence.graph.entity.domain.prevalence.rolling_max <= 3
match:
$domain over 5m
condition:
$dns and $prevalence
实体的首次出现时间和最后一次出现时间
Google SecOps 会分析传入的数据,以使用以下关键字段丰富实体情境记录:
first-seen-time:实体首次出现在您环境中的日期和时间。last-seen-time:最近一次观测的日期和时间。
借助这些派生字段,您可以关联 domain、file hash、asset、user 或 IP address 实体的活动。
系统会将这些值存储在以下 UDM 字段中:
| 实体类型 | UDM 字段 |
|---|---|
| 网域 | entity.domain.first_seen_timeentity.domain.last_seen_time |
| 文件(哈希) | entity.file.first_seen_timeentity.file.last_seen_time |
| IP 地址 | entity.artifact.first_seen_timeentity.artifact.last_seen_time |
| 素材资源 | entity.asset.first_seen_time |
| 用户 | entity.user.first_seen_time |
首次出现时间和最后一次出现时间计算的例外情况:
- 对于
asset和user实体,Google SecOps 只会填充first_seen_time字段,而不会填充last_seen_time字段。 - Google SecOps 不会计算各个命名空间内每个实体的统计信息。
- Google SecOps 不会将这些统计信息导出到 BigQuery 中的 Google SecOps
events架构。 - Google SecOps 不会针对其他实体类型(例如
group或resource)计算这些值。
全局上下文扩充
这些来源包括来自内部和第三方全球来源的外部威胁情报和声誉数据。
注入 Google Threat Intelligence 数据
Google SecOps 会从 Google Threat Intelligence (GTI) 数据源提取数据,并提供情境信息,以便调查您环境中的活动。
查询以下数据源:
- GTI Tor 退出节点:已知 Tor 退出节点的 IP 地址。
- GTI 良性二进制文件:属于原始操作系统分发版或通过官方操作系统补丁更新的文件。某些已被攻击者通过“借力打力”攻击中常见的活动滥用的官方操作系统二进制文件(例如专注于初始入口向量的二进制文件)已从该数据源中排除。
- GTI 远程访问工具:经常被恶意方使用的文件。 这些工具通常是合法的应用,但有时会被滥用,用于远程连接到遭入侵的系统。
系统会将这些上下文数据作为实体全局存储。您可以使用检测引擎规则查询数据。在规则中添加以下 UDM 字段和值,以查询这些全局实体:
graph.metadata.vendor_name=Google Threat Intelligencegraph.metadata.product_name=GTI Feed
有时限与无时限的 Google Threat Intelligence 数据源
Google Threat Intelligence 数据源包括有时限或无时限类型。
有时限数据源中的每个条目都有关联的时间范围。如果 Google SecOps 在第 1 天生成了检测结果,那么在未来的任何一天,Google SecOps 都应在回溯搜索期间针对第 1 天生成相同的检测结果。
无时间数据源没有关联的时间范围。这是因为您只需考虑最新的数据集。对于预计不会更改的数据(例如文件哈希),系统通常会使用无时限数据源。如果 Google SecOps 在第 1 天未生成检测结果,那么在第 2 天进行回溯搜索时,可能会针对第 1 天生成检测结果,因为无时限数据源中添加了新条目。
有关 Tor 退出节点 IP 地址的数据
Google SecOps 会提取并存储已知的 Tor 退出节点的 IP 地址。Tor 退出节点是流量离开 Tor 网络的点。Tor 退出节点数据是定时的。
Google SecOps 会将从相应数据源注入的信息存储在以下 UDM 字段中:
| UDM 字段 | 说明 |
|---|---|
<variable_name>.graph.metadata.vendor_name |
存储值 Google Threat Intelligence。 |
<variable_name>.graph.metadata.product_name |
存储值 GTI Feed。 |
<variable_name>.graph.metadata.threat.threat_feed_name |
存储值 Tor Exit Nodes。 |
<variable_name>.graph.entity.artifact.ip |
存储从 GTI 数据源注入的 IP 地址。 |
搜索内容示例
graph.metadata.source_type ="GLOBAL_CONTEXT"
graph.metadata.product_name = "GTI Feed"
graph.metadata.threat.threat_feed_name = "Tor Exit Nodes"
有关良性操作系统文件的数据
Google SecOps 会从 GTI Benign Binaries 数据源中提取并存储文件哈希。Google SecOps 会将从相应数据源注入的信息存储在以下 UDM 字段中。良性二进制文件数据是无时限的。
| UDM 字段 | 说明 |
|---|---|
<variable_name>.graph.metadata.vendor_name |
存储值 Google Threat Intelligence。 |
<variable_name>.graph.metadata.product_name |
存储值 GTI Feed。 |
<variable_name>.graph.metadata.threat.threat_feed_name |
存储值 Benign Binaries。 |
<variable_name>.graph.entity.file.sha256 |
存储文件的 SHA256 哈希值。 |
<variable_name>.graph.entity.file.sha1 |
存储文件的 SHA-1 哈希值。 |
<variable_name>.graph.entity.file.md5 |
存储文件的 MD5 哈希值。 |
搜索内容示例
graph.metadata.source_type ="GLOBAL_CONTEXT"
graph.metadata.product_name = "GTI Feed"
graph.metadata.threat.threat_feed_name = "Benign Binaries"
有关远程访问工具的数据
远程访问工具包括已知远程访问工具(例如恶意行为者经常使用的 VNC 客户端)的文件哈希。这些工具通常是合法应用,但有时会被滥用,以远程连接到遭入侵的系统。Google SecOps 会将从相应数据源注入的信息存储在以下 UDM 字段中。远程访问工具数据是永久性的。
| UDM 字段 | 说明 |
|---|---|
<variable_name>.graph.metadata.vendor_name |
存储值 Google Threat Intelligence。 |
<variable_name>.graph.metadata.product_name |
存储值 GTI Feed。 |
<variable_name>.graph.metadata.threat.threat_feed_name |
存储值 Remote Access Tools。 |
<variable_name>.graph.entity.file.sha256 |
存储文件的 SHA256 哈希值。 |
<variable_name>.graph.entity.file.sha1 |
存储文件的 SHA-1 哈希值。 |
<variable_name>.graph.entity.file.md5 |
存储文件的 MD5 哈希值。 |
搜索内容示例
graph.metadata.source_type ="GLOBAL_CONTEXT"
graph.metadata.product_name = "GTI Feed"
graph.metadata.threat.threat_feed_name = "Remote Access Tools"
利用安全浏览威胁列表中的信息丰富实体
Google SecOps 会从安全浏览功能中提取与文件哈希相关的数据。Google SecOps 会将每个文件的数据存储为实体,并提供有关该文件的其他背景信息。 您可以创建检测引擎规则来查询此实体情境数据,以构建情境感知分析。
Google SecOps 会将以下信息与实体上下文记录一起存储。
| UDM 字段 | 说明 |
|---|---|
entity.metadata.product_entity_id |
实体的唯一标识符。 |
entity.metadata.entity_type |
此值为 FILE,表示相应实体描述的是文件。
|
entity.metadata.collected_timestamp |
实体被观测到或事件发生的日期和时间。 |
entity.metadata.interval |
存储相应数据的有效开始时间和结束时间。由于威胁列表内容会随时间推移而变化,因此 start_time 和 end_time 会反映实体相关数据的有效时间间隔。例如,在 start_time 和 end_time 之间,某个文件哈希被发现具有恶意或可疑特征。 |
entity.metadata.threat.category |
Google SecOps SecurityCategory。系统会将此属性设置为以下一个或多个值:
|
entity.metadata.threat.severity |
这是 Google SecOps ProductSeverity。
如果值为 CRITICAL,则表示相应制品具有恶意性。
如果未指定该值,则没有足够的置信度来表明相应制品是恶意制品。
|
entity.metadata.product_name |
存储值 Google Safe Browsing。 |
entity.file.sha256 |
相应文件的 SHA256 哈希值。 |
规则示例
events:
// find a process launch event, match on hostname
$execution.metadata.event_type = "PROCESS_LAUNCH"
$execution.target.process.file.sha256 != ""
$execution.principal.hostname = $hostname
// join execution event with Safe Browsing graph
$sb.graph.entity.file.sha256 = $execution.target.process.file.sha256
// look for files deemed malicious
$sb.graph.metadata.entity_type = "FILE"
$sb.graph.metadata.threat.severity = "CRITICAL"
$sb.graph.metadata.product_name = "Google Safe Browsing"
match:
$hostname over 5m
condition:
$execution and $sb
利用 WHOIS 数据丰富实体
系统每天运行 WHOIS 数据扩充,这是一项关键功能。WHOIS 数据既是有时限的,也是无时限的。
在注入设备数据期间,Google SecOps 会根据 WHOIS 数据评估网域。如果网域匹配,Google SecOps 会将相关的 WHOIS 数据与网域的实体记录一起存储。对于具有 entity.metadata.entity_type = DOMAIN_NAME 的每个实体,Google SecOps 都会使用 WHOIS 信息对其进行丰富。
Google SecOps 会将丰富后的 WHOIS 数据填充到实体记录中的以下字段:
entity.domain.admin.attribute.labelsentity.domain.audit_update_timeentity.domain.billing.attribute.labelsentity.domain.billing.office_address.country_or_regionentity.domain.contact_emailentity.domain.creation_timeentity.domain.expiration_timeentity.domain.iana_registrar_identity.domain.name_serverentity.domain.private_registrationentity.domain.registrant.company_nameentity.domain.registrant.office_address.stateentity.domain.registrant.office_address.country_or_regionentity.domain.registrant.email_addressesentity.domain.registrant.user_display_nameentity.domain.registrarentity.domain.registry_data_raw_textentity.domain.statusentity.domain.tech.attribute.labelsentity.domain.update_timeentity.domain.whois_record_raw_textentity.domain.whois_serverentity.domain.zone
Google SecOps 会使用 global context WHOIS 记录中的 registrant、creation 和 expiration time 数据来扩充 domain 实体 (entity.metadata.entity_type = "DOMAIN_NAME")。
如需了解这些字段的说明,请参阅统一数据模型字段列表文档。
搜索内容示例
graph.metadata.source_type ="GLOBAL_CONTEXT"
graph.metadata.product_name = "WHOISXMLAPI Simple Whois"
graph.entity.domain.registry_data_raw_text != b""
最佳实践:确定可丰富全球背景信息的数据源
为了提高规则性能,请在使用来自全局上下文扩充来源的数据的规则中添加过滤条件,以标识特定的扩充类型或来源。
以下过滤参数用于标识丰富类型或来源:entity_type、product_name 和 vendor_name。
例如,在用于联接 WHOIS 数据的规则的 events 部分中添加以下过滤条件字段:
$enrichment.graph.metadata.entity_type = "DOMAIN_NAME"
$enrichment.graph.metadata.product_name = "WHOISXMLAPI Simple Whois"
$enrichment.graph.metadata.vendor_name = "WHOIS"
实体上下文图表的限制和建议
使用情境丰富的数据时,请考虑以下 ECG 行为:
- 请勿向实体数据添加间隔;而是让 ECG 创建间隔。这是因为 Google SecOps 会在去重期间生成间隔,除非另有指定。
- 如果您指定了时间间隔,Google SecOps 将仅对相同事件进行去重,并保留最新的实体。
- 为确保实时规则和回溯搜索按预期运行,您必须每天至少注入一次实体。
- 如果您不是每天注入实体,而是每隔两天或更长时间注入一次,实时规则可能会按预期运行;不过,回溯可能会丢失一些事件上下文。
- 如果您每天多次注入相同的实体,Google SecOps 会将它们去重为单个实体。
- 如果某天的事件数据缺失,Google SecOps 会暂时使用前一天的数据,以确保实时规则正常运行。
如需详细了解 Google SecOps 服务的一般限制,请参阅服务限制。
相关外部内容
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。