Coletar registros do Microsoft SQL Server

Compatível com:

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 do 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

  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 de 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
    

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

  1. Acesse o arquivo de configuração:
    • Localize o arquivo config.yaml. Normalmente, ele fica no diretório `C:\Program Files\observIQ\bindplane-agent` no Windows.
    • Abra o arquivo usando um editor de texto (por exemplo, nano, vi ou Bloco de Notas).
  2. Edite o arquivo config.yaml da 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 de 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 em Windows, use o console Serviços ou insira o seguinte comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Ativar a auditoria do SQL Server no log 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

  1. Abra o SQL Server Management Studio (SSMS) e conecte-se à sua instância do SQL Server.
  2. No Pesquisador de Objetos, expanda a instância do servidor.
  3. Expanda a pasta Segurança.
  4. Clique com o botão direito do mouse em Auditorias e selecione Nova auditoria.
  5. Na caixa de diálogo Criar auditoria, forneça os seguintes detalhes de configuração:
    • Nome da auditoria: insira ChronicleAudit.
    • Atraso da fila (em milissegundos): digite 1000.
    • Falha no registro de auditoria: selecione Continuar.
    • Destino da auditoria: selecione Registro de aplicativo.
  6. Clique em OK para criar a auditoria.
  7. 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

  1. No Pesquisador de objetos, expanda Segurança.
  2. Clique com o botão direito do mouse em Especificações de auditoria do servidor e selecione Nova especificação de auditoria do servidor.
  3. 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.
  4. 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
  5. Clique em OK para criar a especificação de auditoria.
  6. 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

  1. No Pesquisador de Objetos, expanda Segurança > Auditorias.
  2. Clique com o botão direito do mouse em ChronicleAudit e selecione Propriedades.
  3. Verifique se o Status aparece como Iniciado ou Ativado.
  4. Abra Segurança > Especificações de auditoria do servidor.
  5. Clique com o botão direito do mouse em ChronicleAuditSpec e selecione Propriedades.
  6. 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

  1. Abra o SQL Server Management Studio (SSMS) e conecte-se à sua instância do SQL Server.
  2. 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);
    GO
    
  3. Crie 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

  1. Faça o download do NXLog Community Edition em nxlog.co/downloads.
  2. Execute o instalador e siga todas as etapas.
  3. Abra o arquivo de configuração do NXLog em:

    C:\Program Files\nxlog\conf\nxlog.conf
    
  4. Substitua 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 udplog do Bindplane configurada anteriormente.
  5. 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 "Iniciando o banco de dados" ou "O registro foi armazenado em backup".
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 para 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 Mapeia para a 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 Corresponde ao 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 para 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 Analisados para IP e mesclados em 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. Defina como "Conexão feita usando a autenticação do Windows" ou motivos específicos dos 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 código 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.