Recopila registros de la base de datos de Oracle

Compatible con:

En esta guía, se explica cómo puedes transferir registros de la BD de Oracle a Google Security Operations con el agente de Bindplane.

El analizador extrae campos de los mensajes de SYSLOG y controla varios formatos con patrones de grok y análisis de pares clave-valor. Luego, asigna estos campos extraídos al Modelo de datos unificado (UDM), lo que enriquece los datos con metadatos estáticos, como los nombres de proveedores y productos, y establece de forma dinámica los tipos de eventos según valores de campos específicos, como ACTION y USERID.

Antes de comenzar

  • Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps

  • Windows Server 2016 o versiones posteriores, o host de Linux con systemd

  • Conectividad de red entre el agente de Bindplane y el host de la base de datos de Oracle

  • 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 instancia de Oracle Database (rol de SYSDBA o AUDIT_ADMIN)

  • Oracle Database 19c o posterior con la auditoría unificada habilitada (o la auditoría de modo mixto en Oracle 12c a 18c)

Obtén el archivo de autenticación de transferencia de Google SecOps

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

  1. Accede a 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.

Instala el agente de BindPlane

Instala el agente de Bindplane en tu sistema operativo Windows o Linux según las siguientes instrucciones.

Instalación en Windows

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

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sc query observiq-otel-collector
    

El servicio debe mostrarse como RUNNING.

Instalación en Linux

  1. Abre una terminal con privilegios de administrador o sudo.
  2. Ejecuta el comando siguiente:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Espera a que se complete la instalación.

  4. Ejecute el siguiente comando para verificar la instalación:

    sudo systemctl status observiq-otel-collector
    

El servicio debería mostrarse como activo (en ejecución).

Recursos de instalación adicionales

Para obtener más opciones de instalación y solución de problemas, consulta la guía de instalación del agente de Bindplane.

Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps

Ubica el archivo de configuración

Linux:

```bash
sudo nano /etc/bindplane-agent/config.yaml
```

Windows:

```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```

Edita el archivo de configuración

Reemplaza todo el contenido de config.yaml por la siguiente configuración:

```yaml
receivers:
    udplog:
        listen_address: "0.0.0.0:514"

exporters:
    chronicle/oracle_db:
        compression: gzip
        creds_file_path: '/path/to/ingestion-authentication-file.json'
        customer_id: '<customer_id>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: ORACLE_DB
        raw_log_field: body
        ingestion_labels:
            log_type: 'ORACLE_DB'

service:
    pipelines:
        logs/oracle_to_chronicle:
            receivers:
                - udplog
            exporters:
                - chronicle/oracle_db
```

Parámetros de configuración

  • Reemplaza los marcadores de posición que se indican más abajo:

Configuración del receptor: * listen_address: La dirección IP y el puerto en los que se debe escuchar: - Reemplaza 0.0.0.0 por una dirección IP específica para escuchar en una interfaz o déjalo como 0.0.0.0 para escuchar en todas las interfaces (recomendado). - Reemplaza 514 por el número de puerto que coincida con la configuración de reenvío de syslog de Oracle.

Configuración del exportador: * creds_file_path: Ruta de acceso completa al archivo de autenticación de la transferencia: - Linux: /etc/bindplane-agent/ingestion-auth.json - Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json * customer_id: ID de cliente copiado en la sección Obtén el ID de cliente de Google SecOps * endpoint: URL del endpoint regional: - EE.UU.: malachiteingestion-pa.googleapis.com - Europa: europe-malachiteingestion-pa.googleapis.com - Asia: asia-southeast1-malachiteingestion-pa.googleapis.com - Consulta Endpoints regionales para obtener la lista completa

Guarda el archivo de configuración

  • Después de editarlo, guarda el archivo:
    • Linux: Presiona Ctrl+O, luego Enter y, después, Ctrl+X.
    • Windows: Haz clic en Archivo > Guardar

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:

    sudo systemctl restart observiq-otel-collector
    
    1. Verifica que el servicio esté en ejecución:
    sudo systemctl status observiq-otel-collector
    
    1. Revisa los registros en busca de errores:
    sudo journalctl -u observiq-otel-collector -f
    
  • Para reiniciar el agente de Bindplane en Windows, elige una de las siguientes opciones:

    • Símbolo del sistema o PowerShell como administrador:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • Consola de Services:
      1. Presiona Win+R, escribe services.msc y presiona Intro.
      2. Busca observIQ OpenTelemetry Collector.
      3. Haz clic con el botón derecho y selecciona Reiniciar.
    1. Verifica que el servicio esté en ejecución:
    sc query observiq-otel-collector
    
    1. Revisa los registros en busca de errores:
    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

