Recopila registros del CMS de WordPress

Compatible con:

Descripción general

Este analizador extrae registros del CMS de WordPress de mensajes con formato JSON o texto sin formato. Controla los registros con formato JSON y no JSON, analiza los campos relevantes y los asigna a la UDM, incluidos los detalles del usuario, la información de la red, los atributos de los recursos y los detalles de los resultados de seguridad. El analizador también realiza varias transformaciones de datos, como convertir tipos de datos, combinar campos y controlar patrones de registro específicos para Kubernetes y otros recursos.

Antes de comenzar

  • Asegúrate de tener una instancia de Google SecOps.
  • Asegúrate de tener acceso con privilegios a un sitio web de WordPress.
  • Un complemento que habilita la funcionalidad de webhook (por ejemplo, WP Webhooks).

Configura un feed en Google SecOps para transferir registros de WordPress

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de WordPress).
  4. Selecciona Webhook como el Tipo de origen.
  5. Selecciona WordPress como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Opcional: Especifica valores para los siguientes parámetros de entrada:
    • Delimitador de división: Es el delimitador que se usa para separar las líneas de registro, como \n.
    • Espacio de nombres de recursos: Es el espacio de nombres de recursos.
    • Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
  10. Haz clic en Generate Secret Key para generar una clave secreta que autentique este feed.
  11. Copia y almacena la clave secreta. No podrás volver a ver esta clave secreta. Si es necesario, puedes volver a generar una clave secreta nueva, pero esta acción hace que la clave secreta anterior quede obsoleta.
  12. En la pestaña Detalles, copia la URL del extremo del feed del campo Información del extremo. Debes especificar esta URL de extremo en tu aplicación cliente.
  13. Haz clic en Listo.

Crea una clave de API para el feed de webhook

  1. Ve a consola de Google Cloud > Credenciales.

    Ir a Credenciales

  2. Haz clic en Crear credenciales y selecciona Clave de API.

  3. Restringe el acceso de la clave de API a la API de Google Security Operations.

Especifica la URL del extremo

  1. En tu aplicación cliente, especifica la URL del extremo HTTPS que se proporciona en el feed de webhook.
  2. Habilita la autenticación especificando la clave de API y la clave secreta como parte del encabezado personalizado en el siguiente formato:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Recomendación: Especifica la clave de API como un encabezado en lugar de hacerlo en la URL. Si tu cliente de webhook no admite encabezados personalizados, puedes especificar la clave de API y la clave secreta con parámetros de consulta en el siguiente formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

Reemplaza lo siguiente:

  • ENDPOINT_URL: Es la URL del extremo del feed.
  • API_KEY: Es la clave de API para autenticarse en Google Security Operations.
  • SECRET: Es la clave secreta que generaste para autenticar el feed.

Configura el webhook de WordPress

  1. Instala y activa el complemento WP Webhooks (o el complemento de webhook que elijas) a través del directorio de complementos de WordPress.
  2. Ve al submenú WP Webhooks en el menú de administrador de WordPress, que suele estar en Configuración.
  3. Haz clic en Enviar datos en el menú de la barra superior.
  4. Selecciona la acción de WordPress que activará el webhook. Algunos ejemplos comunes son publish_post (cuando se publica una publicación nueva), user_register (cuando se registra un usuario nuevo) o comment_post (cuando se publica un comentario nuevo). Esto depende de los datos que selecciones y envíes a Google SecOps.
  5. Haz clic en Agregar URL de webhook.
  6. Configura el webhook:
    • Nombre: Asigna un nombre descriptivo a tu webhook (por ejemplo, Feed de SecOps de Google).
    • URL de webhook: Pega la URL del extremo de SecOps de Google.
  7. Haz clic en Guardar webhook.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
