收集 Ansible AWX 日志
概览
此解析器会从 Ansible AWX 中提取 JSON 格式的日志数据,并将其转换为统一数据模型 (UDM)。它可以处理各种日志格式,提取时间戳、IP 地址、主机信息和事件详情等相关字段,并将其映射到相应的 UDM 字段,还可以处理特定边缘情况,并使用标签和元数据丰富数据。
准备工作
- 确保您拥有 Google SecOps 实例。
- 确保您拥有对 Ansible AWX 的超级用户访问权限。
在 Google SecOps 中配置 Feed 以注入 Ansible AWX 日志
- 依次前往 SIEM 设置 > Feed。
- 点击新增。
- 在 Feed 名称字段中,输入 Feed 的名称(例如 Ansible AWX 日志)。
- 选择Webhook 作为来源类型。
- 选择 Ansible AWX 作为日志类型。
- 点击下一步。
- 可选:为以下输入参数指定值:
- 分隔符:用于分隔日志行(例如
\n
)的分隔符。 - 资源命名空间:资源命名空间。
- 提取标签:应用于此 Feed 中的事件的标签。
- 分隔符:用于分隔日志行(例如
- 点击下一步。
- 在最终确定界面中查看 Feed 配置,然后点击提交。
- 点击生成 Secret 密钥,生成用于对此 Feed 进行身份验证的 Secret 密钥。
- 复制并存储密钥。您将无法再查看此密钥。如有必要,您可以重新生成新的 Secret 密钥,但此操作会使之前的 Secret 密钥过时。
- 在详情标签页中,从端点信息字段复制 Feed 端点网址。您需要在客户端应用中指定此端点网址。
- 点击完成。
为该网站钩子 Feed 创建 API 密钥
依次前往 Google Cloud 控制台 > 凭据。
点击创建凭据,然后选择 API 密钥。
限制 API 密钥对 Google Security Operations API 的访问权限。
指定端点网址
- 在客户端应用中,指定 webhook Feed 中提供的 HTTPS 端点网址。
通过在自定义标头中指定 API 密钥和密钥(格式如下)来启用身份验证:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
建议:请以标头的形式指定 API 密钥,而不是在网址中指定。如果您的 webhook 客户端不支持自定义标头,您可以使用以下格式的查询参数指定 API 密钥和密钥:
ENDPOINT_URL?key=API_KEY&secret=SECRET
替换以下内容:
ENDPOINT_URL
:Feed 端点网址。API_KEY
:用于对 Google Security Operations 进行身份验证的 API 密钥。SECRET
:您为对 Feed 进行身份验证而生成的密钥。
在 Ansible AWX 中配置 Webhook
- 登录您的 AWX 实例。
- 前往管理下的通知部分。
- 点击添加。
配置 Webhook 设置:
- 名称:为该 Webhook 提供描述性名称(例如 Google SecOps Webhook)。
- 类型:从列表中选择 Webhook。
- 目标网址:输入 Google SecOps API 端点网址。
- HTTP 方法:选择 POST。
可选:HTTP 标头:添加任何必要的身份验证或内容类型标头。例如,您可能需要添加包含不记名令牌的
Authorization
标头。如需了解具体标头要求,请参阅 Google SecOps 文档。点击保存以创建该 Webhook。
前往资源下的项目。
选择要与该 webhook 关联的项目。
在所选项目中,前往通知标签页。
选择要为之前创建的 Webhook 通知开启哪些触发器:开始 | 成功 | 失败。
现在,这些通知将应用于与项目关联的所有模板。您可以前往每个模板中的通知字段,手动停用这些通知。
UDM 映射表
日志字段 | UDM 映射 | 逻辑 |
---|---|---|
agent.ephemeral_id |
observer.labels.value |
原始日志中的 agent.ephemeral_id 值。 |
agent.hostname |
observer.hostname |
原始日志中的 agent.hostname 值。 |
agent.id |
observer.asset_id |
原始日志中的“filebeat:”和 agent.id 值的串联。 |
agent.name |
observer.user.userid |
原始日志中的 agent.name 值。 |
agent.type |
observer.application |
原始日志中的 agent.type 值。 |
agent.version |
observer.platform_version |
原始日志中的 agent.version 值。 |
cloud.availability_zone |
principal.resource.attribute.labels.value |
原始日志中的 cloud.availability_zone 值。 |
cloud.instance.id |
principal.resource.product_object_id |
原始日志中的 cloud.instance.id 值。 |
cloud.instance.name |
principal.resource.name |
原始日志中的 cloud.instance.name 值。 |
cloud.machine.type |
principal.resource.attribute.labels.value |
原始日志中的 cloud.machine.type 值。 |
cloud.provider |
principal.resource.attribute.labels.value |
原始日志中的 cloud.provider 值。 |
event1 |
metadata.description |
原始日志中的 event1 值。如果 event1 不存在,则使用 message 的值。 |
event1_data.host |
principal.hostname |
原始日志中的 event1_data.host 值。如果 host_name 和 host 不存在,则用作后备。 |
event1_data.remote_addr |
principal.ip |
使用 Grok 模式从 event1_data.remote_addr 中提取的 IP 地址。 |
event1_data.task |
security_result.detection_fields.value |
原始日志中的 event1_data.task 值。 |
event1_data.task_path |
principal.process.file.full_path |
原始日志中的 event1_data.task_path 值。 |
event1_data.task_uuid |
security_result.detection_fields.value |
原始日志中的 event1_data.task_uuid 值。 |
event1_data.uuid |
metadata.product_log_id |
原始日志中的 event1_data.uuid 值。 |
event1_display |
security_result.description |
原始日志中的 event1_display 值。 |
host |
principal.hostname |
原始日志中的 host 值。如果 host_name 不存在,则用作后备。如果它是数字,则会转换为字符串。 |
host.architecture |
target.asset.hardware.cpu_platform |
原始日志中的 host.architecture 值。 |
host.fqdn |
target.administrative_domain |
原始日志中的 host.fqdn 值。 |
host.hostname |
target.hostname |
原始日志中的 host.hostname 值。 |
host.id |
target.asset.asset_id |
“Host Id:”与原始日志中的 host.id 值串联。 |
host.ip |
target.asset.ip |
原始日志中的 host.ip 数组的值。 |
host.mac |
target.mac |
原始日志中的 host.mac 数组的值。 |
host.os.codename |
target.asset.attribute.labels.value |
原始日志中的 host.os.codename 值。 |
host.os.kernel |
target.platform_patch_level |
原始日志中的 host.os.kernel 值。 |
host.os.name |
target.asset.attribute.labels.value |
原始日志中的 host.os.name 值。 |
host.os.platform |
target.platform |
如果 host.os.platform 的值为“debian”,则 UDM 字段会设置为“LINUX”。 |
host.os.version |
target.platform_version |
原始日志中的 host.os.version 值。 |
host_name |
principal.hostname |
原始日志中的 host_name 值。 |
input.type |
network.ip_protocol |
如果 input.type 的值为“tcp”,则 UDM 字段会设置为“TCP”。 |
level |
security_result.severity |
根据 level 的值:“DEBUG”“INFO”“AUDIT”映射到“INFORMATIONAL”;“ERROR”映射到“ERROR”;“WARNING”映射到“MEDIUM”。 |
level |
security_result.severity_details |
原始日志中的 level 值。 |
log.source.address |
principal.ip |
使用 Grok 模式从 log.source.address 中提取的 IP 地址。 |
log.source.address |
principal.port |
使用 Grok 模式从 log.source.address 中提取的端口。 |
logger_name |
intermediary.application |
原始日志中的 logger_name 值。 |
message |
metadata.description |
原始日志中的 message 值。如果 event1 不存在,则用作后备。 |
metadata.event_type |
metadata.event_type |
由解析器逻辑根据是否存在特定字段来确定。如果存在 log.source.address 和 host.ip ,则为“NETWORK_CONNECTION”。如果存在 principal_hostname 或 event1_data.remote_addr ,则为“STATUS_UPDATE”。否则为“GENERIC_EVENT”。 |
metadata.log_type |
metadata.log_type |
已硬编码为“ANSIBLE_AWX”。 |
metadata.product_name |
metadata.product_name |
已硬编码为“ANSIBLE_AWX”。 |
metadata.vendor_name |
metadata.vendor_name |
已硬编码为“ANSIBLE_AWX”。 |
parent_uuid |
security_result.detection_fields.value |
原始日志中的 parent_uuid 值。 |
principal.resource.resource_type |
principal.resource.resource_type |
如果存在 cloud.instance.name ,则硬编码为“VIRTUAL_MACHINE”。 |
observer.labels.key |
observer.labels.key |
已硬编码为“ephemeral_id”。 |
principal.resource.attribute.labels.key |
principal.resource.attribute.labels.key |
硬编码为“machine_type”“provider”或“availability_zone”,具体取决于要映射的字段。 |
security_result.detection_fields.key |
security_result.detection_fields.key |
硬编码为“parent_uuid”“task”或“task_uuid”,具体取决于要映射的字段。 |
target.asset.attribute.labels.key |
target.asset.attribute.labels.key |
硬编码为“codename”或“os_name”,具体取决于要映射的字段。 |
timestamp |
metadata.event_timestamp |
原始日志中的 timestamp 值,已解析并转换为时间戳。 |
timestamp |
timestamp |
原始日志中的 timestamp 值,已解析并转换为时间戳。 |
变化
2022-11-09
- 新创建的解析器。