Configura la auditoría unificada de la base de datos de Oracle y el reenvío de syslog

Habilita la auditoría unificada

Si la auditoría unificada aún no está habilitada, vuelve a vincular los archivos binarios de Oracle con la opción uniaud_on. Esto requiere cerrar todos los procesos de Oracle que se ejecutan desde Oracle Home (instancia de base de datos y listener).

  1. Conéctate al host de la base de datos de Oracle como el usuario del sistema operativo oracle.
  2. Cierra la instancia y el objeto de escucha de Oracle:

    sqlplus / as sysdba <<EOF
    shutdown immediate;
    exit
    EOF
    lsnrctl stop
    
  3. Vuelve a vincular los archivos binarios de Oracle con la auditoría unificada habilitada:

    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk uniaud_on ioracle
    
  4. Inicia el objeto de escucha y la instancia de Oracle:

    lsnrctl start
    sqlplus / as sysdba <<EOF
    startup;
    exit
    EOF
    
  5. Si Oracle Enterprise Manager Cloud Control se ejecuta en el mismo host, reinícialo:

    cd /u01/app/oracle/product/middleware/oms
    export OMS_HOME=/u01/app/oracle/product/middleware/oms
    $OMS_HOME/bin/emctl start oms
    
  6. Verifica que la auditoría unificada esté habilitada. Conéctate a la base de datos de Oracle con SQL*Plus:

    SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
    

Verifica que el comando devuelva una fila con VALUE igual a TRUE.

Configura el resultado de syslog de la auditoría unificada

Establece el parámetro de inicialización UNIFIED_AUDIT_SYSTEMLOG para escribir registros de auditoría unificados en syslog. Este parámetro se introdujo en Oracle 19c y reemplaza al parámetro AUDIT_SYSLOG_LEVEL obsoleto (que solo se aplica a la auditoría tradicional).

  1. Conéctate a la base de datos de Oracle con SQL*Plus como SYSDBA.
  2. Establece el parámetro UNIFIED_AUDIT_SYSTEMLOG:

    • En los sistemas UNIX/Linux, establece el parámetro en un valor facility.priority:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;
    
    • En los sistemas Windows, configura el parámetro en TRUE para escribir en el Visor de eventos de Windows:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  3. Opcional: Para escribir registros de políticas de auditoría unificadas comunes desde un contenedor raíz de CDB en syslog en sistemas UNIX/Linux, establece el parámetro UNIFIED_AUDIT_COMMON_SYSTEMLOG:

    ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  4. Reinicia la instancia de la base de datos de Oracle para que se apliquen los cambios de parámetros:

    SHUTDOWN IMMEDIATE;
    STARTUP;
    

Configura el daemon de syslog en el host de Oracle

En el host de la base de datos de Oracle, configura el daemon syslog para que reenvíe las entradas del registro de auditoría al agente de BindPlane.

  1. Accede al host de Oracle Database como root.
  2. Abre el archivo de configuración de syslog:

    • En RHEL/CentOS/Oracle Linux con rsyslog, haz lo siguiente:
    sudo vi /etc/rsyslog.conf
    
    • En sistemas más antiguos con syslog:
    sudo vi /etc/syslog.conf
    
  3. Agrega una regla de reenvío que coincida con la instalación y la prioridad que configuraste en UNIFIED_AUDIT_SYSTEMLOG. Por ejemplo, si configuras LOCAL7.INFO:

    • Para reenviar a través de UDP (coincide con el receptor de BindPlane udplog):
    local7.info @<BINDPLANE_HOST_IP>:514
    
    • Para reenviar a través de TCP (si Bindplane usa el receptor tcplog), haz lo siguiente:
    local7.info @@<BINDPLANE_HOST_IP>:514
    

Reemplaza <BINDPLANE_HOST_IP> por la dirección IP o el nombre de host del sistema que ejecuta el agente de Bindplane.

Note: A single `@` prefix indicates UDP forwarding. A double `@@` prefix indicates TCP forwarding. Ensure this matches the receiver type in the Bindplane `config.yaml`.
  1. Opcional: Para conservar también una copia local de los registros de auditoría, agrega la siguiente línea:

    local7.info /var/log/oracle_audit.log
    
  2. Guarda el archivo y reinicia el daemon de syslog:

    • En RHEL/CentOS/Oracle Linux con rsyslog, haz lo siguiente:
    sudo systemctl restart rsyslog
    
    • En sistemas más antiguos con syslog:
    sudo service syslog restart
    

