Recolha registos do Microsoft SQL Server
Este documento explica como carregar registos do Microsoft SQL Server para o Google Security Operations através do Bindplane. O analisador processa registos do Microsoft SQL Server estruturados (JSON, pares de chave/valor) e semiestruturados (syslog). Extrai campos, normaliza datas/horas, processa diferentes formatos de registo com base no conteúdo de SourceModuleType e Message (incluindo eventos de auditoria, início de sessão e base de dados) e mapeia-os para o UDM. Também executa uma lógica de análise específica para registos de auditoria, tentativas de início de sessão e operações de base de dados, enriquecendo os dados com contexto adicional e informações de gravidade.Recolhe registos de auditoria e de erros do SQL Server a partir do registo de eventos do Windows através de um encaminhador syslog (NXLog) e envia-os para o agente BindPlane para entrega ao Google SecOps.
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- Uma instância do Google SecOps
- Um anfitrião com o Windows Server 2016 ou posterior a executar o Microsoft SQL Server
- Acesso administrativo para instalar e configurar o agente BindPlane e o NXLog
- Se estiver a executar o agente através de um proxy, certifique-se de que as portas da firewall estão abertas de acordo com os requisitos do agente Bindplane
Obtenha o ficheiro de autenticação de carregamento do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Agentes de recolha.
- Transfira o ficheiro de autenticação de carregamento. Guarde o ficheiro de forma segura no sistema onde o Bindplane vai ser instalado.
Obtenha o ID de cliente do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Perfil.
- Copie e guarde o ID do cliente da secção Detalhes da organização.
Instale o agente do Bindplane
Instale o agente do Bindplane no seu sistema operativo Windows ou Linux de acordo com as seguintes instruções.
Instalação do Windows
- Abra a Linha de comandos ou o PowerShell como administrador.
Execute o seguinte comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Recursos de instalação adicionais
Para ver opções de instalação adicionais, consulte o guia de instalação.
Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps
- Aceda ao ficheiro de configuração:
- Localize o ficheiro
config.yaml. Normalmente, encontra-se no diretório `C:\Program Files\observIQ\bindplane-agent` no Windows. - Abra o ficheiro com um editor de texto (por exemplo,
nano,viou Bloco de notas).
- Localize o ficheiro
Edite o ficheiro
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 de cliente real. - Atualize
/path/to/ingestion-authentication-file.jsonpara o caminho onde o ficheiro de autenticação foi guardado na secção Obtenha o ficheiro de autenticação de carregamento do Google SecOps.
Reinicie o agente do Bindplane para aplicar as alterações
Para reiniciar o agente Bindplane no Windows, pode usar a consola Serviços ou introduzir o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Ative a auditoria do SQL Server no registo de eventos do Windows
Pode ativar a auditoria do SQL Server através da IU do SQL Server Management Studio (SSMS) ou de comandos T-SQL. Escolha a opção que melhor se adequa ao seu ambiente.
Opção 1: ative a auditoria do SQL Server através da GUI do SSMS
Crie uma auditoria do servidor na IU do SQL Server Management Studio
- Abra o SQL Server Management Studio (SSMS) e estabeleça ligação à sua instância do SQL Server.
- No Object Explorer, expanda a instância do servidor.
- Expanda a pasta Segurança.
- Clique com o botão direito do rato em Auditorias e selecione Nova auditoria.
- Na caixa de diálogo Criar auditoria, indique os seguintes detalhes de configuração:
- Nome da auditoria: introduza
ChronicleAudit. - Atraso da fila (em milissegundos): introduza
1000. - Em caso de falha do registo de auditoria: selecione Continuar.
- Destino da auditoria: selecione Registo de aplicações.
- Nome da auditoria: introduza
- Clique em OK para criar a auditoria.
- No Object Explorer, clique com o botão direito do rato em ChronicleAudit recém-criado e selecione Enable Audit.
Crie uma especificação de auditoria do servidor através da GUI do SSMS
- No Explorador de objetos, expanda Segurança.
- Clique com o botão direito do rato em Server Audit Specifications e selecione New Server Audit Specification.
- Na caixa de diálogo Criar especificação de auditoria do servidor, indique os seguintes detalhes de configuração:
- Nome: introduza
ChronicleAuditSpec. - Auditoria: selecione ChronicleAudit no menu.
- Nome: introduza
- Na secçã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 após 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 Object Explorer, clique com o botão direito do rato no ChronicleAuditSpec recém-criado e selecione Enable Server Audit Specification.
Valide a configuração de auditoria
- No Explorador de objetos, expanda Segurança > Auditorias.
- Clique com o botão direito do rato em ChronicleAudit e selecione Propriedades.
- Verifique se o Estado é apresentado como Iniciado ou Ativado.
- Expanda Segurança > Especificações de auditoria do servidor.
- Clique com o botão direito do rato 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: ative a auditoria do SQL Server com o T-SQL
- Abra o SQL Server Management Studio (SSMS) e estabeleça ligação à sua instância do SQL Server.
Execute os seguintes comandos T-SQL para criar uma auditoria do servidor que escreve no registo de aplicações 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
Esta configuração garante que os eventos de autenticação, as alterações de autorizações e as modificações de objetos são registados no registo de eventos do Windows.
Instale e configure o NXLog para encaminhar eventos para o Bindplane
- Transfira o NXLog Community Edition a partir de nxlog.co/downloads.
- Execute o instalador e conclua o assistente de instalação.
Abra o ficheiro de configuração do NXLog localizado 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 do Anfitrião
127.0.0.1pelo endereço IP do agente Bindplane. - Certifique-se de que o valor de Port corresponde à porta do recetor do Bindplane
udplogconfigurada anteriormente.
- Substitua o valor atual do Anfitrião
Guarde o ficheiro e reinicie o serviço NXLog:
net stop nxlog && net start nxlog
Tabela de mapeamento da UDM
| Campo de registo | Mapeamento de UDM | Lógica |
|---|---|---|
AccountName |
principal.user.userid |
Usado para principal.user.userid se estiver presente em registos 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 anfitrião 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 |
Mapeamentos para a versão da plataforma do observador. |
ApplicationName |
principal.application |
Mapeia para a aplicação principal. |
application_name |
target.application |
Mapeia a aplicação de destino. |
client_address |
principal.ip |
Usado para o IP principal, se for diferente do anfitrião e não for um canal local ou denominado. |
client_ip |
principal.ip |
Mapeia para o IP principal. |
computer_name |
about.hostname |
Mapeia para o nome do anfitrião. |
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 a data/hora do evento. |
database_name |
target.resource_ancestors.name |
Usado para o nome do recurso principal de destino, se estiver presente nos registos de auditoria. |
durationMs |
network.session_duration.seconds |
Convertido de milissegundos para segundos e mapeado. |
ecs.version |
metadata.product_version |
Mapeamento para a 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 criar o tipo de evento de produto se outros campos não estiverem disponíveis, com o prefixo "EventID: ". |
event.action |
Source |
Usado como origem, se estiver 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 data/hora carregada. |
event_time |
metadata.event_timestamp |
Analisado e usado como data/hora do evento. |
file_name |
principal.process.file.full_path |
Mapeia o caminho completo do ficheiro do processo principal. |
file_path |
target.file.full_path |
Usado para o caminho completo do ficheiro de destino, se encontrado nos registos de cópias de segurança. |
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 anfitrião principal ou observador, se não for um IP. Também usado para o nome de anfitrião ou o IP de destino, consoante se for um IP ou não. |
host.ip |
principal.ip |
Unido ao IP principal. |
host.name |
host |
Usado como anfitrião, se estiver presente. |
Hostname |
principal.hostname, target.hostname |
Usado para o nome de anfitrião principal ou 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 |
Mapeamentos 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 "Last LSN". |
level |
security_result.severity |
Se for "Informacional", define security_result.severity como "INFORMATIONAL". |
log.level |
security_result.severity_details |
Mapeia os detalhes da gravidade do resultado de segurança. |
LoginName |
principal.user.userid |
Usado para o ID do utilizador principal, se estiver presente nos registos 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 utilizador principal, se estiver presente nos registos de início de sessão. |
logstash.process.host |
intermediary.hostname |
Mapeia para o nome do anfitrião intermediário. |
Message |
metadata.description, security_result.description |
Usado para a descrição do evento ou a descrição do resultado de segurança, consoante o tipo de registo. |
msg |
metadata.description |
Usado para a descrição do evento, se estiver 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 estiver presente nos registos de auditoria. |
ObjectType |
target.resource.type |
Mapeia 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 do 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 |
Mapeamento para a 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 os 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 PI e unido à PI principal e à PI do recurso principal. |
properties.location |
principal.location.name |
Mapeia para o nome da localização 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 |
Mapeia para o ID do registo 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 em 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 utilizador 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 implementaçã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 agente do utilizador HTTP de rede. |
properties.userId |
principal.user.userid |
Usado para o ID do utilizador principal, se estiver 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 início de sessão. |
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 de ancestral do recurso de destino, se estiver presente nos registos de auditoria. |
security_result.description |
metadata.description |
Usado para a 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 registos 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 "Ligação estabelecida através da autenticação do Windows" ou motivos específicos de eventos de início de sessão, ou "Registo de auditoria do SQL Server" para eventos de auditoria. |
security_result_action |
security_result.action |
Unido a security_result.action. Definido como "ALLOW" para a maioria dos eventos e derivado de login_result para eventos de início de sessão. |
server_instance_name |
target.hostname |
Usado para o nome de anfitrião de destino, se estiver presente nos registos de auditoria. |
server_principal_name |
principal.user.userid |
Usado para o ID do utilizador principal, se estiver presente nos registos de auditoria. |
server_principal_sid |
principal.asset_id |
Usado para criar 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 estiver presente nos registos 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 |
Mapeamentos para a aplicação observadora. |
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 |
Mapeamentos para a aplicação observadora. |
SPID |
network.session_id |
Mapeia para o ID da sessão de rede. |
statement |
target.process.command_line |
Usado para a linha de comandos do processo de destino, se estiver presente nos registos de auditoria. |
TextData |
security_result.description, metadata.description |
Usado para a descrição do resultado de segurança se não for um evento de início de sessão ou a descrição do evento se for. |
time |
metadata.event_timestamp |
Analisado e usado como data/hora do evento. |
Time |
metadata.event_timestamp |
Combinado com Date para criar a 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 utilizador principal, se estiver presente e no formato correto. |
user_id |
principal.user.userid |
Usado para o ID do utilizador principal, se estiver presente. |
metadata.log_type |
metadata.log_type |
Codificado de forma rígida como "MICROSOFT_SQL". |
metadata.vendor_name |
metadata.vendor_name |
Codificado de forma rígida para "Microsoft". |
metadata.product_name |
metadata.product_name |
Codificado de forma rígida para "SQL Server". |
metadata.event_type |
metadata.event_type |
Definido para vários valores consoante o conteúdo do registo, incluindo "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" e "STATUS_UNCATEGORIZED" como predefinição. |
extensions.auth.type |
extensions.auth.type |
Definido como "MACHINE" para eventos de início e fim de sessão. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.