Recoger registros de bases de datos de Imperva

Disponible en:

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

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recogida.
  3. 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

  1. Inicia sesión en la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Perfil.
  3. 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

  1. Abre el símbolo del sistema o PowerShell como administrador.
  2. Ejecuta el siguiente comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Instalación de Linux

  1. Abre un terminal con privilegios de superusuario o sudo.
  2. 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

Configurar el agente de BindPlane para ingerir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:

    1. 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.
    2. Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  2. 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
    

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

  1. Inicia sesión en la consola de gestión de Imperva SecureSphere.
  2. Vaya a Configuración > Conjuntos de acciones.
  3. Haz clic en Añadir para crear un conjunto de acciones o editar uno que ya tengas.
  4. 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.
  5. Guarda la configuración de la acción.
  6. Ve a Políticas > Políticas de seguridad o Políticas > Políticas de auditoría de bases de datos.
  7. 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".descriptiondescription 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.