Coletar registros do Oracle DB

Compatível com:

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 systemd

  • Conectividade 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

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. 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

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. 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

  1. Abra o Prompt de comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Aguarde a conclusão da instalação.

  4. 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

  1. Abra um terminal com privilégios de root ou sudo.
  2. Execute este comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Aguarde a conclusão da instalação.

  4. 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, Enter e Ctrl+X.
    • Windows: clique em Arquivo > Salvar.

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
    
    1. Verifique se o serviço está em execução:
    sudo systemctl status observiq-otel-collector
    
    1. Verifique se há erros nos registros:
    sudo journalctl -u observiq-otel-collector -f
    
  • Para 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:
      1. Pressione Win+R, digite services.msc e pressione Enter.
      2. Localize o Coletor do OpenTelemetry da observIQ.
      3. Clique com o botão direito do mouse e selecione Reiniciar.
    1. Verifique se o serviço está em execução:
    sc query observiq-otel-collector
    
    1. 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).

  1. Conecte-se ao host do Oracle Database como o usuário do sistema operacional oracle.
  2. Encerre a instância e o listener do Oracle:

    sqlplus / as sysdba <<EOF
    shutdown immediate;
    exit
    EOF
    lsnrctl stop
    
  3. Vincule novamente os binários do Oracle com a auditoria unificada ativada:

    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk uniaud_on ioracle
    
  4. Inicie o listener e a instância do Oracle:

    lsnrctl start
    sqlplus / as sysdba <<EOF
    startup;
    exit
    EOF
    
  5. Se 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 oms
    
  6. Verifique 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.

  1. Conecte-se ao banco de dados Oracle com o SQLplus como SYSDBA.
  2. 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 TRUE para gravar no Visualizador de eventos do Windows:
    ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;
    
  3. 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;
    
  4. 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.

  1. Faça login no host do banco de dados Oracle como root.
  2. 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.conf
    
  3. Adicione uma regra de encaminhamento que corresponda à instalação e à prioridade configuradas em UNIFIED_AUDIT_SYSTEMLOG. Por exemplo, se você definir LOCAL7.INFO:

    • Para encaminhar via UDP (correspondente ao receptor udplog do Bindplane):
    local7.info @<BINDPLANE_HOST_IP>:514
    
    • Para encaminhar via TCP (se o Bindplane usar o receptor tcplog):
    local7.info @@<BINDPLANE_HOST_IP>:514
    

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`.
  1. Opcional: para manter uma cópia local dos registros de auditoria, adicione a seguinte linha:

    local7.info /var/log/oracle_audit.log
    
  2. Salve 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

  1. 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;
    
  2. Verifique os registros do agente do Bindplane para mensagens syslog recebidas:

    sudo journalctl -u observiq-otel-collector -f
    
  3. Verifique se a mensagem do syslog contém a tag Oracle Unified Audit com pares de chave-valor, como TYPE, DBID, SESID, DBUSER, ACTION e RETCODE.

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.