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

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

  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 está 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 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 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

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