Verifica el reenvío del registro de auditoría

  1. Genera un evento de auditoría de prueba realizando una acción auditable en la base de datos de Oracle. Por ejemplo, conéctate como usuario y ejecuta lo siguiente:

    SELECT * FROM DBA_USERS WHERE ROWNUM = 1;
    
  2. Verifica los registros del agente de BindPlane para ver los mensajes de syslog entrantes:

    sudo journalctl -u observiq-otel-collector -f
    
  3. Verifica que el mensaje de syslog contenga la etiqueta Oracle Unified Audit con pares clave-valor, como TYPE, DBID, SESID, DBUSER, ACTION y RETCODE.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
ACTION security_result.action_details El valor de ACTION del registro sin procesar se asigna directamente a este campo de UDM. Se aplica lógica adicional para determinar security_result.action y security_result.description según el valor de ACTION (por ejemplo, 100 se asigna a ALLOW y Success).
ACTION_NAME metadata.product_event_type Se asigna directamente.
ACTION_NUMBER additional.fields[action_number].value.string_value Se asigna directamente con la clave Source Event. También se usa en combinación con otros campos para derivar metadata.event_type y metadata.product_event_type.
APPLICATION_CONTEXTS additional.fields[application_contexts_label].value.string_value Se asigna directamente con la clave APPLICATION_CONTEXTS.
AUDIT_POLICY additional.fields[audit_policy_label].value.string_value o additional.fields[AUDIT_POLICY_#].value.string_value Si AUDIT_POLICY contiene una coma, se divide en varias etiquetas con claves como AUDIT_POLICY_0, AUDIT_POLICY_1, etcétera. De lo contrario, se asigna directamente con la clave AUDIT_POLICY.
AUDIT_TYPE additional.fields[audit_type_label].value.string_value Se asigna directamente con la clave AUDIT_TYPE.
AUTHENTICATION_TYPE metadata.event_type, extensions.auth.type Se usa para derivar metadata.event_type como USER_LOGIN si auth_type (extraído de AUTHENTICATION_TYPE) no está vacío y se cumplen otras condiciones. extensions.auth.type se establece en AUTHTYPE_UNSPECIFIED.
CLIENT_ADDRESS principal.ip, principal.port, network.ip_protocol, intermediary[host].user.userid La IP, el puerto y el protocolo se extraen con patrones de grok. Si hay un nombre de usuario en el campo CLIENT_ADDRESS, se asigna a intermediary[host].user.userid.
CLIENT_ID target.user.userid Se asigna directamente.
CLIENT_PROGRAM_NAME additional.fields[client_program_name_label].value.string_value Se asigna directamente con la clave CLIENT_PROGRAM_NAME.
CLIENT_TERMINAL additional.fields[CLIENT_TERMINAL_label].value Se asigna directamente con la clave CLIENT_TERMINAL.
CLIENT_USER target.user.user_display_name Se asigna directamente.
COMMENT$TEXT additional.fields[comment_text_label].value.string_value Se asigna directamente con la clave comment_text después de reemplazar + por :.
CURRENT_USER additional.fields[current_user_label].value.string_value Se asigna directamente con la clave current_user.
CURUSER additional.fields[current_user_label].value.string_value Se asigna directamente con la clave current_user.
DATABASE_USER principal.user.user_display_name Se asigna directamente si no está vacío o es /.
DBID metadata.product_log_id Se asigna directamente después de quitar las comillas simples.
DBNAME target.resource.resource_type, target.resource.resource_subtype, target.resource.name Establece resource_type en DATABASE, resource_subtype en Oracle Database y asigna DBNAME a name.
DBPROXY_USERRNAME intermediary[dbproxy].user.userid Se asigna directamente.
DBUSERNAME target.user.user_display_name Se asigna directamente.
ENTRYID target.resource.attribute.labels[entry_id_label].value Se asigna directamente con la clave Entry Id.
EXTERNAL_USERID additional.fields[external_userid_label].value.string_value Se asigna directamente con la clave EXTERNAL_USERID.
LENGTH additional.fields[length_label].value.string_value Se asigna directamente con la clave length.
LOGOFF$DEAD target.resource.attribute.labels[LOGOFFDEAD_label].value Se asigna directamente con la clave LOGOFFDEAD.
LOGOFF$LREAD target.resource.attribute.labels[LOGOFFLREAD_label].value Se asigna directamente con la clave LOGOFFLREAD.
LOGOFF$LWRITE target.resource.attribute.labels[LOGOFFLWRITE_label].value Se asigna directamente con la clave LOGOFFLWRITE.
LOGOFF$PREAD target.resource.attribute.labels[LOGOFFPREAD_label].value Se asigna directamente con la clave LOGOFFPREAD.
NTIMESTAMP# metadata.event_timestamp Se analiza y convierte al formato RFC 3339 o ISO8601.
OBJCREATOR target.resource.attribute.labels[obj_creator_label].value Se asigna directamente con la clave OBJ Creator.
OBJNAME target.resource.attribute.labels[obj_name_label].value Se asigna directamente con la clave OBJ Name.
OS_USERNAME principal.user.user_display_name Se asigna directamente.
OSUSERID target.user.userid Se asigna directamente.
PDB_GUID principal.resource.product_object_id Se asigna directamente.
PRIV$USED additional.fields[privused_label].value.string_value Se asigna directamente con la clave privused.
PRIVILEGE principal.user.attribute.permissions.name Se asigna directamente.
RETURN_CODE security_result.summary Se asigna directamente. Se aplica la lógica para derivar security_result.action y security_result.description.
RETURNCODE security_result.summary Se asigna directamente. Se aplica la lógica para derivar security_result.action y security_result.description.
RLS_INFO additional.fields[rls_info_label].value.string_value Se asigna directamente con la clave RLS_INFO.
SCHEMA additional.fields[schema_label].value.string_value Se asigna directamente con la clave schema.
SESSIONCPU target.resource.attribute.labels[SESSIONCPU_label].value Se asigna directamente con la clave SESSIONCPU.
SESSIONID network.session_id Se asigna directamente.
SESID network.session_id Se asigna directamente.
SQL_TEXT target.process.command_line Se asigna directamente.
SQLTEXT target.process.command_line Se asigna directamente.
STATEMENT target.resource.attribute.labels[statement_label].value Se asigna directamente con la clave STATEMENT.
STATUS security_result.summary Se asigna directamente. Se aplica la lógica para derivar security_result.action y security_result.description.
SYSTEM_PRIVILEGE_USED additional.fields[system_privilege_used_label].value.string_value Se asigna directamente con la clave SYSTEM_PRIVILEGE_USED.
TARGET_USER additional.fields[target_user_label].value.string_value Se asigna directamente con la clave TARGET_USER.
TERMINAL additional.fields[CLIENT_TERMINAL_label].value Se asigna directamente con la clave CLIENT_TERMINAL.
TYPE additional.fields[type_label].value.string_value Se asigna directamente con la clave type.
USERHOST principal.hostname, principal.administrative_domain El nombre de host y el dominio se extraen con patrones de grok.
USERID principal.user.userid Se asigna directamente.
device_host_name target.hostname Se asigna directamente.
event_name metadata.product_event_type Se asigna directamente después de convertirla a mayúsculas.
file_name target.file.full_path Se asigna directamente.
hostname principal.hostname Se asigna directamente.
length additional.fields[length_label].value.string_value Se asigna directamente con la clave length.
log_source_name principal.application Se asigna directamente.
message Varios Se usa para el análisis de Grok para extraer varios campos.
returncode RETURNCODE Se asigna directamente.
src_ip principal.ip Se asigna directamente.
t_hostname target.hostname Se asigna directamente.
(Lógica del analizador) metadata.vendor_name Se codificó como Oracle.
(Lógica del analizador) metadata.product_name Se codificó como Oracle DB.
(Lógica del analizador) metadata.event_type Se determina según los valores de ACTION, ACTION_NUMBER, source_event, OSUSERID, USERID, SQLTEXT, AUTHENTICATION_TYPE, DBUSERNAME, device_host_name y database_name. El valor predeterminado es USER_RESOURCE_ACCESS si no se cumple ninguna condición específica.
(Lógica del analizador) metadata.product_event_type Se determina según los valores de ACTION, ACTION_NUMBER, source_event, p_event_type y ACTION_NAME.
(Lógica del analizador) metadata.log_type Se codificó como ORACLE_DB.
(Lógica del analizador) extensions.auth.mechanism Se establece en USERNAME_PASSWORD en ciertas condiciones según ACTION, ACTION_NUMBER, source_event y OSUSERID.
(Lógica del analizador) extensions.auth.type Se establece en AUTHTYPE_UNSPECIFIED en ciertas condiciones según ACTION, ACTION_NUMBER y AUTHENTICATION_TYPE.
(Lógica del analizador) security_result.description Se deriva de RETURNCODE o STATUS.
(Lógica del analizador) security_result.action Se deriva de RETURNCODE o STATUS.
(Lógica del analizador) target.resource.attribute.labels Se agregan varias etiquetas según la presencia y los valores de varios campos de registro.
(Lógica del analizador) additional.fields Se agregan varios campos como pares clave-valor según la presencia y los valores de varios campos de registro.
(Lógica del analizador) intermediary Se crea y se completa en función de la presencia y los valores de DBPROXY_USERRNAME y CLIENT_ADDRESS.
(Lógica del analizador) network.ip_protocol Se deriva del protocolo extraído de CLIENT_ADDRESS con un archivo de inclusión parse_ip_protocol.include.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.