Recoger registros de CMS de WordPress
Información general
Este analizador extrae registros del CMS de WordPress de mensajes con formato JSON o de texto sin formato. Gestiona los registros con formato JSON y sin formato JSON, analiza los campos relevantes y los asigna al 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 gestionar patrones de registro específicos de Kubernetes y otros recursos.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps.
- Acceso privilegiado a un sitio web de WordPress.
- Complemento que habilita la función de webhook (por ejemplo, WP Webhooks).
Configurar feeds
Para configurar un feed, sigue estos pasos:
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Añadir feed.
- En la página siguiente, haga clic en Configurar un solo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, Registros de CMS de WordPress).
- Selecciona Webhook como Tipo de fuente.
- Selecciona Wordpress como Tipo de registro.
- Haz clic en Siguiente.
- Opcional: especifica los valores de los siguientes parámetros de entrada:
- Delimitador de división: el delimitador que se usa para separar las líneas de registro, como
\n
.
- Delimitador de división: el delimitador que se usa para separar las líneas de registro, como
- Haz clic en Siguiente.
- Revise la configuración del feed en la pantalla Finalizar y, a continuación, haga clic en Enviar.
- Haz clic en Generar clave secreta para generar una clave secreta que autentique este feed.
- Copia y guarda la clave secreta. No podrás volver a ver esta clave secreta. Si es necesario, puedes volver a generar una clave secreta, pero esta acción hará que la clave secreta anterior quede obsoleta.
- En la pestaña Detalles, copie la URL del endpoint del feed del campo Información del endpoint. Debes especificar esta URL de endpoint en tu aplicación cliente.
- Haz clic en Listo.
Crear una clave de API para la feed de webhook
Ve a la consolaGoogle Cloud > Credenciales.
Haz clic en Crear credenciales y, a continuación, selecciona Clave de API.
Restringe el acceso de la clave de API a la API Google Security Operations.
Especificar la URL del endpoint
- En tu aplicación cliente, especifica la URL del endpoint HTTPS proporcionada en el feed de webhook.
Para habilitar la autenticación, especifica la clave de API y la clave secreta como parte del encabezado personalizado con el siguiente formato:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Recomendación: Especifica la clave de API como 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 mediante parámetros de consulta con el siguiente formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Haz los cambios siguientes:
ENDPOINT_URL
: URL del endpoint del feed.API_KEY
: la clave de API para autenticarte en Google Security Operations.SECRET
: la clave secreta que has generado para autenticar el feed.
Configurar un 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 del menú de administrador de WordPress, que suele estar en Configuración.
- En el menú de la barra superior, haz clic en Enviar datos.
- Selecciona la acción de WordPress que activará el webhook. Algunos ejemplos habituales son publish_post (cuando se publica una nueva publicación), user_register (cuando se registra un nuevo usuario) o comment_post (cuando se publica un nuevo comentario). Esto depende de los datos que selecciones y envíes a Google SecOps.
- Haz clic en Añadir URL de webhook.
- Configura el webhook:
- Nombre: asigna un nombre descriptivo al webhook (por ejemplo, Feed de Google SecOps).
- URL del webhook: pega la URL del endpoint de Google SecOps.
- 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 del 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 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 "Resource Name" 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 "Kubernetes IO Instance" 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 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 valor en el objeto target.resource.attribute.labels . |
labels.k8s-pod/app_kubernetes_io/name |
target.resource.attribute.labels.key |
El valor "Kubernetes IO Instance Name" 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 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 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 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 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 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 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 "Log Name" 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 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 "Cluster Name" 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, se asigna el valor "CLUSTER" 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 crear 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 "Namespace Name" 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 crear 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 crear el 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 mediante patrones grok. |
textPayload |
network.http.method |
El método HTTP (por ejemplo, GET o POST) se extrae del campo textPayload mediante patrones grok. |
textPayload |
network.http.referral_url |
La URL se extrae del campo textPayload mediante patrones grok. |
textPayload |
network.http.response_code |
El código de respuesta HTTP se extrae del campo textPayload mediante patrones grok y se convierte en un número entero. |
textPayload |
network.received_bytes |
Los bytes recibidos se extraen del campo textPayload mediante patrones grok y se convierten en un entero sin signo. |
textPayload |
principal.ip |
La dirección IP de origen se extrae del campo textPayload mediante patrones grok. |
textPayload |
security_result.description |
La descripción se extrae del campo textPayload mediante patrones grok. |
textPayload |
target.file.full_path |
La ruta se extrae del campo textPayload mediante 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 . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.