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 cumplir con los siguientes requisitos previos:
- Instancia de Google SecOps
- Acceso con privilegios a un sitio web de WordPress
- Es un complemento que habilita la funcionalidad de webhook (por ejemplo, WP Webhooks).
Cómo configurar feeds
Existen dos puntos de entrada diferentes para configurar feeds en la plataforma de Google SecOps:
- Configuración de SIEM > Feeds
- Centro de contenido > Paquetes de contenido
Configura los feeds desde Configuración de SIEM > Feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la página siguiente, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed, por ejemplo, Registros del CMS 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
.
- 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.
Cómo configurar feeds desde el Content Hub
Especifica valores para los siguientes campos:
- Delimitador de división: Es el delimitador que se usa para separar las líneas de registro, como
\n
.
Opciones avanzadas
- Nombre del feed: Es un valor prepropagado que identifica el feed.
- Tipo de fuente: Es el método que se usa para recopilar registros en Google SecOps.
- Espacio de nombres del activo: Es el espacio de nombres asociado con el feed.
Etiquetas de transferencia: Son las etiquetas que se aplican a todos los eventos de este feed.
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.
Crea una clave de API para el feed de webhook
Ve a Google Cloud console > Credentials.
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 el 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
- Es un analizador creado recientemente.
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.