收集 Wordpress CMS 日志

支持的平台:

概览

此解析器会从 JSON 或纯文本格式的邮件中提取 WordPress CMS 日志。它可以处理 JSON 和非 JSON 格式的日志,解析相关字段并将其映射到 UDM,包括用户详细信息、网络信息、资源属性和安全结果详细信息。该解析器还会执行多种数据转换,例如转换数据类型、合并字段以及处理 Kubernetes 和其他资源的特定日志模式。

准备工作

  • 确保您拥有 Google SecOps 实例。
  • 确保您对 WordPress 网站具有特权访问权限。
  • 用于启用 Webhook 功能的插件(例如 WP Webhook)。

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

  1. 依次前往 SIEM 设置 > Feed
  2. 点击新增
  3. Feed 名称字段中,输入 Feed 的名称(例如 Wordpress 日志)。
  4. 选择 Webhook 作为来源类型
  5. 选择 Wordpress 作为日志类型
  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 进行身份验证而生成的密钥。

配置 Wordpress Webhook

  1. 通过 WordPress 插件目录安装激活 WP Webhooks 插件(或您选择的 webhook 插件)。
  2. 前往 WordPress 管理员菜单中的 WP Webhook 子菜单(通常位于“设置”下)。
  3. 点击顶栏菜单中的发送数据
  4. 选择将触发 webhook 的 WordPress 操作。常见示例包括 publish_post(发布新帖子时)、user_register(有新用户注册时)或 comment_post(发布新评论时)。这取决于您选择并发送到 Google SecOps 的数据。
  5. 点击添加 Webhook 网址
  6. 配置 Webhook:
    • 名称:为您的 Webhook 指定一个描述性名称(例如“Google SecOps Feed”)。
    • Webhook 网址:粘贴您的 Google SecOps 端点网址。
  7. 点击 Save Webhook(保存 Webhook)。

UDM 映射表

