Coletar registros do banco de dados Imperva
Este documento explica como ingerir registros do banco de dados da Imperva no Google Security Operations usando o agente do Bindplane.
O analisador extrai campos de registros formatados do syslog do banco de dados Imperva. Ele usa grok e/ou kv para analisar a mensagem de registro em log e mapeia esses valores para o modelo de dados unificado (UDM). Ele também define valores padrão de metadados para a origem e o tipo do evento. A segurança de banco de dados da Imperva oferece recursos abrangentes de monitoramento, auditoria e proteção de atividades de banco de dados.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Um host do Windows 2016 ou posterior ou do 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 do Bindplane.
- Acesso privilegiado ao console de gerenciamento do Imperva SecureSphere
Receber credenciais do Google SecOps para o agente do Bindplane
Para autenticar o agente do Bindplane no Google SecOps, escolha um dos seguintes métodos:
- Novas implantações: use a API Chronicle (opção 1).
- Implantações legadas: continue usando o arquivo de autenticação de ingestão (opção 2) até que a API Ingestion seja desativada em 20 de julho de 2027.
Opção 1: criar uma conta de serviço para a API Chronicle (recomendado)
- Faça login no consoleGoogle Cloud e selecione o projeto Google Cloud vinculado à sua instância do Google SecOps.
- Acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- Informe os seguintes detalhes de configuração:
- Nome da conta de serviço: insira um nome para a conta (por exemplo,
bindplane-ingest). - Descrição da conta de serviço: insira uma descrição (por exemplo,
Bindplane agent log ingestion).
- Nome da conta de serviço: insira um nome para a conta (por exemplo,
- Clique em Criar e continuar.
- Na seção Conceder a essa conta de serviço acesso ao projeto, clique em Selecionar uma função e escolha Editor do Chronicle.
- Clique em Continuar e depois em Concluído.
- Clique na conta de serviço que você criou e acesse a guia Chaves.
- Clique em Adicionar chave > Criar nova chave.
- Selecione JSON e clique em Criar. O download do arquivo de chave é feito no seu computador.
- Salve o arquivo de chave como
ingestion-auth.jsonno diretório do coletor do BindPlane (/opt/observiq-otel-collector/ingestion-auth.jsonno Linux ouC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonno Windows) ou atualizecreds_file_pathemconfig.yamlpara corresponder ao caminho em que você o salvou. - Acesse IAM e administrador > Configurações e copie o número do projeto. Você vai precisar dele para a configuração do exportador.
Opção 2: fazer o download do arquivo de autenticação de ingestão (legado)
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- Faça o download do arquivo de autenticação de ingestão.
- Salve o arquivo com segurança no sistema em que o agente do 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 de cliente na seção Detalhes da organização.
Instalar o agente do Bindplane
Instale o agente do Bindplane no seu 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" /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 o guia de instalação do agente do BindPlane.
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/opt/observiq-otel-collector/no Linux ou no diretório de instalação no Windows. - Abra o arquivo usando um editor de texto (por exemplo,
nano,viou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
config.yamlda seguinte forma:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' 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: chronicle.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
<LOCATION>pela região da sua instância do Google SecOps (por exemplo,us,europeouasia-southeast1). O exportador prefixachronicle.googleapis.comcom esse valor. - Substitua
<PROJECT_NUMBER>pelo número do projeto em IAM e administrador > Configurações. - Substitua
<CUSTOMER_ID>pelo ID de cliente real. - Atualize
/path/to/ingestion-authentication-file.jsonpara o caminho do arquivo em que o arquivo de chave da conta de serviço (Opção 1) foi salvo na Etapa 1.
Exportador da API de ingestão legada
Se você usar o arquivo de autenticação de ingestão da Opção 2, substitua o bloco
exporterspelo seguinte. Definacreds_file_pathcomo o caminho para o arquivo de autenticação de ingestão e, se a instância estiver fora dos EUA, substituamalachiteingestion-pa.googleapis.compelo endpoint regional (por exemplo,europe-malachiteingestion-pa.googleapis.com).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:
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-collectorPara reiniciar o agente do Bindplane no Windows, use o console Serviços ou digite o seguinte comando:
net stop observiq-otel-collector && net start observiq-otel-collector
Configurar o encaminhamento do Syslog no banco de dados 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: digite o número da porta do agente 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.
- Recurso do Syslog: selecione LOCAL0 ou o recurso apropriado.
- Interface de ação: selecione Registro do gateway - Ocorrência de segurança - Registro do sistema (syslog) - Formato JSON (estendido) para o formato SYSLOG+JSON ou Registro do gateway - Ocorrência 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 de UDM
| Campo de registro | mapeamento de 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 de fazer o mapeamento. |
| ação | security_result.action_details | Valor do campo action do registro bruto |
| alertSev | security_result.severity | Se alertSev for "Informativo", mapeie como "INFORMATIONAL". Caso contrário, mapeie como maiúsculas 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 "Auditoria do FSS", mapeie como "Auditoria do FSS". Caso contrário, mapeie como 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 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, no 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 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} no 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 campo os-user do registro bruto. Caso contrário, mapeie como 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} no 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 |
| para | 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", "check pass; user unknown", "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". Fixado no código 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", description "authentication failure" ou description "invalid". Codificado como "USER_LOGIN" se description contiver "authentication failure", "check pass; user unknown", "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". Fixado no código 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", "check pass; user unknown", "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-o para security_result.rule_id |
|
version |
metadata.product_version |
Mapeado do registro de mudanças |
source-ip |
principal.ip |
Mapeado do registro de alterações |
source-port |
principal.port |
Mapeado do registro de alterações |
server-group", "service-name", "user-group", "raw-query", "parsed-query", "bind-variables", "sql-error", "db-schema-pair.db-name", "db-schema-pair.schema-name", and "objects-list |
additional.fields |
Mapeado do registro de alterações |
source-application |
principal.application |
Mapeado do registro de alterações |
event-id |
metadata.product_log_id |
Mapeado do registro de alterações |
application-user |
principal.user.user_display_name |
Mapeado do registro de alterações |
mx-ip", "gw-ip |
intermediary.ip |
Mapeado do registro de alterações |
policy-id" and "user-authenticated |
security_result.detection_fields |
Mapeado do registro de alterações |
srcPort |
principal.port |
Mapeado do registro de alterações |
srcIP |
principal.ip |
Mapeado do registro de alterações |
event_name |
metadata.product_event_type |
Mapeado do registro de mudanças |
Registro de alterações
Ver o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.