Coletar registros do Oracle DB
Este guia explica como ingerir registros do Oracle DB no Google Security Operations usando o agente Bindplane.
O analisador extrai campos de mensagens SYSLOG, processando vários formatos usando padrões grok e análise de chave-valor. Em seguida, ele mapeia esses campos extraídos para o modelo de dados unificado (UDM, na sigla em inglês), enriquecendo os dados com metadados estáticos, como nomes de fornecedores e produtos, e definindo dinamicamente os tipos de eventos com base em valores de campos específicos, como ACTION e USERID.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
Uma instância do Google SecOps
Windows Server 2016 ou mais recente ou host Linux com
systemdConectividade de rede entre o agente do Bindplane e o host do Oracle Database
Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente Bindplane.
Acesso privilegiado à instância do Oracle Database (papel SYSDBA ou AUDIT_ADMIN)
Oracle Database 19c ou mais recente com auditoria unificada ativada (ou auditoria de modo misto no Oracle 12c–18c)
Receber o arquivo de autenticação de ingestão do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
Baixe o arquivo de autenticação de ingestão. Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.
Receber o ID de cliente do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
Copie e salve o ID do cliente na seção Detalhes da organização.
Instalar o agente do Bindplane
Instale o agente do Bindplane no sistema operacional Windows ou Linux de acordo com as instruções a seguir.
Instalação do Windows
- Abra o Prompt de comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sc query observiq-otel-collector
O serviço vai aparecer como EM EXECUÇÃO.
Instalação do Linux
- Abra um terminal com privilégios de root ou sudo.
Execute este comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sudo systemctl status observiq-otel-collector
O serviço vai aparecer como ativo (em execução).
Outros recursos de instalação
Para mais opções de instalação e solução de problemas, consulte o guia de instalação do agente do Bindplane.
Configurar o agente do Bindplane para ingerir syslog e enviar ao Google SecOps
Localizar o arquivo de configuração
Linux:
```bash
sudo nano /etc/bindplane-agent/config.yaml
```
Windows:
```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```
Editar o arquivo de configuração
Substitua todo o conteúdo de config.yaml pela seguinte configuração:
```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 configuração
- Substitua os seguintes marcadores de posição:
Configuração do receptor:
* listen_address: o endereço IP e a porta a serem detectados:
- Substitua 0.0.0.0 por um endereço IP específico para detectar uma interface ou deixe como 0.0.0.0 para detectar todas as interfaces (recomendado).
- Substitua 514 pelo número da porta que corresponde à configuração de encaminhamento de syslog do Oracle.
Configuração do exportador:
* creds_file_path: caminho completo para o arquivo de autenticação de ingestão:
- Linux: /etc/bindplane-agent/ingestion-auth.json
- Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
* customer_id: ID do cliente copiado na seção Receber ID do cliente do Google SecOps
* endpoint: URL do endpoint regional:
- EUA: malachiteingestion-pa.googleapis.com
- Europa: europe-malachiteingestion-pa.googleapis.com
- Ásia: asia-southeast1-malachiteingestion-pa.googleapis.com
- Consulte Endpoints regionais para ver a lista completa.
Salve o arquivo de configuração.
- Depois de editar, salve o arquivo:
- Linux: pressione
Ctrl+O,EntereCtrl+X. - Windows: clique em Arquivo > Salvar.
- Linux: pressione
Reinicie o agente do Bindplane para aplicar as mudanças
Para reiniciar o agente do Bindplane no Linux, execute o seguinte comando:
sudo systemctl restart observiq-otel-collector- Verifique se o serviço está em execução:
sudo systemctl status observiq-otel-collector- Verifique se há erros nos registros:
sudo journalctl -u observiq-otel-collector -fPara reiniciar o agente do Bindplane em Windows, escolha uma das seguintes opções:
- Prompt de comando ou PowerShell como administrador:
net stop observiq-otel-collector && net start observiq-otel-collector- Console de serviços:
- Pressione
Win+R, digiteservices.msce pressione Enter. - Localize o Coletor do OpenTelemetry da observIQ.
- Clique com o botão direito do mouse e selecione Reiniciar.
- Pressione
- Verifique se o serviço está em execução:
sc query observiq-otel-collector- Verifique se há erros nos registros:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configurar a auditoria unificada do banco de dados Oracle e o encaminhamento de syslog
Ativar a auditoria unificada
Se a auditoria unificada ainda não estiver ativada, vincule novamente os binários do Oracle com a opção uniaud_on. Isso exige o encerramento de todos os processos do Oracle em execução no Oracle Home (instância e listener do banco de dados).
- Conecte-se ao host do Oracle Database como o usuário do sistema operacional
oracle. Encerre a instância e o listener do Oracle:
sqlplus / as sysdba <<EOF shutdown immediate; exit EOF lsnrctl stopVincule novamente os binários do Oracle com a auditoria unificada ativada:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracleInicie o listener e a instância do Oracle:
lsnrctl start sqlplus / as sysdba <<EOF startup; exit EOFSe o Oracle Enterprise Manager Cloud Control estiver sendo executado no mesmo host, reinicie-o:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start omsVerifique se a auditoria unificada está ativada. Conecte-se ao Oracle Database com o SQLplus:
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
Verifique se o comando retorna uma linha com VALUE igual a TRUE.
Configurar a saída syslog de auditoria unificada
Defina o parâmetro de inicialização UNIFIED_AUDIT_SYSTEMLOG para gravar registros de auditoria unificada no syslog. Esse parâmetro foi introduzido no Oracle 19c e substitui o parâmetro AUDIT_SYSLOG_LEVEL descontinuado, que se aplica apenas à auditoria tradicional.
- Conecte-se ao banco de dados Oracle com o SQLplus como SYSDBA.
Defina o parâmetro
UNIFIED_AUDIT_SYSTEMLOG:- Em sistemas UNIX/Linux, defina o parâmetro com um valor
facility.priority:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;- Em sistemas Windows, defina o parâmetro como
TRUEpara gravar no Visualizador de eventos do Windows:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;- Em sistemas UNIX/Linux, defina o parâmetro com um valor
Opcional: para gravar registros comuns de política de auditoria unificada de um contêiner raiz de CDB no syslog em sistemas UNIX/Linux, defina o parâmetro
UNIFIED_AUDIT_COMMON_SYSTEMLOG:ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;Reinicie a instância do Oracle Database para que as mudanças de parâmetro entrem em vigor:
SHUTDOWN IMMEDIATE; STARTUP;
Configurar o daemon syslog no host do Oracle
No host do Oracle Database, configure o daemon syslog para encaminhar entradas de registro de auditoria ao agente do Bindplane.
- Faça login no host do banco de dados Oracle como
root. Abra o arquivo de configuração do syslog:
- No RHEL/CentOS/Oracle Linux com rsyslog:
sudo vi /etc/rsyslog.conf- Em sistemas mais antigos com syslog:
sudo vi /etc/syslog.confAdicione uma regra de encaminhamento que corresponda à instalação e à prioridade configuradas em
UNIFIED_AUDIT_SYSTEMLOG. Por exemplo, se você definirLOCAL7.INFO:- Para encaminhar via UDP (correspondente ao receptor
udplogdo Bindplane):
local7.info @<BINDPLANE_HOST_IP>:514- Para encaminhar via TCP (se o Bindplane usar o receptor
tcplog):
local7.info @@<BINDPLANE_HOST_IP>:514- Para encaminhar via UDP (correspondente ao receptor
Substitua <BINDPLANE_HOST_IP> pelo endereço IP ou nome do host do sistema que executa o agente do 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`.
Opcional: para manter uma cópia local dos registros de auditoria, adicione a seguinte linha:
local7.info /var/log/oracle_audit.logSalve o arquivo e reinicie o daemon syslog:
- No RHEL/CentOS/Oracle Linux com rsyslog:
sudo systemctl restart rsyslog- Em sistemas mais antigos com syslog:
sudo service syslog restart
Verificar o encaminhamento do registro de auditoria
Gere um evento de auditoria de teste realizando uma ação auditável no Oracle Database. Por exemplo, conecte-se como um usuário e execute:
SELECT * FROM DBA_USERS WHERE ROWNUM = 1;Verifique os registros do agente do Bindplane para mensagens syslog recebidas:
sudo journalctl -u observiq-otel-collector -fVerifique se a mensagem do syslog contém a tag
Oracle Unified Auditcom pares de chave-valor, comoTYPE,DBID,SESID,DBUSER,ACTIONeRETCODE.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
ACTION |
security_result.action_details |
O valor de ACTION do registro bruto é mapeado diretamente para esse campo do UDM. Uma lógica adicional é aplicada para determinar security_result.action e security_result.description com base no valor de ACTION (por exemplo, 100 mapeia para ALLOW e Success). |
ACTION_NAME |
metadata.product_event_type |
Mapeado diretamente. |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
Mapeado diretamente com a chave Source Event. Também usado em combinação com outros campos para derivar metadata.event_type e metadata.product_event_type. |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
Mapeado diretamente com a chave APPLICATION_CONTEXTS. |
AUDIT_POLICY |
additional.fields[audit_policy_label].value.string_value ou additional.fields[AUDIT_POLICY_#].value.string_value |
Se AUDIT_POLICY contiver uma vírgula, ele será dividido em vários rótulos com chaves como AUDIT_POLICY_0, AUDIT_POLICY_1 etc. Caso contrário, ele será mapeado diretamente com a chave AUDIT_POLICY. |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
Mapeado diretamente com a chave AUDIT_TYPE. |
AUTHENTICATION_TYPE |
metadata.event_type, extensions.auth.type |
Usado para derivar metadata.event_type como USER_LOGIN se auth_type (extraído de AUTHENTICATION_TYPE) não estiver vazio e outras condições forem atendidas. extensions.auth.type, definida como AUTHTYPE_UNSPECIFIED. |
CLIENT_ADDRESS |
principal.ip, principal.port, network.ip_protocol, intermediary[host].user.userid |
O IP, a porta e o protocolo são extraídos usando padrões grok. Se um nome de usuário estiver presente no campo CLIENT_ADDRESS, ele será mapeado para intermediary[host].user.userid. |
CLIENT_ID |
target.user.userid |
Mapeado diretamente. |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
Mapeado diretamente com a chave CLIENT_PROGRAM_NAME. |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mapeado diretamente com a chave CLIENT_TERMINAL. |
CLIENT_USER |
target.user.user_display_name |
Mapeado diretamente. |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
Mapeado diretamente com a chave comment_text depois de substituir + por :. |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
Mapeado diretamente com a chave current_user. |
CURUSER |
additional.fields[current_user_label].value.string_value |
Mapeado diretamente com a chave current_user. |
DATABASE_USER |
principal.user.user_display_name |
Mapeado diretamente se não estiver vazio ou for /. |
DBID |
metadata.product_log_id |
Mapeado diretamente após a remoção de aspas simples. |
DBNAME |
target.resource.resource_type, target.resource.resource_subtype, target.resource.name |
Define resource_type como DATABASE, resource_subtype como Oracle Database e mapeia DBNAME para name. |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
Mapeado diretamente. |
DBUSERNAME |
target.user.user_display_name |
Mapeado diretamente. |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
Mapeado diretamente com a chave Entry Id. |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
Mapeado diretamente com a chave EXTERNAL_USERID. |
LENGTH |
additional.fields[length_label].value.string_value |
Mapeado diretamente com a chave length. |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
Mapeado diretamente com a chave LOGOFFDEAD. |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
Mapeado diretamente com a chave LOGOFFLREAD. |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
Mapeado diretamente com a chave LOGOFFLWRITE. |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
Mapeado diretamente com a chave LOGOFFPREAD. |
NTIMESTAMP# |
metadata.event_timestamp |
Analisado e convertido para o formato RFC 3339 ou ISO8601. |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
Mapeado diretamente com a chave OBJ Creator. |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
Mapeado diretamente com a chave OBJ Name. |
OS_USERNAME |
principal.user.user_display_name |
Mapeado diretamente. |
OSUSERID |
target.user.userid |
Mapeado diretamente. |
PDB_GUID |
principal.resource.product_object_id |
Mapeado diretamente. |
PRIV$USED |
additional.fields[privused_label].value.string_value |
Mapeado diretamente com a chave privused. |
PRIVILEGE |
principal.user.attribute.permissions.name |
Mapeado diretamente. |
RETURN_CODE |
security_result.summary |
Mapeado diretamente. A lógica é aplicada para derivar security_result.action e security_result.description. |
RETURNCODE |
security_result.summary |
Mapeado diretamente. A lógica é aplicada para derivar security_result.action e security_result.description. |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
Mapeado diretamente com a chave RLS_INFO. |
SCHEMA |
additional.fields[schema_label].value.string_value |
Mapeado diretamente com a chave schema. |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
Mapeado diretamente com a chave SESSIONCPU. |
SESSIONID |
network.session_id |
Mapeado diretamente. |
SESID |
network.session_id |
Mapeado diretamente. |
SQL_TEXT |
target.process.command_line |
Mapeado diretamente. |
SQLTEXT |
target.process.command_line |
Mapeado diretamente. |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
Mapeado diretamente com a chave STATEMENT. |
STATUS |
security_result.summary |
Mapeado diretamente. A lógica é aplicada para derivar security_result.action e security_result.description. |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
Mapeado diretamente com a chave SYSTEM_PRIVILEGE_USED. |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
Mapeado diretamente com a chave TARGET_USER. |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mapeado diretamente com a chave CLIENT_TERMINAL. |
TYPE |
additional.fields[type_label].value.string_value |
Mapeado diretamente com a chave type. |
USERHOST |
principal.hostname, principal.administrative_domain |
O nome do host e o domínio são extraídos usando padrões grok. |
USERID |
principal.user.userid |
Mapeado diretamente. |
device_host_name |
target.hostname |
Mapeado diretamente. |
event_name |
metadata.product_event_type |
Mapeado diretamente após a conversão para maiúsculas. |
file_name |
target.file.full_path |
Mapeado diretamente. |
hostname |
principal.hostname |
Mapeado diretamente. |
length |
additional.fields[length_label].value.string_value |
Mapeado diretamente com a chave length. |
log_source_name |
principal.application |
Mapeado diretamente. |
message |
Vários | Usado para análise grok e extração de vários campos. |
returncode |
RETURNCODE |
Mapeado diretamente. |
src_ip |
principal.ip |
Mapeado diretamente. |
t_hostname |
target.hostname |
Mapeado diretamente. |
| (Lógica do analisador) | metadata.vendor_name |
Fixado no código como Oracle. |
| (Lógica do analisador) | metadata.product_name |
Fixado no código como Oracle DB. |
| (Lógica do analisador) | metadata.event_type |
Determinado com base nos valores de ACTION, ACTION_NUMBER, source_event, OSUSERID, USERID, SQLTEXT, AUTHENTICATION_TYPE, DBUSERNAME, device_host_name, database_name. O padrão é USER_RESOURCE_ACCESS se nenhuma condição específica for atendida. |
| (Lógica do analisador) | metadata.product_event_type |
Determinado com base nos valores de ACTION, ACTION_NUMBER, source_event, p_event_type e ACTION_NAME. |
| (Lógica do analisador) | metadata.log_type |
Fixado no código como ORACLE_DB. |
| (Lógica do analisador) | extensions.auth.mechanism |
Definido como USERNAME_PASSWORD em determinadas condições com base em ACTION, ACTION_NUMBER, source_event e OSUSERID. |
| (Lógica do analisador) | extensions.auth.type |
Definido como AUTHTYPE_UNSPECIFIED em determinadas condições com base em ACTION, ACTION_NUMBER e AUTHENTICATION_TYPE. |
| (Lógica do analisador) | security_result.description |
Derivado de RETURNCODE ou STATUS. |
| (Lógica do analisador) | security_result.action |
Derivado de RETURNCODE ou STATUS. |
| (Lógica do analisador) | target.resource.attribute.labels |
Vários rótulos são adicionados com base na presença e nos valores de vários campos de registro. |
| (Lógica do analisador) | additional.fields |
Vários campos são adicionados como pares de chave-valor com base na presença e nos valores de vários campos de registro. |
| (Lógica do analisador) | intermediary |
Criado e preenchido com base na presença e nos valores de DBPROXY_USERRNAME e CLIENT_ADDRESS. |
| (Lógica do analisador) | network.ip_protocol |
Derivado do protocolo extraído de CLIENT_ADDRESS usando um arquivo de inclusão parse_ip_protocol.include. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.