日志字段 UDM 映射 逻辑
ClientIP principal.ip 客户端的 IP 地址会从原始日志中的 ClientIP 字段中提取。
Code target.resource.attribute.labels.key 将值“Code”分配为 target.resource.attribute.labels 对象中的键。
Code target.resource.attribute.labels.value 系统会将原始日志中的 Code 字段的值分配为 target.resource.attribute.labels 对象中的值。
CurrentUserID target.user.userid 原始日志中的 CurrentUserID 会转换为字符串,并映射到 target.user.userid 字段。
EditUserLink target.url 原始日志中的 EditUserLink 会映射到 target.url 字段。
EventType metadata.product_event_type 原始日志中的 EventType 会映射到 metadata.product_event_type 字段。
FirstName target.user.first_name 原始日志中的 FirstName 会映射到 target.user.first_name 字段。
insertId metadata.product_log_id 原始日志中的 insertId 会映射到 metadata.product_log_id 字段。
labels.compute.googleapis.com/resource_name additional.fields.key 将值“Resource Name”分配为 additional.fields 对象中的键。
labels.compute.googleapis.com/resource_name additional.fields.value.string_value 原始日志中的 labels.compute.googleapis.com/resource_name 值会被分配为 additional.fields 对象中的字符串值。
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.key 将值“Kubernetes IO 实例”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/app_kubernetes_io/instance 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.key 将值“Kubernetes IO Instance Manager”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/app_kubernetes_io/managed-by 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.key 将值“Kubernetes IO 实例名称”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/app_kubernetes_io/name 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.key 将值“Controller Revision Hash”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/controller-revision-hash 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.key 将值“Kubernetes IO Instance Manager SH”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/helm_sh/chart 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/k8s-app target.resource.attribute.labels.key 将值“Application”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/k8s-app target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/k8s-app 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.key 将值“Pod 模板生成版本”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/pod-template-generation 值会被分配为 target.resource.attribute.labels 对象中的值。
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.key 将值“Pod 模板哈希”分配为 target.resource.attribute.labels 对象中的键。
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.value 原始日志中的 labels.k8s-pod/pod-template-hash 值会被分配为 target.resource.attribute.labels 对象中的值。
LastName target.user.last_name 原始日志中的 LastName 会映射到 target.user.last_name 字段。
logName target.resource.attribute.labels.key 将“Log Name”值分配为 target.resource.attribute.labels 对象中的键。
logName target.resource.attribute.labels.value 系统会将原始日志中的 logName 字段的值分配为 target.resource.attribute.labels 对象中的值。
receiveTimestamp metadata.event_timestamp 系统会解析原始日志中的 receiveTimestamp,并将其映射到 metadata.event_timestamp 字段。
resource.labels.cluster_name additional.fields.key 将值“Cluster Name”分配为 additional.fields 对象中的键。
resource.labels.cluster_name additional.fields.value.string_value 原始日志中的 resource.labels.cluster_name 值会被分配为 additional.fields 对象中的字符串值。
resource.labels.cluster_name target.resource.resource_type 如果存在 resource.labels.cluster_name,则将值“CLUSTER”分配给 target.resource.resource_type
resource.labels.container_name metadata.product_event_type 如果 resource.type 为“k8s_container”,则 resource.labels.container_name 的值以及 resource.labels.namespace_name 将用于构建 metadata.product_event_type
resource.labels.container_name target.resource.name 将原始日志中的 resource.labels.container_name 值分配给 target.resource.name 字段。
resource.labels.location target.location.country_or_region 将原始日志中的 resource.labels.location 值分配给 target.location.country_or_region 字段。
resource.labels.namespace_name additional.fields.key 将值“命名空间名称”分配为 additional.fields 对象中的键。
resource.labels.namespace_name additional.fields.value.string_value 原始日志中的 resource.labels.namespace_name 值会被分配为 additional.fields 对象中的字符串值。
resource.labels.namespace_name metadata.product_event_type 如果 resource.type 为“k8s_container”,则 resource.labels.namespace_name 的值以及 resource.labels.container_name 将用于构建 metadata.product_event_type
resource.labels.node_name metadata.product_event_type 如果 resource.type 为“k8s_node”,则系统会使用 resource.labels.node_name 的值来构建 metadata.product_event_type
resource.labels.pod_name additional.fields.key 将值“Pod 名称”分配为 additional.fields 对象中的键。
resource.labels.pod_name additional.fields.value.string_value 原始日志中的 resource.labels.pod_name 值会被分配为 additional.fields 对象中的字符串值。
resource.labels.project_id additional.fields.key 将值“Project Id”分配为 additional.fields 对象中的键。
resource.labels.project_id additional.fields.value.string_value 原始日志中的 resource.labels.project_id 值会被分配为 additional.fields 对象中的字符串值。
resource.type target.resource.resource_subtype 将原始日志中的 resource.type 值分配给 target.resource.resource_subtype 字段。
Roles target.user.user_role 原始日志中的 Roles 字段会转换为大写形式,并映射到 target.user.user_role 字段。
SessionID network.session_id 原始日志中的 SessionID 会映射到 network.session_id 字段。
sev security_result.severity sev 字段的值决定了 security_result.severity 的值。“INFO”或“NOTICE”映射到“INFORMATIONAL”“WARN”映射到“MEDIUM”,而“ERR”映射到“ERROR”。
TargetUsername target.user.user_display_name 原始日志中的 TargetUsername 会映射到 target.user.user_display_name 字段。
textPayload metadata.description 如果 resource.type 为“k8s_node”,则 textPayload 的值会映射到 metadata.description 字段。
textPayload network.application_protocol 系统会使用 Grok 模式从 textPayload 字段中提取协议(例如 HTTP)。
textPayload network.http.method 系统会使用 Grok 模式从 textPayload 字段中提取 HTTP 方法(例如 GET、POST)。
textPayload network.http.referral_url 系统会使用 Grok 模式从 textPayload 字段中提取网址。
textPayload network.http.response_code HTTP 响应代码会使用 Grok 模式从 textPayload 字段中提取,并转换为整数。
textPayload network.received_bytes 系统会使用 Grok 模式从 textPayload 字段中提取收到的字节,并将其转换为无符号整数。
textPayload principal.ip 系统会使用 Grok 模式从 textPayload 字段中提取来源 IP 地址。
textPayload security_result.description 系统会使用 Grok 模式从 textPayload 字段中提取说明。
textPayload target.file.full_path 系统会使用 Grok 模式从 textPayload 字段中提取路径。
UserAgent network.http.user_agent 原始日志中的 UserAgent 会映射到 network.http.user_agent 字段。将值“USER_RESOURCE_ACCESS”分配给 metadata.event_type

变化

2024-05-07

  • bug 修复:
  • 更改了解析器逻辑,以解析未解析和已丢弃的日志。

2023-05-25

  • 新创建的解析器。