ClientIP principal.ip La dirección IP del cliente se extrae del campo ClientIP en el registro sin procesar.
Code target.resource.attribute.labels.key El valor “Code” se asigna como clave en el objeto target.resource.attribute.labels.
Code target.resource.attribute.labels.value El valor del campo Code del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
CurrentUserID target.user.userid El CurrentUserID del registro sin procesar se convierte en una cadena y se asigna al campo target.user.userid.
EditUserLink target.url El EditUserLink del registro sin procesar se asigna al campo target.url.
EventType metadata.product_event_type El EventType del registro sin procesar se asigna al campo metadata.product_event_type.
FirstName target.user.first_name El FirstName del registro sin procesar se asigna al campo target.user.first_name.
insertId metadata.product_log_id El insertId del registro sin procesar se asigna al campo metadata.product_log_id.
labels.compute.googleapis.com/resource_name additional.fields.key El valor "Nombre del recurso" se asigna como clave en el objeto additional.fields.
labels.compute.googleapis.com/resource_name additional.fields.value.string_value El valor de labels.compute.googleapis.com/resource_name del registro sin procesar se asigna como un valor de cadena en el objeto additional.fields.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.key El valor "Instancia de E/S de Kubernetes" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/instance target.resource.attribute.labels.value El valor de labels.k8s-pod/app_kubernetes_io/instance del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.key El valor "Kubernetes IO Instance Manager" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/managed-by target.resource.attribute.labels.value El valor de labels.k8s-pod/app_kubernetes_io/managed-by del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.key El valor "Nombre de la instancia de IO de Kubernetes" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/app_kubernetes_io/name target.resource.attribute.labels.value El valor de labels.k8s-pod/app_kubernetes_io/name del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.key El valor “Controller Revision Hash” se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/controller-revision-hash target.resource.attribute.labels.value El valor de labels.k8s-pod/controller-revision-hash del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.key El valor "Kubernetes IO Instance Manager SH" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/helm_sh/chart target.resource.attribute.labels.value El valor de labels.k8s-pod/helm_sh/chart del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.key El valor "Application" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/k8s-app target.resource.attribute.labels.value El valor de labels.k8s-pod/k8s-app del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.key El valor "Pod Template Generation" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/pod-template-generation target.resource.attribute.labels.value El valor de labels.k8s-pod/pod-template-generation del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.key El valor "Pod Template Hash" se asigna como clave en el objeto target.resource.attribute.labels.
labels.k8s-pod/pod-template-hash target.resource.attribute.labels.value El valor de labels.k8s-pod/pod-template-hash del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
LastName target.user.last_name El LastName del registro sin procesar se asigna al campo target.user.last_name.
logName target.resource.attribute.labels.key El valor "Nombre del registro" se asigna como clave en el objeto target.resource.attribute.labels.
logName target.resource.attribute.labels.value El valor del campo logName del registro sin procesar se asigna como un valor en el objeto target.resource.attribute.labels.
receiveTimestamp metadata.event_timestamp El receiveTimestamp del registro sin procesar se analiza y se asigna al campo metadata.event_timestamp.
resource.labels.cluster_name additional.fields.key El valor "Nombre del clúster" se asigna como clave en el objeto additional.fields.
resource.labels.cluster_name additional.fields.value.string_value El valor de resource.labels.cluster_name del registro sin procesar se asigna como un valor de cadena en el objeto additional.fields.
resource.labels.cluster_name target.resource.resource_type Si resource.labels.cluster_name está presente, el valor "CLUSTER" se asigna a target.resource.resource_type.
resource.labels.container_name metadata.product_event_type Si resource.type es "k8s_container", el valor de resource.labels.container_name junto con resource.labels.namespace_name se usa para construir metadata.product_event_type.
resource.labels.container_name target.resource.name El valor de resource.labels.container_name del registro sin procesar se asigna al campo target.resource.name.
resource.labels.location target.location.country_or_region El valor de resource.labels.location del registro sin procesar se asigna al campo target.location.country_or_region.
resource.labels.namespace_name additional.fields.key El valor "Nombre del espacio de nombres" se asigna como clave en el objeto additional.fields.
resource.labels.namespace_name additional.fields.value.string_value El valor de resource.labels.namespace_name del registro sin procesar se asigna como un valor de cadena en el objeto additional.fields.
resource.labels.namespace_name metadata.product_event_type Si resource.type es "k8s_container", el valor de resource.labels.namespace_name junto con resource.labels.container_name se usa para construir el metadata.product_event_type.
resource.labels.node_name metadata.product_event_type Si resource.type es "k8s_node", el valor de resource.labels.node_name se usa para construir metadata.product_event_type.
resource.labels.pod_name additional.fields.key El valor "Nombre del pod" se asigna como clave en el objeto additional.fields.
resource.labels.pod_name additional.fields.value.string_value El valor de resource.labels.pod_name del registro sin procesar se asigna como un valor de cadena en el objeto additional.fields.
resource.labels.project_id additional.fields.key El valor "Project Id" se asigna como clave en el objeto additional.fields.
resource.labels.project_id additional.fields.value.string_value El valor de resource.labels.project_id del registro sin procesar se asigna como un valor de cadena en el objeto additional.fields.
resource.type target.resource.resource_subtype El valor de resource.type del registro sin procesar se asigna al campo target.resource.resource_subtype.
Roles target.user.user_role El campo Roles del registro sin procesar se convierte a mayúsculas y se asigna al campo target.user.user_role.
SessionID network.session_id El SessionID del registro sin procesar se asigna al campo network.session_id.
sev security_result.severity El valor del campo sev determina el valor de security_result.severity. “INFO” o “NOTICE” se asignan a “INFORMATIONAL”, “WARN” se asigna a “MEDIUM” y “ERR” se asigna a “ERROR”.
TargetUsername target.user.user_display_name El TargetUsername del registro sin procesar se asigna al campo target.user.user_display_name.
textPayload metadata.description Si resource.type es "k8s_node", el valor de textPayload se asigna al campo metadata.description.
textPayload network.application_protocol El protocolo (por ejemplo, HTTP) se extrae del campo textPayload con patrones de grok.
textPayload network.http.method El método HTTP (por ejemplo, GET, POST) se extrae del campo textPayload con patrones de Grok.
textPayload network.http.referral_url La URL se extrae del campo textPayload con patrones de grok.
textPayload network.http.response_code El código de respuesta HTTP se extrae del campo textPayload con patrones de grok y se convierte en un número entero.
textPayload network.received_bytes Los bytes recibidos se extraen del campo textPayload con patrones de grok y se convierten en un número entero sin signo.
textPayload principal.ip La dirección IP de origen se extrae del campo textPayload con patrones de grok.
textPayload security_result.description La descripción se extrae del campo textPayload con patrones de grok.
textPayload target.file.full_path La ruta de acceso se extrae del campo textPayload con patrones grok.
UserAgent network.http.user_agent El UserAgent del registro sin procesar se asigna al campo network.http.user_agent. El valor "USER_RESOURCE_ACCESS" se asigna a metadata.event_type.

Cambios

2024-05-07

  • Corrección de errores:
  • Se cambió la lógica del analizador para analizar registros sin analizar y descartados.

2023-05-25

  • Sin embargo, el analizador se creó recientemente.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.