收集 Ansible AWX 日志

支持的平台:

概览

此解析器会从 Ansible AWX 中提取 JSON 格式的日志数据,并将其转换为统一数据模型 (UDM)。它可以处理各种日志格式,提取时间戳、IP 地址、主机信息和事件详情等相关字段,并将其映射到相应的 UDM 字段,还可以处理特定边缘情况,并使用标签和元数据丰富数据。

准备工作

  • 确保您拥有 Google SecOps 实例。
  • 确保您拥有对 Ansible AWX 的超级用户访问权限。

在 Google SecOps 中配置 Feed 以注入 Ansible AWX 日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击新增
  3. Feed 名称字段中,输入 Feed 的名称(例如 Ansible AWX 日志)。
  4. 选择Webhook 作为来源类型
  5. 选择 Ansible AWX 作为日志类型
  6. 点击下一步
  7. 可选:为以下输入参数指定值:
    • 分隔符:用于分隔日志行(例如 \n)的分隔符。
    • 资源命名空间资源命名空间
    • 提取标签:应用于此 Feed 中的事件的标签。
  8. 点击下一步
  9. 最终确定界面中查看 Feed 配置,然后点击提交
  10. 点击生成 Secret 密钥,生成用于对此 Feed 进行身份验证的 Secret 密钥。
  11. 复制并存储密钥。您将无法再查看此密钥。如有必要,您可以重新生成新的 Secret 密钥,但此操作会使之前的 Secret 密钥过时。
  12. 详情标签页中,从端点信息字段复制 Feed 端点网址。您需要在客户端应用中指定此端点网址。
  13. 点击完成

为该网站钩子 Feed 创建 API 密钥

  1. 依次前往 Google Cloud 控制台 > 凭据

    转到“凭据”页面

  2. 点击创建凭据,然后选择 API 密钥

  3. 限制 API 密钥对 Google Security Operations API 的访问权限。

指定端点网址

  1. 在客户端应用中,指定 webhook Feed 中提供的 HTTPS 端点网址。
  2. 通过在自定义标头中指定 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

  1. 登录您的 AWX 实例。
  2. 前往管理下的通知部分。
  3. 点击添加
  4. 配置 Webhook 设置:

    • 名称:为该 Webhook 提供描述性名称(例如 Google SecOps Webhook)。
    • 类型:从列表中选择 Webhook
    • 目标网址:输入 Google SecOps API 端点网址。
    • HTTP 方法:选择 POST

    可选:HTTP 标头:添加任何必要的身份验证或内容类型标头。例如,您可能需要添加包含不记名令牌的 Authorization 标头。如需了解具体标头要求,请参阅 Google SecOps 文档。

  5. 点击保存以创建该 Webhook。

  6. 前往资源下的项目

  7. 选择要与该 webhook 关联的项目

  8. 在所选项目中,前往通知标签页。

  9. 选择要为之前创建的 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_namehost 不存在,则用作后备。
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.addresshost.ip,则为“NETWORK_CONNECTION”。如果存在 principal_hostnameevent1_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

  • 新创建的解析器。