Recopila registros de la base de datos de Imperva
En este documento, se explica cómo transferir registros de la base de datos de Imperva a Google Security Operations con Bindplane. Primero, el analizador intenta extraer campos de varios formatos de registro estructurados, como CEF, LEEF y JSON. Si no se encuentran esos formatos, se usan patrones de 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 proporciona capacidades integrales de supervisión, auditoría y protección de la actividad de la base de datos.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Windows 2016 o versiones posteriores, o un host de Linux con
systemd
- Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.
- Acceso con privilegios a la consola de administración de Imperva SecureSphere
Obtén el archivo de autenticación de transferencia de Google SecOps
- Accede a la consola de Google SecOps.
- Ve a Configuración de SIEM > Agentes de recopilación.
- Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.
Obtén el ID de cliente de Google SecOps
- Accede a 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.
Instala el agente de BindPlane
Instalación en Windows
- 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 en Linux
- Abre una terminal con privilegios de raíz 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 obtener más opciones de instalación, consulta esta guía de instalación.
Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps
Accede al archivo de configuración:
- Ubica el archivo
config.yaml
. Por lo general, 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).
- Ubica 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
- Reemplaza el puerto y la dirección IP según sea necesario en tu infraestructura.
- Reemplaza
<customer_id>
por el ID de cliente real. - Actualiza
/path/to/ingestion-authentication-file.json
a la ruta de acceso en la que se guardó el archivo de autenticación en la sección Cómo obtener el archivo de autenticación de la transferencia de datos 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 de Servicios o ingresar el siguiente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configura el reenvío de Syslog en la base de datos de Imperva
- Accede a la consola de administración de Imperva SecureSphere.
- Ve a Configuration > Action Sets.
- Haz clic en Agregar para crear un nuevo conjunto de acciones o editar uno existente.
- Haz clic en Agregar acción y proporciona los siguientes detalles de configuración:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Google SecOps Syslog
). - Tipo de acción: Selecciona Syslog de GW.
- Host: Ingresa la dirección IP del agente de BindPlane.
- Puerto: Ingresa el número de puerto del agente de BindPlane (el valor predeterminado es
514
). - Protocolo: Selecciona UDP o TCP, según la configuración de tu agente de BindPlane.
- Nivel de registro de Syslog: Selecciona DEBUG para obtener un registro completo.
- Syslog Facility: Selecciona LOCAL0 o la instalación adecuada.
- Action Interface: Selecciona Gateway Log - Security Event - System Log (syslog) - JSON format (Extended) para el formato SYSLOG+JSON, o bien Gateway Log - Security Event - System Log (syslog) para el formato SYSLOG estándar.
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
- Guarda la configuración de la acción.
- Ve a Policies > Security Policies o Policies > Database Audit Policies.
- Edita las políticas pertinentes y agrega el conjunto de acciones que contiene tu acción de syslog para garantizar que los eventos se reenvíen a SecOps de Google.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
acct | principal.user.userid | Si acct es "admin", se asigna a target.user.userid ; de lo contrario, se asigna a principal.user.userid . Quita las comillas y los espacios de acct antes de la asignación. |
acción | security_result.action_details | Valor del campo action del registro sin procesar |
alertSev | security_result.severity | Si alertSev es "Informativa", asigna el valor "INFORMATIONAL"; de lo contrario, asigna el valor en mayúsculas de alertSev . |
aplicación | principal.application | Si application es "pam_unix(sudo:session)" o description contiene "pam_unix", se asigna como "pam_unix". Si message contiene "run-parts", se asigna como "run-parts". Si message contiene "audispd", se debe asignar como "audispd". Si message contiene "FSS audit", se debe asignar como "FSS audit". De lo contrario, asigna el campo application del registro sin procesar |
application-name | 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 |
COMMAND | target.process.command_line | Si exe no está vacío, se asigna como el campo exe del registro sin procesar. De lo contrario, asigna el 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 |
Para cada objeto db-schema-pair en el registro sin procesar, extrae los campos db-name y schema-name , y asígnalos a DB Name_{index} y Schema Name_{index} , respectivamente, en el UDM, donde index es el índice del objeto en el array. |
db-user | principal.user.userid | Si db-user no está vacío, se asigna como el campo db-user del registro sin procesar. De lo contrario, si os-user no está vacío y db-user está vacío, se asigna como 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 |
descripción | 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", reemplaza "Invalid user" por "Invalid". Si application es "sshd", quita "de" y "por" de description . De lo contrario, asigna el 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 no están vacíos, asigna eventType a metadata.product_event_type y asigna "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 asígnalo a 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 |
host-name | 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 |
Para cada objeto objects-list en el registro sin procesar, extrae el objeto y asígnalo a Object_{index} en el UDM, donde index es el índice del objeto en el array. |
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, se asigna como el campo os-user del registro sin procesar. De lo contrario, asigna el 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 |
Para cada objeto policy-id en el 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 el array. |
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 |
Con privilegios | about.labels.Privileged.value | Si Privileged es verdadero, se asigna como "True"; de lo contrario, se asigna como "False". |
protocolo | network.ip_protocol | Valor del campo proto del registro sin procesar |
protocolo | network.ip_protocol | Si protocol es "TCP" o "UDP", se asigna como 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 |
raw-query | 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 |
tamaño | network.received_bytes | Valor del campo size del registro sin procesar |
Stored Proc |
about.labels.Stored_Proc.value | Si Stored Proc es verdadero, se asigna como "True"; de lo contrario, se asigna como "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 asígnalo a network.email.to |
USUARIO | principal.user.userid, target.user.userid | Si USER no está vacío y USER es "admin", se asigna como campo USER del registro sin procesar a target.user.userid . De lo contrario, si USER no está vacío, se asigna como 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 codifica como "AUTHTYPE_UNSPECIFIED" si has_principal es "verdadero", has_target es "verdadero" y event-type es "Login". |
|
metadata.event_type | Se codifica como "PROCESS_OPEN" si PWD no está vacío. Se codifica como "PROCESS_OPEN" si message contiene "starting" o si application es "pman", "CROND" o "run-parts", y event_type está vacío. Se codifica como "NETWORK_CONNECTION" si description es "Syslog connection established", "Syslog connection broken" o "Syslog connection failed". 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 codifica como "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 de forma rígida 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 codifica como "NETWORK_CONNECTION" si eventType no está vacío y srcIP y dstIP no están vacíos. Se codifica como "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 de forma rígida como "GENERIC_EVENT" si event_type está vacío o es "GENERIC_EVENT". |
|
metadata.log_type | Se codificó como "IMPERVA_DB" | |
metadata.product_name | Se codifica como "IMPERVA DB". | |
metadata.vendor_name | Se codifica como "IMPERVA DB". | |
security_result.action | Se codifica como "ALLOW" si description no contiene "authentication failure", "check pass; user unknown", "Invalid user" o "invalid user", y error está vacío. Se codifica como "BLOCK" si description contiene "authentication failure", "check pass; user unknown", "Invalid user" o "invalid user", 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? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.