Recoger registros de bases de datos de Imperva
En este documento se explica cómo ingerir registros de bases de datos de Imperva en Google Security Operations mediante Bindplane. El analizador primero intenta extraer campos de varios formatos de registro estructurados, como CEF, LEEF y JSON. Si no se encuentran esos formatos, se usan patrones grok para extraer campos de mensajes syslog no estructurados y, en última instancia, se asignan los datos extraídos a un modelo de datos unificado (UDM). Imperva Database Security ofrece funciones completas de monitorización, auditoría y protección de la actividad de las bases de datos.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Una instancia de Google SecOps
- Windows 2016 o versiones posteriores, o un host Linux con
systemd
- Si se ejecuta a través de un proxy, asegúrese de que los puertos del cortafuegos estén abiertos según los requisitos del agente de Bindplane.
- Acceso privilegiado a la consola de gestión de Imperva SecureSphere
Obtener el archivo de autenticación de ingestión de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recogida.
- Descarga el archivo de autenticación de ingestión. Guarda el archivo de forma segura en el sistema en el que se instalará Bindplane.
Obtener el ID de cliente de Google SecOps
- Inicia sesión en la consola de Google SecOps.
- Ve a Configuración de SIEM > Perfil.
- Copia y guarda el ID de cliente de la sección Detalles de la organización.
Instalar el agente de Bindplane
Instalación de ventanas
- Abre el símbolo del sistema o PowerShell como administrador.
Ejecuta el siguiente comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalación de Linux
- Abre un terminal con privilegios de superusuario o sudo.
Ejecuta el siguiente comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Recursos de instalación adicionales
- Para ver otras opciones de instalación, consulta esta guía de instalación.
Configurar el agente de BindPlane para ingerir Syslog y enviarlo a Google SecOps
Accede al archivo de configuración:
- Busca el archivo
config.yaml
. Normalmente, se encuentra en el directorio/etc/bindplane-agent/
en Linux o en el directorio de instalación en Windows. - Abre el archivo con un editor de texto (por ejemplo,
nano
,vi
o Bloc de notas).
- Busca el archivo
Edita el archivo
config.yaml
de la siguiente manera:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'IMPERVA_DB' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- Sustituye el puerto y la dirección IP según sea necesario en tu infraestructura.
- Sustituye
<customer_id>
por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.json
a la ruta en la que se guardó el archivo de autenticación en la sección Obtener el archivo de autenticación de ingestión de Google SecOps.
Reinicia el agente de Bindplane para aplicar los cambios
Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:
sudo systemctl restart bindplane-agent
Para reiniciar el agente de Bindplane en Windows, puedes usar la consola Servicios o introducir el siguiente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurar el reenvío de Syslog en la base de datos de Imperva
- Inicia sesión en la consola de gestión de Imperva SecureSphere.
- Vaya a Configuración > Conjuntos de acciones.
- Haz clic en Añadir para crear un conjunto de acciones o editar uno que ya tengas.
- Haz clic en Añadir acción y proporciona los siguientes detalles de configuración:
- Nombre: introduce un nombre descriptivo (por ejemplo,
Google SecOps Syslog
). - Tipo de acción: seleccione Syslog de GW.
- Host: introduce la dirección IP del agente de BindPlane.
- Puerto: introduce el número de puerto del agente de BindPlane (el valor predeterminado es
514
). - Protocolo: selecciona UDP o TCP, en función de la configuración de tu agente BindPlane.
- Nivel de registro de Syslog: selecciona DEBUG para obtener un registro completo.
- Instalación de Syslog: selecciona LOCAL0 o la instalación adecuada.
- Interfaz de acción: selecciona Registro de la pasarela > Evento de seguridad > Registro del sistema (syslog) > Formato JSON (ampliado) para el formato SYSLOG+JSON o Registro de la pasarela > Evento de seguridad > Registro del sistema (syslog) para el formato SYSLOG estándar.
- Nombre: introduce un nombre descriptivo (por ejemplo,
- Guarda la configuración de la acción.
- Ve a Políticas > Políticas de seguridad o Políticas > Políticas de auditoría de bases de datos.
- Edita las políticas pertinentes y añade el conjunto de acciones que contenga tu acción de syslog para asegurarte de que los eventos se reenvían a Google SecOps.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
acct | principal.user.userid | Si acct es "admin", asigna el valor target.user.userid ; de lo contrario, asigna el valor principal.user.userid . Quita las comillas y los espacios de acct antes de asignar. |
acción | security_result.action_details | Valor del campo action del registro sin procesar |
alertSev | security_result.severity | Si alertSev es "Informative", asigna el valor "INFORMATIONAL". De lo contrario, asigna el valor de alertSev en mayúsculas. |
página | principal.application | Si application es "pam_unix(sudo:session)" o description contiene "pam_unix", asigna el valor "pam_unix". Si message contiene "run-parts", asigna el valor "run-parts". Si message contiene "audispd", asigna el valor "audispd". Si message contiene "FSS audit", asigna el valor "FSS audit". De lo contrario, se asigna como campo application del registro sin procesar. |
nombre-aplicación | target.application | Valor del campo application-name del registro sin procesar |
audit-policy | security_result.category_details | Valor del campo audit-policy del registro sin procesar |
bind-variables | additional.fields.bind_variables_label.value.string_value | Valor del campo bind-variables del registro sin procesar |
category | security_result.category_details | Valor del campo category del registro sin procesar |
COMANDO | target.process.command_line | Si exe no está vacío, asigna el campo exe del registro sin procesar. De lo contrario, se asigna como campo COMMAND del registro sin procesar. |
createTime | Sin asignar | |
db-schema-pair | additional.fields.DB Name_{index} .value.string_value, additional.fields.Schema Name_{index} .value.string_value |
Por cada objeto db-schema-pair del registro sin procesar, extrae los campos db-name y schema-name y asígnalos a DB Name_{index} y Schema Name_{index} , respectivamente, en UDM, donde index es el índice del objeto en la matriz. |
db-user | principal.user.userid | Si db-user no está vacío, asigna el campo db-user del registro sin procesar. Si os-user no está vacío y db-user está vacío, asigna el campo os-user del registro sin procesar. |
dbName | target.resource.name | Valor del campo dbName del registro sin procesar |
dest-ip | target.ip, target.asset.ip | Valor del campo dest-ip del registro sin procesar |
dest-port | target.port | Valor del campo dest-port del registro sin procesar |
description | metadata.description | Si description contiene "user:", extrae el ID de usuario de description y asígnalo a userid . Si userid no está vacío y description contiene "Invalid" o "invalid", sustituye "Invalid user" por "Invalid". Si application es "sshd", quita "from" y "by" de description . De lo contrario, se asigna como campo description del registro sin procesar. |
dst | target.ip, target.asset.ip | Valor del campo dst del registro sin procesar |
dstIP | target.ip, target.asset.ip | Valor del campo dstIP del registro sin procesar |
dstPort | target.port | Valor del campo dstPort del registro sin procesar |
event-type | metadata.product_event_type | Valor del campo event-type del registro sin procesar |
eventType | metadata.product_event_type, metadata.event_type | Si eventType no está vacío y srcIP y dstIP tampoco, asigna eventType a metadata.product_event_type y "NETWORK_CONNECTION" a metadata.event_type . |
evntDesc | security_result.description | Valor del campo evntDesc del registro sin procesar |
exe | target.process.command_line | Valor del campo exe del registro sin procesar |
de | network.email.from | Quita "<" y ">" de from y asigna network.email.from |
grupo | target.user.group_identifiers | Valor del campo group del registro sin procesar |
gw-ip | intermediary.ip, intermediary.asset.ip | Valor del campo gw-ip del registro sin procesar |
host | target.hostname, target.asset.hostname | Valor del campo host del registro sin procesar |
nombre-de-host | principal.hostname, principal.asset.hostname | Valor del campo host-name del registro sin procesar |
nombre de host | principal.hostname, principal.asset.hostname | Valor del campo hostname del registro sin procesar |
ip | target.ip, target.asset.ip | Valor del campo ip del registro sin procesar |
mx-ip | intermediary.ip, intermediary.asset.ip | Valor del campo mx-ip del registro sin procesar |
objects-list | additional.fields.Object_{index} .value.string_value |
Por cada objeto objects-list del registro sin procesar, extrae el objeto y asígnalo a Object_{index} en el modelo de datos unificado, donde index es el índice del objeto en la matriz. |
Operación | about.labels.Operation.value | Valor del campo Operation del registro sin procesar |
Operation type |
about.labels.Operation Type .value |
Valor del campo Operation type del registro sin procesar |
os-user | principal.user.userid, additional.fields.OS User .value.string_value |
Si os-user no está vacío y db-user está vacío, asigna el campo os-user del registro sin procesar. De lo contrario, se asigna como campo OS User del registro sin procesar. |
Consulta analizada | target.process.command_line | Valor del campo Parsed Query del registro sin procesar |
parsed-query | additional.fields.Parsed Query .value.string_value |
Valor del campo parsed-query del registro sin procesar |
pid | target.process.pid | Valor del campo pid del registro sin procesar |
policy-id | security_result.detection_fields.Policy_ID_{index} .value |
Por cada objeto policy-id del registro sin procesar, extrae la política y asígnala a Policy_ID_{index} en el UDM, donde index es el índice del objeto en la matriz. |
policyName | security_result.detection_fields.policyName_label.value | Valor del campo policyName del registro sin procesar |
puerto | target.port | Valor del campo port del registro sin procesar |
Privilegiado | about.labels.Privileged.value | Si Privileged es verdadero, asigna el valor "True". De lo contrario, asigna el valor "False". |
proto | network.ip_protocol | Valor del campo proto del registro sin procesar |
protocolo | network.ip_protocol | Si protocol es "TCP" o "UDP", asigna el campo protocol del registro sin procesar. |
PWD | target.file.full_path | Valor del campo PWD del registro sin procesar |
Raw Data |
target.resource.attribute.labels.raw_Data.value | Valor del campo Raw Data del registro sin procesar |
consulta sin procesar | additional.fields.Raw Query .value.string_value |
Valor del campo raw-query del registro sin procesar |
ruleName | security_result.rule_name | Valor del campo ruleName del registro sin procesar |
server-group | additional.fields.serve_group_label.value.string_value | Valor del campo server-group del registro sin procesar |
service-name | additional.fields.service_name_label.value.string_value | Valor del campo service-name del registro sin procesar |
Service Type |
additional.fields.Service Type .value.string_value |
Valor del campo Service Type del registro sin procesar |
size | network.received_bytes | Valor del campo size del registro sin procesar |
Stored Proc |
about.labels.Stored_Proc.value | Si Stored Proc es verdadero, asigna el valor "True". De lo contrario, asigna el valor "False". |
Table Group |
target.group.group_display_name | Valor del campo Table Group del registro sin procesar |
timestamp | metadata.event_timestamp | Valor del campo timestamp del registro sin procesar |
a | network.email.to | Quita "<" y ">" de to y asigna network.email.to |
USUARIO | principal.user.userid, target.user.userid | Si USER no está vacío y USER es "admin", asigne el campo USER del registro sin procesar a target.user.userid . Si USER no está vacío, asigna el campo USER del registro sin procesar a principal.user.userid . |
autenticado por el usuario | security_result.detection_fields.user_authenticated.value | Valor del campo user-authenticated del registro sin procesar |
user-group | additional.fields.user_group_label.value.string_value | Valor del campo user-group del registro sin procesar |
nombre de usuario | principal.user.user_display_name | Valor del campo username del registro sin procesar |
usrName | principal.user.userid | Valor del campo usrName del registro sin procesar |
extensions.auth.mechanism | Se codifica como "USERNAME_PASSWORD" si description contiene "authentication failure", "check pass; user unknown", "Invalid user" o "invalid user", o si error no está vacío. |
|
extensions.auth.type | Se asigna el valor "AUTHTYPE_UNSPECIFIED" si has_principal es "true", has_target es "true" y event-type es "Login". |
|
metadata.event_type | Se codifica como "PROCESS_OPEN" si PWD no está vacío. Se asigna el valor "PROCESS_OPEN" si message contiene "starting" o application es "pman", "CROND" o "run-parts" y event_type está vacío. Se ha codificado como "NETWORK_CONNECTION" si description es "Syslog connection established" (Conexión Syslog establecida), "Syslog connection broken" (Conexión Syslog interrumpida) o "Syslog connection failed" (Conexión Syslog fallida). Se codifica como "EMAIL_UNCATEGORIZED" si application es "postfix/qmgr", "postfix/local" o "postfix/pickup". Se codifica como "EMAIL_TRANSACTION" si application es "postfix/local" o "postfix/pickup" y status es "sent (delivered to mailbox)". Se codifica como "NETWORK_HTTP" si application es "sshd" y description no contiene "check pass; user unknown", "authentication failure" ni "invalid".description description Se asigna el valor "USER_LOGIN" si description contiene "authentication failure", "check pass; user unknown", "Invalid user" o "invalid user", o si error no está vacío. Se codifica como "FILE_SYNC" si file_path no está vacío. Se codifica como "PROCESS_UNCATEGORIZED" si message contiene "reconfigure" y application es "pman". Se codifica como "PROCESS_TERMINATION" si message contiene "exit code 1" y application es "pman". Se asigna el valor "NETWORK_CONNECTION" si eventType no está vacío y srcIP y dstIP tampoco. Se asigna el valor "USER_LOGIN" si has_principal es "true", has_target es "true" y event-type es "Login". Se codifica como "NETWORK_CONNECTION" si has_principal es "true", has_target es "true" y protocol no está vacío. Se codifica como "STATUS_UPDATE" si has_principal es "true". Se codifica como "GENERIC_EVENT" si event_type está vacío o es "GENERIC_EVENT". |
|
metadata.log_type | Codificado como "IMPERVA_DB" | |
metadata.product_name | Codificado como "IMPERVA DB" | |
metadata.vendor_name | Codificado como "IMPERVA DB" | |
security_result.action | Se asigna el valor "ALLOW" si description no contiene "authentication failure", "check pass; user unknown", "Invalid user" o "invalid user" y error está vacío. Se asigna el valor "BLOCK" si description contiene "authentication failure" (fallo de autenticación), "check pass; user unknown" (comprobación de contraseña; usuario desconocido), "Invalid user" (usuario no válido) o "invalid user" (usuario no válido), o si error no está vacío. |
|
security_result.rule_id | Si description contiene "alert_score" o "new_alert_score", extrae el ruleid de description y asígnalo a security_result.rule_id . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.