Coletar registros do banco de dados da Imperva
Este documento explica como ingerir registros do banco de dados do Imperva no Google Security Operations usando o Bindplane. Primeiro, o analisador tenta extrair campos de vários formatos de registro estruturados, como CEF, LEEF e JSON. Se esses formatos não forem encontrados, ele usará padrões grok para extrair campos de mensagens syslog não estruturadas, mapeando os dados extraídos para um modelo de dados unificado (UDM). A segurança de banco de dados da Imperva oferece recursos abrangentes de monitoramento, auditoria e proteção de atividades do banco de dados.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Windows 2016 ou mais recente ou um host Linux com
systemd
- 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 ao console de gerenciamento do Imperva SecureSphere
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
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" /quiet
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.sh
Outros recursos de instalação
- Para mais opções de instalação, consulte este guia de instalação.
Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps
Acesse o arquivo de configuração:
- Localize o arquivo
config.yaml
. Normalmente, ele fica no diretório/etc/bindplane-agent/
no Linux ou no diretório de instalação no Windows. - Abra o arquivo usando um editor de texto (por exemplo,
nano
,vi
ou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
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 log_type: 'IMPERVA_DB' raw_log_field: body ingestion_labels: 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 do cliente real. - Atualize
/path/to/ingestion-authentication-file.json
para o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.
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 bindplane-agent
Para reiniciar o agente do Bindplane no Windows, use o console Serviços ou insira o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurar o encaminhamento do Syslog no banco de dados da Imperva
- Faça login no console de gerenciamento do Imperva SecureSphere.
- Acesse Configuração > Conjuntos de ações.
- Clique em Adicionar para criar ou editar um conjunto de ações.
- Clique em Adicionar ação e forneça os seguintes detalhes de configuração:
- Nome: insira um nome descritivo, por exemplo,
Google SecOps Syslog
. - Tipo de ação: selecione Syslog do GW.
- Host: insira o endereço IP do agente do BindPlane.
- Porta: insira o número da porta do agente do BindPlane (padrão
514
). - Protocolo: selecione UDP ou TCP, dependendo da configuração do agente do BindPlane.
- Nível de registro do Syslog: selecione DEBUG para um registro abrangente.
- Facilidade do Syslog: selecione LOCAL0 ou a facilidade apropriada.
- Interface de ação: selecione Registro do gateway - Evento de segurança - Registro do sistema (syslog) - Formato JSON (estendido) para o formato SYSLOG+JSON ou Registro do gateway - Evento de segurança - Registro do sistema (syslog) para o formato SYSLOG padrão.
- Nome: insira um nome descritivo, por exemplo,
- Salve a configuração da ação.
- Acesse Políticas > Políticas de segurança ou Políticas > Políticas de auditoria de banco de dados.
- Edite as políticas relevantes e adicione o conjunto de ações que contém sua ação de syslog para garantir que os eventos sejam encaminhados ao Google SecOps.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
acct | principal.user.userid | Se acct for "admin", mapeie para target.user.userid . Caso contrário, mapeie para principal.user.userid . Remova as aspas e os espaços de acct antes do mapeamento. |
ação | security_result.action_details | Valor do campo action do registro bruto |
alertSev | security_result.severity | Se alertSev for "Informativo", mapeie como "INFORMATIVO". Caso contrário, mapeie como maiúscula de alertSev . |
aplicativo | principal.application | Se application for "pam_unix(sudo:session)" ou description contiver "pam_unix", mapeie como "pam_unix". Se message contiver "run-parts", mapeie como "run-parts". Se message contiver "audispd", mapeie como "audispd". Se message contiver "FSS audit", mapeie como "FSS audit". Caso contrário, mapeie como o campo application do registro bruto. |
application-name | target.application | Valor do campo application-name do registro bruto |
audit-policy | security_result.category_details | Valor do campo audit-policy do registro bruto |
bind-variables | additional.fields.bind_variables_label.value.string_value | Valor do campo bind-variables do registro bruto |
categoria | security_result.category_details | Valor do campo category do registro bruto |
COMMAND | target.process.command_line | Se exe não estiver vazio, mapeie como o campo exe do registro bruto. Caso contrário, mapeie como o campo COMMAND do registro bruto. |
createTime | Não mapeado | |
db-schema-pair | additional.fields.DB Name_{index} .value.string_value, additional.fields.Schema Name_{index} .value.string_value |
Para cada objeto db-schema-pair no registro bruto, extraia os campos db-name e schema-name e mapeie-os para DB Name_{index} e Schema Name_{index} , respectivamente, na UDM, em que index é o índice do objeto na matriz. |
db-user | principal.user.userid | Se db-user não estiver vazio, mapeie como o campo db-user do registro bruto. Caso contrário, se os-user não estiver vazio e db-user estiver vazio, mapeie como o campo os-user do registro bruto. |
dbName | target.resource.name | Valor do campo dbName do registro bruto |
dest-ip | target.ip, target.asset.ip | Valor do campo dest-ip do registro bruto |
dest-port | target.port | Valor do campo dest-port do registro bruto |
descrição | metadata.description | Se description contiver "user:", extraia o userid de description e mapeie para userid . Se userid não estiver vazio e description contiver "Invalid" ou "invalid", substitua "Invalid user" por "Invalid". Se application for "sshd", remova "de" e "por" de description . Caso contrário, mapeie como o campo description do registro bruto. |
dst | target.ip, target.asset.ip | Valor do campo dst do registro bruto |
dstIP | target.ip, target.asset.ip | Valor do campo dstIP do registro bruto |
dstPort | target.port | Valor do campo dstPort do registro bruto |
event-type | metadata.product_event_type | Valor do campo event-type do registro bruto |
eventType | metadata.product_event_type, metadata.event_type | Se eventType não estiver vazio e srcIP e dstIP não estiverem vazios, mapeie eventType para metadata.product_event_type e "NETWORK_CONNECTION" para metadata.event_type . |
evntDesc | security_result.description | Valor do campo evntDesc do registro bruto |
exe | target.process.command_line | Valor do campo exe do registro bruto |
de | network.email.from | Remova "<" e ">" de from e mapeie para network.email.from |
grupo | target.user.group_identifiers | Valor do campo group do registro bruto |
gw-ip | intermediary.ip, intermediary.asset.ip | Valor do campo gw-ip do registro bruto |
host | target.hostname, target.asset.hostname | Valor do campo host do registro bruto |
host-name | principal.hostname, principal.asset.hostname | Valor do campo host-name do registro bruto |
nome do host | principal.hostname, principal.asset.hostname | Valor do campo hostname do registro bruto |
ip | target.ip, target.asset.ip | Valor do campo ip do registro bruto |
mx-ip | intermediary.ip, intermediary.asset.ip | Valor do campo mx-ip do registro bruto |
objects-list | additional.fields.Object_{index} .value.string_value |
Para cada objeto objects-list no registro bruto, extraia o objeto e mapeie-o para Object_{index} na UDM, em que index é o índice do objeto na matriz. |
Operação | about.labels.Operation.value | Valor do campo Operation do registro bruto |
Operation type |
about.labels.Operation Type .value |
Valor do campo Operation type do registro bruto |
os-user | principal.user.userid, additional.fields.OS User .value.string_value |
Se os-user não estiver vazio e db-user estiver vazio, mapeie como o campo os-user do registro bruto. Caso contrário, mapeie como o campo OS User do registro bruto. |
Consulta analisada | target.process.command_line | Valor do campo Parsed Query do registro bruto |
parsed-query | additional.fields.Parsed Query .value.string_value |
Valor do campo parsed-query do registro bruto |
pid | target.process.pid | Valor do campo pid do registro bruto |
policy-id | security_result.detection_fields.Policy_ID_{index} .value |
Para cada objeto policy-id no registro bruto, extraia a política e mapeie-a para Policy_ID_{index} na UDM, em que index é o índice do objeto na matriz. |
policyName | security_result.detection_fields.policyName_label.value | Valor do campo policyName do registro bruto |
porta | target.port | Valor do campo port do registro bruto |
Privilegiado | about.labels.Privileged.value | Se Privileged for verdadeiro, mapeie como "True". Caso contrário, mapeie como "False". |
proto | network.ip_protocol | Valor do campo proto do registro bruto |
protocolo | network.ip_protocol | Se protocol for "TCP" ou "UDP", mapeie como o campo protocol do registro bruto. |
PWD | target.file.full_path | Valor do campo PWD do registro bruto |
Raw Data |
target.resource.attribute.labels.raw_Data.value | Valor do campo Raw Data do registro bruto |
raw-query | additional.fields.Raw Query .value.string_value |
Valor do campo raw-query do registro bruto |
ruleName | security_result.rule_name | Valor do campo ruleName do registro bruto |
server-group | additional.fields.serve_group_label.value.string_value | Valor do campo server-group do registro bruto |
service-name | additional.fields.service_name_label.value.string_value | Valor do campo service-name do registro bruto |
Service Type |
additional.fields.Service Type .value.string_value |
Valor do campo Service Type do registro bruto |
tamanho | network.received_bytes | Valor do campo size do registro bruto |
Stored Proc |
about.labels.Stored_Proc.value | Se Stored Proc for verdadeiro, mapeie como "True". Caso contrário, mapeie como "False". |
Table Group |
target.group.group_display_name | Valor do campo Table Group do registro bruto |
timestamp | metadata.event_timestamp | Valor do campo timestamp do registro bruto |
a | network.email.to | Remova "<" e ">" de to e mapeie para network.email.to |
USUÁRIO | principal.user.userid, target.user.userid | Se USER não estiver vazio e USER for "admin", mapeie como o campo USER do registro bruto para target.user.userid . Caso contrário, se USER não estiver vazio, mapeie como o campo USER do registro bruto para principal.user.userid . |
autenticado pelo usuário | security_result.detection_fields.user_authenticated.value | Valor do campo user-authenticated do registro bruto |
user-group | additional.fields.user_group_label.value.string_value | Valor do campo user-group do registro bruto |
nome de usuário | principal.user.user_display_name | Valor do campo username do registro bruto |
usrName | principal.user.userid | Valor do campo usrName do registro bruto |
extensions.auth.mechanism | Codificado como "USERNAME_PASSWORD" se description contiver "authentication failure" ou "check pass; user unknown" ou "Invalid user" ou "invalid user" ou se error não estiver vazio. |
|
extensions.auth.type | Codificado como "AUTHTYPE_UNSPECIFIED" se has_principal for "true", has_target for "true" e event-type for "Login" |
|
metadata.event_type | Fixado no código como "PROCESS_OPEN" se PWD não estiver vazio. Codificado como "PROCESS_OPEN" se message contiver "starting" ou application for "pman", "CROND" ou "run-parts" e event_type estiver vazio. Codificado como "NETWORK_CONNECTION" se description for "Syslog connection established", "Syslog connection broken" ou "Syslog connection failed". Codificado como "EMAIL_UNCATEGORIZED" se application for "postfix/qmgr", "postfix/local" ou "postfix/pickup". Codificado como "EMAIL_TRANSACTION" se application for "postfix/local" ou "postfix/pickup" e status for "sent (delivered to mailbox)". Codificado como "NETWORK_HTTP" se application for "sshd" e description não contiver "check pass; user unknown", "authentication failure" ou "invalid".description description Codificado como "USER_LOGIN" se description contiver "authentication failure" ou "check pass; user unknown" ou "Invalid user" ou "invalid user" ou se error não estiver vazio. Codificado como "FILE_SYNC" se file_path não estiver vazio. Codificado como "PROCESS_UNCATEGORIZED" se message contiver "reconfigure" e application for "pman". Codificado como "PROCESS_TERMINATION" se message contiver "exit code 1" e application for "pman". Codificado como "NETWORK_CONNECTION" se eventType , srcIP e dstIP não estiverem vazios. Codificado como "USER_LOGIN" se has_principal for "true", has_target for "true" e event-type for "Login". Codificado como "NETWORK_CONNECTION" se has_principal for "true", has_target for "true" e protocol não estiver vazio. Fixado no código como "STATUS_UPDATE" se has_principal for "true". Codificado como "GENERIC_EVENT" se event_type estiver vazio ou for "GENERIC_EVENT" |
|
metadata.log_type | Fixado no código como "IMPERVA_DB" | |
metadata.product_name | Fixado no código como "IMPERVA DB" | |
metadata.vendor_name | Fixado no código como "IMPERVA DB" | |
security_result.action | Codificado como "ALLOW" se description não contiver "authentication failure" ou "check pass; user unknown" ou "Invalid user" ou "invalid user" e error estiver vazio. Codificado como "BLOCK" se description contiver "authentication failure" ou "check pass; user unknown" ou "Invalid user" ou "invalid user" ou se error não estiver vazio |
|
security_result.rule_id | Se description contiver "alert_score" ou "new_alert_score", extraia o ruleid de description e mapeie para security_result.rule_id . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.