Recoger registros de bases de datos Oracle
En este documento se explica cómo ingerir registros de bases de datos de Oracle en Google Security Operations mediante Bindplane. El analizador extrae campos de mensajes SYSLOG y gestiona varios formatos mediante patrones grok y análisis de pares clave-valor. A continuación, asigna estos campos extraídos al modelo de datos unificado (UDM), enriquece los datos con metadatos estáticos, como los nombres de proveedor y de producto, y define dinámicamente los tipos de eventos en función de valores de campo específicos, como ACTION
y USERID
. El analizador también gestiona varias operaciones de limpieza de datos, como la sustitución de caracteres y la conversión de tipos de datos.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Instancia de Google SecOps
- Windows 2016 o versiones posteriores, o un host Linux con
systemd
- Si se ejecuta a través de un proxy, los puertos del cortafuegos están abiertos
- Acceso con privilegios (rol AUDIT_SYSTEM) a la base de datos de Oracle
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 más opciones de instalación, consulta la 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 ingestion_labels: log_type: 'ORACLE_DB' raw_log_field: body 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
Habilitar la auditoría en Oracle Database
- Conéctate a la base de datos de Oracle con SQL*Plus.
Cierra la base de datos con el siguiente comando:
shutdown immediate
Detén el servicio de escucha de Oracle escribiendo el siguiente comando:
lsnrctl stop
Opcional: Solo si procede, detén Enterprise Manager con los siguientes comandos:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl stop oms
Vincula la base de datos de Oracle con la opción uniaud mediante los siguientes comandos:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
Conéctate a la base de datos de Oracle con SQL*Plus.
Reinicia la base de datos con el siguiente comando:
startup
Reinicia el servicio de escucha de Oracle con el siguiente comando:
lsnrctl start
Opcional: Solo si procede, reinicia Enterprise Manager con los siguientes comandos:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start oms
Verifica que la auditoría unificada esté habilitada, conéctate a la base de datos de Oracle con SQLplus y, a continuación, escribe el siguiente comando:
select * from v$option where PARAMETER = 'Unified Auditing';
Verifica que el comando devuelva una fila con el valor "TRUE".
Configurar Syslog para Oracle Database
- Inicia sesión en la instancia de Oracle.
Abre el siguiente archivo con
vi
:vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
Introduce los siguientes comandos para configurar syslog:
*.audit_trail='os' *.audit_syslog_level='local0.info'
Asegúrate de que el daemon syslog del host de Oracle esté configurado para reenviar el registro de auditoría.
En Red Hat Enterprise, abre el archivo
/etc/syslog.conf
convi
e introduce la siguiente línea:local0.info @ <bindplane-ip>:514
Guarda el archivo y sal:
:wq
En Red Hat Enterprise, escribe el siguiente comando para volver a cargar la configuración de syslog:
kill -HUP /var/run/syslogd.pid
Conéctate a SQLplus e inicia sesión como sysdba para reiniciar:
sys as sysdba
Cierra la base de datos con el siguiente comando:
shutdown immediate
Reinicia la base de datos con el siguiente comando:
startup
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 una lógica adicional para determinar security_result.action y security_result.description en función del valor de ACTION (por ejemplo, 100 se asigna a PERMITIR y Éxito). |
ACTION_NAME |
metadata.product_event_type |
Asignación directa. |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
Se asigna directamente a la tecla Source Event . También se usa junto con otros campos para obtener metadata.event_type y metadata.product_event_type . |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
Se asigna directamente a la tecla 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. De lo contrario, se asigna directamente con la clave AUDIT_POLICY . |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
Se asigna directamente a la tecla AUDIT_TYPE . |
AUTHENTICATION_TYPE |
metadata.event_type , extensions.auth.type |
Se usa para obtener 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 ha definido como AUTHTYPE_UNSPECIFIED. |
CLIENT_ADDRESS |
principal.ip , principal.port , network.ip_protocol , intermediary[host].user.userid |
La IP, el puerto y el protocolo se extraen mediante patrones grok. Si hay un nombre de usuario en el campo CLIENT_ADDRESS , se asigna a intermediary[host].user.userid . |
CLIENT_ID |
target.user.userid |
Asignación directa. |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
Se asigna directamente a la tecla CLIENT_PROGRAM_NAME . |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Se asigna directamente a la tecla CLIENT_TERMINAL . |
CLIENT_USER |
target.user.user_display_name |
Asignación directa. |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
Asignado directamente con la clave comment_text después de sustituir "+" por ":". |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
Se asigna directamente a la tecla current_user . |
CURUSER |
additional.fields[current_user_label].value.string_value |
Se asigna directamente a la tecla 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 |
Asigna el valor DATABASE a resource_type , Oracle Database a resource_subtype y name a DBNAME . |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
Asignación directa. |
DBUSERNAME |
target.user.user_display_name |
Asignación directa. |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
Se asigna directamente a la tecla Entry Id . |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
Se asigna directamente a la tecla EXTERNAL_USERID . |
LENGTH |
additional.fields[length_label].value.string_value |
Se asigna directamente a la tecla length . |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
Se asigna directamente a la tecla LOGOFFDEAD . |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
Se asigna directamente a la tecla LOGOFFLREAD . |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
Se asigna directamente a la tecla LOGOFFLWRITE . |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
Se asigna directamente a la tecla LOGOFFPREAD . |
NTIMESTAMP# |
metadata.event_timestamp |
Analizada y convertida al formato RFC 3339 o ISO 8601. |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
Se asigna directamente a la tecla OBJ Creator . |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
Se asigna directamente a la tecla OBJ Name . |
OS_USERNAME |
principal.user.user_display_name |
Asignación directa. |
OSUSERID |
target.user.userid |
Asignación directa. |
PDB_GUID |
principal.resource.product_object_id |
Asignación directa. |
PRIV$USED |
additional.fields[privused_label].value.string_value |
Se asigna directamente a la tecla privused . |
PRIVILEGE |
principal.user.attribute.permissions.name |
Asignación directa. |
RETURN_CODE |
security_result.summary |
Asignación directa. Se aplica una lógica para obtener security_result.action y security_result.description . |
RETURNCODE |
security_result.summary |
Asignación directa. Se aplica una lógica para obtener security_result.action y security_result.description . |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
Se asigna directamente a la tecla RLS_INFO . |
SCHEMA |
additional.fields[schema_label].value.string_value |
Se asigna directamente a la tecla schema . |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
Se asigna directamente a la tecla SESSIONCPU . |
SESSIONID |
network.session_id |
Asignación directa. |
SESID |
network.session_id |
Asignación directa. |
SQL_TEXT |
target.process.command_line |
Asignación directa. |
SQLTEXT |
target.process.command_line |
Asignación directa. |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
Se asigna directamente a la tecla STATEMENT . |
STATUS |
security_result.summary |
Asignación directa. Se aplica una lógica para obtener security_result.action y security_result.description . |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
Se asigna directamente a la tecla SYSTEM_PRIVILEGE_USED . |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
Se asigna directamente a la tecla TARGET_USER . |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Se asigna directamente a la tecla CLIENT_TERMINAL . |
TYPE |
additional.fields[type_label].value.string_value |
Se asigna directamente a la tecla type . |
USERHOST |
principal.hostname , principal.administrative_domain |
El nombre de host y el dominio se extraen mediante patrones grok. |
USERID |
principal.user.userid |
Asignación directa. |
device_host_name |
target.hostname |
Asignación directa. |
event_name |
metadata.product_event_type |
Se asigna directamente después de convertirlo a mayúsculas. |
file_name |
target.file.full_path |
Asignación directa. |
hostname |
principal.hostname |
Asignación directa. |
length |
additional.fields[length_label].value.string_value |
Se asigna directamente a la tecla length . |
log_source_name |
principal.application |
Asignación directa. |
message |
Varias | Se usa para el análisis grok con el fin de extraer varios campos. |
returncode |
RETURNCODE |
Asignación directa. |
src_ip |
principal.ip |
Asignación directa. |
t_hostname |
target.hostname |
Asignación directa. |
(Lógica del analizador) | metadata.vendor_name |
Valor fijo establecido en el código fuente Oracle . |
(Lógica del analizador) | metadata.product_name |
Valor fijo establecido en el código fuente Oracle DB . |
(Lógica del analizador) | metadata.event_type |
Se determina en función de 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 en función de los valores de ACTION , ACTION_NUMBER , source_event , p_event_type y ACTION_NAME . |
(Lógica del analizador) | metadata.log_type |
Valor fijo establecido en el código fuente ORACLE_DB . |
(Lógica del analizador) | extensions.auth.mechanism |
Se asigna el valor USERNAME_PASSWORD en determinadas condiciones en función de ACTION , ACTION_NUMBER , source_event y OSUSERID . |
(Lógica del analizador) | extensions.auth.type |
Se define como AUTHTYPE_UNSPECIFIED en determinadas condiciones en función de ACTION , ACTION_NUMBER y AUTHENTICATION_TYPE . |
(Lógica del analizador) | security_result.description |
Derivado de RETURNCODE o STATUS . |
(Lógica del analizador) | security_result.action |
Derivado de RETURNCODE o STATUS . |
(Lógica del analizador) | target.resource.attribute.labels |
Se añaden varias etiquetas en función de la presencia y los valores de varios campos de registro. |
(Lógica del analizador) | additional.fields |
Se añaden varios campos como pares clave-valor en función de la presencia y los valores de varios campos de registro. |
(Lógica del analizador) | intermediary |
Se crea y se rellena en función de la presencia y los valores de DBPROXY_USERRNAME y CLIENT_ADDRESS . |
(Lógica del analizador) | network.ip_protocol |
Derivado de protocol extraído de CLIENT_ADDRESS mediante un archivo de inclusión parse_ip_protocol.include . |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.