Recopila registros del CMS de WordPress
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
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de WordPress).
- Selecciona Webhook como el Tipo de origen.
- Selecciona WordPress como el Tipo de registro.
- Haz clic en Siguiente.
- 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.
- Delimitador de división: Es el delimitador que se usa para separar las líneas de registro, como
- Haz clic en Siguiente.
- Revisa la configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
- Haz clic en Generate Secret Key para generar una clave secreta que autentique este feed.
- 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.
- 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.
- Haz clic en Listo.
Crea una clave de API para el feed de webhook
Ve a consola de Google Cloud > Credenciales.
Haz clic en Crear credenciales y selecciona Clave de API.
Restringe el acceso de la clave de API a la API de Google Security Operations.
Especifica la URL del extremo
- En tu aplicación cliente, especifica la URL del extremo HTTPS que se proporciona en el feed de webhook.
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
- Instala y activa el complemento WP Webhooks (o el complemento de webhook que elijas) a través del directorio de complementos de WordPress.
- Ve al submenú WP Webhooks en el menú de administrador de WordPress, que suele estar en Configuración.
- Haz clic en Enviar datos en el menú de la barra superior.
- 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.
- Haz clic en Agregar URL de webhook.
- 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.
- 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.