Recolha registos da base de dados Oracle
Este documento explica como ingerir registos da base de dados Oracle no Google Security Operations
usando o Bindplane. O analisador extrai campos de mensagens SYSLOG, processando
vários formatos através de padrões grok e análise de chave/valor. Em seguida, mapeia estes campos extraídos para o modelo de dados unificado (UDM), 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
. O analisador também processa várias operações de limpeza de dados, como a substituição de carateres e a conversão de tipos de dados.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps
- Windows 2016 ou posterior, ou um anfitrião Linux com
systemd
- Se estiver a ser executado através de um proxy, as portas da firewall estão abertas
- Acesso privilegiado (função AUDIT_SYSTEM) à base de dados Oracle
Obtenha o ficheiro de autenticação de carregamento do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Agentes de recolha.
- Transfira o ficheiro de autenticação de carregamento. Guarde o ficheiro de forma segura no sistema onde o Bindplane vai ser instalado.
Obtenha o ID de cliente do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Perfil.
- Copie e guarde o ID do cliente da secção Detalhes da organização.
Instale o agente do Bindplane
Instalação do Windows
- Abra a Linha de comandos ou o PowerShell como administrador.
Execute o seguinte comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalação do Linux
- Abra um terminal com privilégios de raiz ou sudo.
Execute o seguinte comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Recursos de instalação adicionais
Para ver opções de instalação adicionais, consulte o guia de instalação.
Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps
- Aceda ao ficheiro de configuração:
- Localize o ficheiro
config.yaml
. Normalmente, encontra-se no diretório/etc/bindplane-agent/
no Linux ou no diretório de instalação no Windows. - Abra o ficheiro com um editor de texto (por exemplo,
nano
,vi
ou Bloco de notas).
- Localize o ficheiro
Edite o ficheiro
config.yaml
da seguinte forma: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
Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.
Substitua
<customer_id>
pelo ID de cliente real.Atualize
/path/to/ingestion-authentication-file.json
para o caminho onde o ficheiro de autenticação foi guardado na secção Obtenha o ficheiro de autenticação de carregamento do Google SecOps.
Reinicie o agente do Bindplane para aplicar as alterações
Para reiniciar o agente do Bindplane no Linux, execute o seguinte comando:
sudo systemctl restart bindplane-agent
Para reiniciar o agente do Bindplane no Windows, pode usar a consola Services ou introduzir o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Ative a auditoria para a base de dados Oracle
- Estabeleça ligação à base de dados Oracle com o SQLplus.
Encerre a base de dados com o seguinte comando:
shutdown immediate
Pare o serviço de escuta do Oracle escrevendo o seguinte comando:
lsnrctl stop
Opcional: apenas se aplicável, pare o Enterprise Manager com os seguintes comandos:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl stop oms
Associe a base de dados Oracle com a opção uniaud através dos seguintes comandos:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
Estabeleça ligação à base de dados Oracle com o SQLplus.
Reinicie a base de dados com o seguinte comando:
startup
Reinicie o serviço de escuta do Oracle com o seguinte comando:
lsnrctl start
Opcional: apenas se aplicável, reinicie o Enterprise Manager com os seguintes comandos:
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start oms
Verifique se a auditoria unificada está ativada, ligue-se à base de dados Oracle com o SQLplus e, em seguida, escreva o seguinte comando:
select * from v$option where PARAMETER = 'Unified Auditing';
Verifique se o comando devolve uma linha com VALUE igual a "TRUE".
Configure o Syslog para a base de dados Oracle
- Inicie sessão na instância do Oracle.
Abra o seguinte ficheiro com o
vi
:vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
Introduza os seguintes comandos para a configuração do syslog:
*.audit_trail='os' *.audit_syslog_level='local0.info'
Certifique-se de que o daemon syslog no anfitrião Oracle está configurado para encaminhar o registo de auditoria.
No Red Hat Enterprise, abra o seguinte ficheiro
/etc/syslog.conf
comvi
e introduza a seguinte linha:local0.info @ <bindplane-ip>:514
Guarde e saia do ficheiro:
:wq
No Red Hat Enterprise, escreva o seguinte comando para recarregar a configuração do syslog:
kill -HUP /var/run/syslogd.pid
Estabeleça ligação ao SQLplus e inicie sessão como sysdba para reiniciar:
sys as sysdba
Encerre a base de dados com o seguinte comando:
shutdown immediate
Reinicie a base de dados com o seguinte comando:
startup
Tabela de mapeamento do UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
ACTION |
security_result.action_details |
O valor de ACTION do registo não processado é mapeado diretamente para este campo da UDM. É aplicada uma lógica adicional para determinar security_result.action e security_result.description com base no valor de ACTION (por exemplo, 100 é mapeado 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 tecla Source Event . Também é usado em combinação com outros campos para obter metadata.event_type e metadata.product_event_type . |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
Mapeado diretamente com a tecla 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, é dividido em várias etiquetas com chaves como AUDIT_POLICY_0 , AUDIT_POLICY_1 , etc. Caso contrário, é mapeado diretamente com a chave AUDIT_POLICY . |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
Mapeado diretamente com a tecla 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 cumpridas. extensions.auth.type está definido 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 através de padrões grok. Se um nome de utilizador estiver presente no campo CLIENT_ADDRESS , é 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 tecla CLIENT_PROGRAM_NAME . |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mapeado diretamente com a tecla 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 após substituir "+" por ":". |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
Mapeado diretamente com a tecla current_user . |
CURUSER |
additional.fields[current_user_label].value.string_value |
Mapeado diretamente com a tecla current_user . |
DATABASE_USER |
principal.user.user_display_name |
Mapeado diretamente se não estiver vazio ou / . |
DBID |
metadata.product_log_id |
Mapeado diretamente após a remoção das 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 tecla Entry Id . |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
Mapeado diretamente com a tecla EXTERNAL_USERID . |
LENGTH |
additional.fields[length_label].value.string_value |
Mapeado diretamente com a tecla length . |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
Mapeado diretamente com a tecla LOGOFFDEAD . |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
Mapeado diretamente com a tecla LOGOFFLREAD . |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
Mapeado diretamente com a tecla LOGOFFLWRITE . |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
Mapeado diretamente com a tecla 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 tecla OBJ Creator . |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
Mapeado diretamente com a tecla 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 tecla 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 tecla RLS_INFO . |
SCHEMA |
additional.fields[schema_label].value.string_value |
Mapeado diretamente com a tecla schema . |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
Mapeado diretamente com a tecla 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 tecla 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 tecla SYSTEM_PRIVILEGE_USED . |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
Mapeado diretamente com a tecla TARGET_USER . |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mapeado diretamente com a tecla CLIENT_TERMINAL . |
TYPE |
additional.fields[type_label].value.string_value |
Mapeado diretamente com a tecla type . |
USERHOST |
principal.hostname , principal.administrative_domain |
O nome de anfitrião e o domínio são extraídos através de 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 tecla length . |
log_source_name |
principal.application |
Mapeado diretamente. |
message |
Vários | Usado para a análise grok para extrair 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 |
Codificado para Oracle . |
(Lógica do analisador) | metadata.product_name |
Codificado para 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 e database_name . A predefinição é USER_RESOURCE_ACCESS se não for cumprida nenhuma condição específica. |
(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 |
Codificado para 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 |
Derivados de RETURNCODE ou STATUS . |
(Lógica do analisador) | security_result.action |
Derivados de RETURNCODE ou STATUS . |
(Lógica do analisador) | target.resource.attribute.labels |
São adicionadas várias etiquetas com base na presença e nos valores de vários campos de registo. |
(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 registo. |
(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 de protocol extraído de CLIENT_ADDRESS através de um ficheiro de inclusão parse_ip_protocol.include . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.