Coletar registros do Microsoft SQL Server
Este documento explica como ingerir registros do Microsoft SQL Server no Google Security Operations usando o Bindplane. O analisador processa registros estruturados (JSON, pares de chave-valor) e semiestruturados (syslog) do Microsoft SQL Server. Ele extrai campos, normaliza carimbos de data/hora, processa diferentes formatos de registro com base no conteúdo de SourceModuleType e Message (incluindo eventos de auditoria, login e banco de dados) e os mapeia para a UDM. Ele também realiza uma lógica de análise específica para registros de auditoria, tentativas de login e operações de banco de dados, enriquecendo os dados com mais contexto e informações de gravidade.Coleta registros de auditoria e de erros do SQL Server no registro de eventos do Windows usando um encaminhador de syslog (NXLog) e os envia ao agente do BindPlane para entrega ao Google SecOps.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Um host do Windows Server 2016 ou mais recente executando o Microsoft SQL Server
- Acesso administrativo para instalar e configurar o agente do BindPlane e o NXLog
- 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.
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" /quiet
Outros recursos de instalação
Para mais opções de instalação, consulte o 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 está no diretório "C:\Program Files\observIQ\bindplane-agent" 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:1514" 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: <YOUR_CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'MICROSOFT_SQL' 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.jsonpara 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 Windows, use o console Serviços ou insira o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Ativar a auditoria do SQL Server no registro de eventos do Windows
É possível ativar a auditoria do SQL Server usando a GUI do SQL Server Management Studio (SSMS) ou comandos T-SQL. Escolha a opção mais adequada ao seu ambiente.
Opção 1: ativar a auditoria do SQL Server pela GUI do SSMS
Criar uma auditoria do servidor na interface do SQL Server Management Studio
- Abra o SQL Server Management Studio (SSMS) e conecte-se à sua instância do SQL Server.
- Em Pesquisador de Objetos, expanda a instância do servidor.
- Expanda a pasta Segurança.
- Clique com o botão direito do mouse em Auditorias e selecione Nova auditoria.
- Na caixa de diálogo Criar auditoria, forneça os seguintes detalhes de configuração:
- Nome da auditoria: insira
ChronicleAudit. - Atraso na fila (em milissegundos): digite
1000. - Falha no registro de auditoria: selecione Continuar.
- Destino da auditoria: selecione Registro de aplicativo.
- Nome da auditoria: insira
- Clique em OK para criar a auditoria.
- No Pesquisador de objetos, clique com o botão direito do mouse em ChronicleAudit e selecione Ativar auditoria.
Criar especificação de auditoria do servidor usando a GUI do SSMS
- Em Pesquisador de Objetos, expanda Segurança.
- Clique com o botão direito do mouse em Especificações de auditoria do servidor e selecione Nova especificação de auditoria do servidor.
- Na caixa de diálogo Criar especificação de auditoria do servidor, forneça os seguintes detalhes de configuração:
- Nome: insira
ChronicleAuditSpec. - Auditoria: selecione ChronicleAudit no menu.
- Nome: insira
- Na seção Tipo de ação de auditoria, clique em Adicionar e selecione os seguintes grupos de ações de auditoria. Adicione cada um individualmente clicando em Adicionar depois de selecionar cada um:
- FAILED_LOGIN_GROUP
- SUCCESSFUL_LOGIN_GROUP
- LOGOUT_GROUP
- SERVER_ROLE_MEMBER_CHANGE_GROUP
- DATABASE_OBJECT_CHANGE_GROUP
- DATABASE_PRINCIPAL_CHANGE_GROUP
- SCHEMA_OBJECT_CHANGE_GROUP
- DATABASE_PERMISSION_CHANGE_GROUP
- Clique em OK para criar a especificação de auditoria.
- No Pesquisador de objetos, clique com o botão direito do mouse no ChronicleAuditSpec recém-criado e selecione Ativar especificação de auditoria do servidor.
Verificar a configuração de auditoria
- No Pesquisador de Objetos, expanda Segurança > Auditorias.
- Clique com o botão direito do mouse em ChronicleAudit e selecione Propriedades.
- Verifique se o Status aparece como Iniciado ou Ativado.
- Abra Segurança > Especificações de auditoria do servidor.
- Clique com o botão direito do mouse em ChronicleAuditSpec e selecione Propriedades.
- Verifique se todos os oito grupos de ações de auditoria estão listados e se a especificação está ativada.
Opção 2: ativar a auditoria do SQL Server usando T-SQL
- Abra o SQL Server Management Studio (SSMS) e conecte-se à sua instância do SQL Server.
Execute os seguintes comandos T-SQL para criar uma auditoria do servidor que grava no log de aplicativos do Windows:
USE master; GO CREATE SERVER AUDIT ChronicleAudit TO APPLICATION_LOG WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE); GO ALTER SERVER AUDIT ChronicleAudit WITH (STATE = ON); GOCrie uma especificação de auditoria para capturar eventos de segurança relevantes:
CREATE SERVER AUDIT SPECIFICATION ChronicleAuditSpec FOR SERVER AUDIT ChronicleAudit ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP), ADD (LOGOUT_GROUP), ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP), ADD (DATABASE_OBJECT_CHANGE_GROUP), ADD (DATABASE_PRINCIPAL_CHANGE_GROUP), ADD (SCHEMA_OBJECT_CHANGE_GROUP), ADD (DATABASE_PERMISSION_CHANGE_GROUP); GO ALTER SERVER AUDIT SPECIFICATION ChronicleAuditSpec WITH (STATE = ON); GO
Essa configuração garante que eventos de autenticação, mudanças de permissão e modificações de objetos sejam registrados no log de eventos do Windows.
Instalar e configurar o NXLog para encaminhar eventos ao Bindplane
- Faça o download do NXLog Community Edition em nxlog.co/downloads.
- Execute o instalador e siga todas as etapas.
Abra o arquivo de configuração do NXLog em:
C:\Program Files\nxlog\conf\nxlog.confSubstitua o conteúdo pela seguinte configuração:
define ROOT C:\Program Files\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Extension _json> Module xm_json </Extension> <Input in_eventlog> Module im_msvistalog Query <QueryList>\ <Query Id="0">\ <Select Path="Application">*[System[Provider[@Name='MSSQLSERVER']]]</Select>\ </Query>\ </QueryList> </Input> <Output out_syslog> Module om_udp Host 127.0.0.1 Port 1514 Exec to_json(); </Output> <Route r1> Path in_eventlog => out_syslog </Route>- Substitua o valor atual de Host,
127.0.0.1, pelo endereço IP do agente do Bindplane. - Verifique se o valor Port corresponde à porta do receptor
udplogdo Bindplane configurada anteriormente.
- Substitua o valor atual de Host,
Salve o arquivo e reinicie o serviço NXLog:
net stop nxlog && net start nxlog
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
AccountName |
principal.user.userid |
Usado para principal.user.userid se estiver presente em registros como "Starting up database" ou "Log was backed up". |
AgentDevice |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "AgentDevice". |
AgentLogFile |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "AgentLogFile". |
agent.hostname |
observer.asset.hostname |
Mapeia para o nome do host do observador. |
agent.id |
observer.asset_id |
Concatenado com agent.type para formar observer.asset_id. |
agent.type |
observer.asset_id |
Concatenado com agent.id para formar observer.asset_id. |
agent.version |
observer.platform_version |
Mapeia para a versão da plataforma do observador. |
ApplicationName |
principal.application |
Mapeia para o aplicativo principal. |
application_name |
target.application |
Mapeia o aplicativo de destino. |
client_address |
principal.ip |
Usado para o IP principal se for diferente do host e não for local ou um pipe nomeado. |
client_ip |
principal.ip |
Mapeia para o IP principal. |
computer_name |
about.hostname |
Mapeia para "Sobre o nome do host". |
correlationId |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "correlationId". |
Date |
metadata.event_timestamp |
Combinado com Time para criar o carimbo de data/hora do evento. |
database_name |
target.resource_ancestors.name |
Usado para o nome do ancestral do recurso de destino, se presente nos registros de auditoria. |
durationMs |
network.session_duration.seconds |
Convertido de milissegundos para segundos e mapeado. |
ecs.version |
metadata.product_version |
Corresponde à versão do produto. |
error |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "error". |
err_msg |
security_result.description |
Corresponde à descrição do resultado de segurança. |
EventID |
metadata.product_event_type |
Usado para construir o tipo de evento de produto se outros campos não estiverem disponíveis, com o prefixo "EventID: ". |
event.action |
Source |
Usado como fonte, se presente. |
event.code |
metadata.product_event_type |
Combinado com event.provider para formar metadata.product_event_type. |
event.provider |
metadata.product_event_type |
Combinado com event.code para formar metadata.product_event_type. |
EventReceivedTime |
metadata.ingested_timestamp |
Analisado e usado como carimbo de data/hora ingerido. |
event_time |
metadata.event_timestamp |
Analisado e usado como carimbo de data/hora do evento. |
file_name |
principal.process.file.full_path |
Mapeia para o caminho completo do arquivo do processo principal. |
file_path |
target.file.full_path |
Usado para o caminho completo do arquivo de destino, se encontrado nos registros de backup. |
first_lsn |
target.resource.attribute.labels |
Adicionado como um par de chave-valor a target.resource.attribute.labels com a chave "First LSN". |
host |
principal.hostname, observer.hostname |
Usado para o nome do host principal ou do observador, se não for um IP. Também usado para nome do host ou IP de destino, dependendo se é um IP ou não. |
host.ip |
principal.ip |
Mesclado ao IP principal. |
host.name |
host |
Usado como host, se presente. |
Hostname |
principal.hostname, target.hostname |
Usado para o principal ou o nome do host de destino, se presente. |
hostinfo.architecture |
principal.asset.hardware.cpu_platform |
Mapeia para a plataforma de CPU do hardware do recurso principal. |
hostinfo.os.build |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "os_build". |
hostinfo.os.kernel |
principal.platform_patch_level |
Mapeia para o nível de patch da plataforma principal. |
hostinfo.os.name |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "os_name". |
hostinfo.os.platform |
principal.platform |
Em maiúsculas e mapeado para a plataforma principal. |
hostinfo.os.version |
principal.platform_version |
Mapeia para a versão principal da plataforma. |
last_lsn |
target.resource.attribute.labels |
Adicionado como um par de chave-valor a target.resource.attribute.labels com a chave "Último LSN". |
level |
security_result.severity |
Se for "Informativo", define security_result.severity como "INFORMATIONAL". |
log.level |
security_result.severity_details |
Mapeia para detalhes de gravidade do resultado de segurança. |
LoginName |
principal.user.userid |
Usado para o ID do usuário principal, se presente nos registros de KV. |
login_result |
security_result.action |
Determina a ação do resultado de segurança (ALLOW ou BLOCK). |
logon_user |
principal.user.userid |
Usado para o ID do usuário principal, se presente nos registros de login. |
logstash.process.host |
intermediary.hostname |
Mapeia para o nome do host intermediário. |
Message |
metadata.description, security_result.description |
Usado para descrição de eventos ou de resultados de segurança, dependendo do tipo de registro. |
msg |
metadata.description |
Usado para a descrição do evento, se presente. |
ObjectName |
target.resource.name |
Mapeia para o nome do recurso de destino. |
object_name |
target.resource.name |
Usado para o nome do recurso de destino, se presente nos registros de auditoria. |
ObjectType |
target.resource.type |
Mapeia para o tipo de recurso de destino. |
operationId |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "operationId". |
operationName |
metadata.product_event_type |
Mapeia para o tipo de evento de produto. |
operationVersion |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "operationVersion". |
ProcessInfo |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "ProcessInfo". |
properties.apiVersion |
metadata.product_version |
Corresponde à versão do produto. |
properties.appId |
target.resource.product_object_id |
Mapeia para o ID do objeto do produto do recurso de destino. |
properties.clientAuthMethod |
extensions.auth.auth_details |
Usado para determinar detalhes de autenticação. |
properties.clientRequestId |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "clientRequestId". |
properties.durationMs |
network.session_duration.seconds |
Convertido em segundos e mapeado. |
properties.identityProvider |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "identityProvider". |
properties.ipAddress |
principal.ip, principal.asset.ip |
Analisado para IP e mesclado com IP principal e IP do recurso principal. |
properties.location |
principal.location.name |
Mapeia para o nome do local principal. |
properties.operationId |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "operationId". |
properties.requestId |
metadata.product_log_id |
Corresponde ao ID do registro do produto. |
properties.requestMethod |
network.http.method |
Mapeia para o método HTTP de rede. |
properties.requestUri |
target.url |
Mapeia para o URL de destino. |
properties.responseSizeBytes |
network.received_bytes |
Convertido para número inteiro sem sinal e mapeado. |
properties.responseStatusCode |
network.http.response_code |
Convertido para número inteiro e mapeado. |
properties.roles |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "roles". |
properties.servicePrincipalId |
principal.user.userid |
Usado para o ID do usuário principal se properties.userId não estiver presente. |
properties.signInActivityId |
network.session_id |
Mapeia para o ID da sessão de rede. |
properties.tenantId |
metadata.product_deployment_id |
Mapeia para o ID de implantação do produto. |
properties.tokenIssuedAt |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "tokenIssuedAt". |
properties.userAgent |
network.http.user_agent |
Mapeia para o user agent HTTP de rede. |
properties.userId |
principal.user.userid |
Usado para o ID do usuário principal, se presente. |
properties.wids |
security_result.detection_fields |
Adicionado como um par de chave-valor a security_result.detection_fields com a chave "wids". |
reason |
security_result.summary |
Usado para o resumo dos resultados de segurança em eventos de login. |
resourceId |
target.resource.attribute.labels |
Adicionado como um par de chave-valor a target.resource.attribute.labels com a chave "ID do recurso". |
schema_name |
target.resource_ancestors.resource_subtype |
Usado para o subtipo ancestral do recurso de destino, se presente nos registros de auditoria. |
security_result.description |
metadata.description |
Usado para descrição do evento, se não for um evento de auditoria. |
security_result.severity |
security_result.severity |
Mapeia diretamente se estiver presente. Definido como "LOW" para registros de KV, "INFORMATIONAL" para determinadas mensagens de erro e derivado dos campos level ou Severity. |
security_result.severity_details |
security_result.severity_details |
Mapeia diretamente se estiver presente. |
security_result.summary |
security_result.summary |
Mapeia diretamente se estiver presente. Definido como "Conexão feita usando a autenticação do Windows" ou motivos específicos de eventos de login ou "Registro de auditoria do SQL Server" para eventos de auditoria. |
security_result_action |
security_result.action |
Mesclado em security_result.action. Definido como "ALLOW" para a maioria dos eventos e derivado de login_result para eventos de login. |
server_instance_name |
target.hostname |
Usado para o nome do host de destino, se presente nos registros de auditoria. |
server_principal_name |
principal.user.userid |
Usado para o ID do usuário principal, se presente nos registros de auditoria. |
server_principal_sid |
principal.asset_id |
Usado para construir o ID do recurso principal, com o prefixo "server SID:". |
session_id |
network.session_id |
Usado para o ID da sessão de rede, se presente nos registros de auditoria. |
sev |
security_result.severity |
Usado para determinar a gravidade do resultado de segurança. |
Severity |
security_result.severity |
Usado para determinar a gravidade do resultado de segurança. |
Source |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "Source". |
source |
principal.resource.attribute.labels |
Adicionado como um par de chave-valor a principal.resource.attribute.labels com a chave "source". |
SourceModuleType |
observer.application |
Mapeia para o aplicativo observador. |
SourceModuleName |
additional.fields |
Adicionado como um par de chave-valor a additional.fields com a chave "SourceModuleName". |
source_module_name |
observer.labels |
Adicionado como um par de chave-valor a observer.labels com a chave "SourceModuleName". |
source_module_type |
observer.application |
Mapeia para o aplicativo observador. |
SPID |
network.session_id |
Mapeia para o ID da sessão de rede. |
statement |
target.process.command_line |
Usado para a linha de comando do processo de destino, se presente nos registros de auditoria. |
TextData |
security_result.description, metadata.description |
Usado para descrição do resultado de segurança se não for um evento de login ou descrição do evento se for. |
time |
metadata.event_timestamp |
Analisado e usado como carimbo de data/hora do evento. |
Time |
metadata.event_timestamp |
Combinado com Date para criar o carimbo de data/hora do evento. |
transaction_id |
target.resource.attribute.labels |
Adicionado como um par de chave-valor a target.resource.attribute.labels com a chave "transaction_id". |
UserID |
principal.user.windows_sid |
Usado para o SID do Windows do usuário principal, se presente e no formato correto. |
user_id |
principal.user.userid |
Usado para o ID do usuário principal, se presente. |
metadata.log_type |
metadata.log_type |
Fixado no código como "MICROSOFT_SQL". |
metadata.vendor_name |
metadata.vendor_name |
Fixado no código como "Microsoft". |
metadata.product_name |
metadata.product_name |
Codificado como "SQL Server". |
metadata.event_type |
metadata.event_type |
Definido como vários valores, dependendo do conteúdo do registro, incluindo "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" e "STATUS_UNCATEGORIZED" como padrão. |
extensions.auth.type |
extensions.auth.type |
Definido como "MACHINE" para eventos de login e logout. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.