Raccogliere i log di Microsoft SQL Server
Questo documento spiega come importare i log di Microsoft SQL Server in Google Security Operations utilizzando Bindplane. Il parser gestisce i log di Microsoft SQL Server strutturati (JSON, coppie chiave-valore) e semi-strutturati (syslog). Estrae i campi, normalizza i timestamp, gestisce diversi formati di log in base ai contenuti di SourceModuleType e Message (inclusi eventi di controllo, accesso e database) e li mappa all'UDM. Esegue inoltre una logica di analisi specifica per i record di controllo, i tentativi di accesso e le operazioni sul database, arricchendo i dati con informazioni aggiuntive su contesto e gravità.Raccoglie i log di controllo e di errore di SQL Server dal log eventi di Windows utilizzando un programma di inoltro syslog (NXLog) e li invia all'agente BindPlane per la distribuzione a Google SecOps.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Un host Windows Server 2016 o versioni successive che esegue Microsoft SQL Server
- Accesso amministrativo per installare e configurare BindPlane Agent e NXLog
- Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
Recuperare il file di autenticazione importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane.
Recuperare l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
- Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.
Installa l'agente Bindplane
Installa l'agente Bindplane sul sistema operativo Windows o Linux seguendo le istruzioni riportate di seguito.
Installazione di Windows
- Apri il prompt dei comandi o PowerShell come amministratore.
Esegui questo comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione, consulta la guida all'installazione.
Configura l'agente Bindplane per importare Syslog e inviarlo a Google SecOps
- Accedi al file di configurazione:
- Individua il file
config.yaml. In genere, si trova nella directory `C:\Programmi\observIQ\bindplane-agent` su Windows. - Apri il file utilizzando un editor di testo (ad esempio
nano,vio Blocco note).
- Individua il file
Modifica il file
config.yamlcome segue: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- Sostituisci la porta e l'indirizzo IP in base alle esigenze della tua infrastruttura.
- Sostituisci
<customer_id>con l'ID cliente effettivo. - Aggiorna
/path/to/ingestion-authentication-file.jsonal percorso in cui è stato salvato il file di autenticazione nella sezione Recupera il file di autenticazione per l'importazione di Google SecOps.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Abilita audit SQL Server nel registro eventi di Windows
Puoi abilitare SQL Server Audit utilizzando la GUI di SQL Server Management Studio (SSMS) o i comandi T-SQL. Scegli l'opzione più adatta al tuo ambiente.
Opzione 1: abilita audit SQL Server tramite la GUI di SSMS
Crea un audit del server nell'interfaccia utente di SQL Server Management Studio
- Apri SQL Server Management Studio (SSMS) e connettiti alla tua istanza SQL Server.
- In Esplora oggetti, espandi l'istanza del server.
- Espandi la cartella Sicurezza.
- Fai clic con il tasto destro del mouse su Controlli e seleziona Nuovo controllo.
- Nella finestra di dialogo Crea controllo, fornisci i seguenti dettagli di configurazione:
- Nome del controllo: inserisci
ChronicleAudit. - Ritardo della coda (in millisecondi): inserisci
1000. - In caso di errore del log di controllo: seleziona Continua.
- Destinazione audit: seleziona Log applicazioni.
- Nome del controllo: inserisci
- Fai clic su Ok per creare il controllo.
- In Esplora oggetti, fai clic con il tasto destro del mouse su ChronicleAudit appena creato e seleziona Attiva controllo.
Crea la specifica di controllo del server tramite la GUI di SSMS
- In Esplora oggetti, espandi Sicurezza.
- Fai clic con il tasto destro del mouse su Server Audit Specifications (Specifiche di controllo del server) e seleziona New Server Audit Specification (Nuova specifica di controllo del server).
- Nella finestra di dialogo Crea specifica di controllo del server, fornisci i seguenti dettagli di configurazione:
- Nome: inserisci
ChronicleAuditSpec. - Controllo: seleziona ChronicleAudit dal menu.
- Nome: inserisci
- Nella sezione Tipo di azione di controllo, fai clic su Aggiungi e seleziona i seguenti gruppi di azioni di controllo (aggiungi ciascuno singolarmente facendo clic su Aggiungi dopo aver selezionato ciascuno):
- 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
- Fai clic su Ok per creare la specifica di controllo.
- In Esplora oggetti, fai clic con il tasto destro del mouse su ChronicleAuditSpec appena creato e seleziona Abilita specifica di controllo server.
Verificare la configurazione dell'audit
- In Esplora oggetti, espandi Sicurezza > Controlli.
- Fai clic con il tasto destro del mouse su ChronicleAudit e seleziona Proprietà.
- Verifica che lo Stato sia Avviato o Attivato.
- Espandi Sicurezza > Specifiche di controllo del server.
- Fai clic con il tasto destro del mouse su ChronicleAuditSpec e seleziona Proprietà.
- Verifica che siano elencati tutti gli otto gruppi di azioni di controllo e che la specifica sia abilitata.
Opzione 2: abilita l'audit SQL Server utilizzando T-SQL
- Apri SQL Server Management Studio (SSMS) e connettiti alla tua istanza SQL Server.
Esegui i seguenti comandi T-SQL per creare un audit del server che scrive nel log applicazioni di 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); GOCrea una specifica di controllo per acquisire gli eventi di sicurezza pertinenti:
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
Questa configurazione garantisce che gli eventi di autenticazione, le modifiche alle autorizzazioni e le modifiche agli oggetti vengano registrati nel log eventi di Windows.
Installa e configura NXLog per inoltrare gli eventi a Bindplane
- Scarica NXLog Community Edition da nxlog.co/downloads.
- Esegui il programma di installazione e completa la procedura guidata di installazione.
Apri il file di configurazione NXLog che si trova in:
C:\Program Files\nxlog\conf\nxlog.confSostituisci i contenuti con la seguente configurazione:
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>- Sostituisci il valore corrente
127.0.0.1di Host con l'indirizzo IP dell'agente Bindplane. - Assicurati che il valore Porta corrisponda alla porta del ricevitore Bindplane
udplogconfigurata in precedenza.
- Sostituisci il valore corrente
Salva il file e riavvia il servizio NXLog:
net stop nxlog && net start nxlog
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
AccountName |
principal.user.userid |
Utilizzato per principal.user.userid se presente nei log come Avvio del database o Backup del log. |
AgentDevice |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "AgentDevice". |
AgentLogFile |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "AgentLogFile". |
agent.hostname |
observer.asset.hostname |
Mappa il nome host dell'osservatore. |
agent.id |
observer.asset_id |
Concatenato con agent.type per formare observer.asset_id. |
agent.type |
observer.asset_id |
Concatenato con agent.id per formare observer.asset_id. |
agent.version |
observer.platform_version |
Mappa la versione della piattaforma dell'osservatore. |
ApplicationName |
principal.application |
Mappa all'applicazione principale. |
application_name |
target.application |
Mappa all'applicazione di destinazione. |
client_address |
principal.ip |
Utilizzato per l'IP principale se diverso dall'host e non locale o named pipe. |
client_ip |
principal.ip |
Mappa l'IP entità. |
computer_name |
about.hostname |
Maps to about hostname. |
correlationId |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "correlationId". |
Date |
metadata.event_timestamp |
Combinato con Time per creare il timestamp dell'evento. |
database_name |
target.resource_ancestors.name |
Utilizzato per il nome dell'antenato della risorsa di destinazione, se presente nei log di controllo. |
durationMs |
network.session_duration.seconds |
Convertito da millisecondi a secondi e mappato. |
ecs.version |
metadata.product_version |
Maps alla versione del prodotto. |
error |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "error". |
err_msg |
security_result.description |
Mappa alla descrizione del risultato di sicurezza. |
EventID |
metadata.product_event_type |
Utilizzato per creare il tipo di evento prodotto se altri campi non sono disponibili, con il prefisso "EventID: ". |
event.action |
Source |
Utilizzata come origine, se presente. |
event.code |
metadata.product_event_type |
Combinato con event.provider per formare metadata.product_event_type. |
event.provider |
metadata.product_event_type |
Combinato con event.code per formare metadata.product_event_type. |
EventReceivedTime |
metadata.ingested_timestamp |
Analizzato e utilizzato come timestamp inserito. |
event_time |
metadata.event_timestamp |
Analizzato e utilizzato come timestamp dell'evento. |
file_name |
principal.process.file.full_path |
Mappa il percorso completo del file di processo principale. |
file_path |
target.file.full_path |
Utilizzato per il percorso completo del file di destinazione se trovato nei log di backup. |
first_lsn |
target.resource.attribute.labels |
Aggiunto come coppia chiave-valore a target.resource.attribute.labels con la chiave "First LSN". |
host |
principal.hostname, observer.hostname |
Utilizzato per il nome host del principale o dell'osservatore se non è un IP. Utilizzato anche per il nome host o l'IP di destinazione, a seconda che si tratti di un IP o meno. |
host.ip |
principal.ip |
Unito all'IP entità. |
host.name |
host |
Utilizzato come host, se presente. |
Hostname |
principal.hostname, target.hostname |
Utilizzato per l'hostname principale o di destinazione, se presente. |
hostinfo.architecture |
principal.asset.hardware.cpu_platform |
Mappe alla piattaforma CPU dell'hardware dell'asset principale. |
hostinfo.os.build |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "os_build". |
hostinfo.os.kernel |
principal.platform_patch_level |
Mappa il livello di patch della piattaforma principale. |
hostinfo.os.name |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "os_name". |
hostinfo.os.platform |
principal.platform |
In maiuscolo e mappato alla piattaforma principale. |
hostinfo.os.version |
principal.platform_version |
Mappa alla versione della piattaforma principale. |
last_lsn |
target.resource.attribute.labels |
Aggiunto come coppia chiave-valore a target.resource.attribute.labels con la chiave "Last LSN". |
level |
security_result.severity |
Se "Informational", imposta security_result.severity su "INFORMATIONAL". |
log.level |
security_result.severity_details |
Mappature ai dettagli di gravità dei risultati di sicurezza. |
LoginName |
principal.user.userid |
Utilizzato per l'ID utente principale, se presente nei log KV. |
login_result |
security_result.action |
Determina l'azione del risultato di sicurezza (ALLOW o BLOCK). |
logon_user |
principal.user.userid |
Utilizzato per l'ID utente principale, se presente nei log di accesso. |
logstash.process.host |
intermediary.hostname |
Mappa al nome host intermedio. |
Message |
metadata.description, security_result.description |
Utilizzato per la descrizione dell'evento o del risultato di sicurezza a seconda del tipo di log. |
msg |
metadata.description |
Utilizzato per la descrizione dell'evento, se presente. |
ObjectName |
target.resource.name |
Mappa al nome della risorsa di destinazione. |
object_name |
target.resource.name |
Utilizzato per il nome della risorsa di destinazione, se presente nei log di controllo. |
ObjectType |
target.resource.type |
Mappa il tipo di risorsa di destinazione. |
operationId |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "operationId". |
operationName |
metadata.product_event_type |
Mappa al tipo di evento prodotto. |
operationVersion |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "operationVersion". |
ProcessInfo |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "ProcessInfo". |
properties.apiVersion |
metadata.product_version |
Maps alla versione del prodotto. |
properties.appId |
target.resource.product_object_id |
Corrisponde all'ID oggetto prodotto della risorsa di destinazione. |
properties.clientAuthMethod |
extensions.auth.auth_details |
Utilizzato per determinare i dettagli di autenticazione. |
properties.clientRequestId |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "clientRequestId". |
properties.durationMs |
network.session_duration.seconds |
Convertito in secondi e mappato. |
properties.identityProvider |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "identityProvider". |
properties.ipAddress |
principal.ip, principal.asset.ip |
Analizzato per l'IP e unito all'IP principale e all'IP della risorsa principale. |
properties.location |
principal.location.name |
Mappe al nome della sede principale. |
properties.operationId |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "operationId". |
properties.requestId |
metadata.product_log_id |
Corrisponde all'ID log prodotto. |
properties.requestMethod |
network.http.method |
Mappa il metodo HTTP di rete. |
properties.requestUri |
target.url |
Mappa l'URL di destinazione. |
properties.responseSizeBytes |
network.received_bytes |
Convertito in numero intero senza segno e mappato. |
properties.responseStatusCode |
network.http.response_code |
Convertito in numero intero e mappato. |
properties.roles |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "roles". |
properties.servicePrincipalId |
principal.user.userid |
Utilizzato per l'ID utente principale se properties.userId non è presente. |
properties.signInActivityId |
network.session_id |
Corrisponde all'ID sessione di rete. |
properties.tenantId |
metadata.product_deployment_id |
Corrisponde all'ID di implementazione del prodotto. |
properties.tokenIssuedAt |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "tokenIssuedAt". |
properties.userAgent |
network.http.user_agent |
Corrisponde allo user agent HTTP di rete. |
properties.userId |
principal.user.userid |
Utilizzato per l'ID utente principale, se presente. |
properties.wids |
security_result.detection_fields |
Aggiunto come coppia chiave-valore a security_result.detection_fields con la chiave "wids". |
reason |
security_result.summary |
Utilizzato per il riepilogo dei risultati di sicurezza negli eventi di accesso. |
resourceId |
target.resource.attribute.labels |
Aggiunto come coppia chiave-valore a target.resource.attribute.labels con la chiave "ID risorsa". |
schema_name |
target.resource_ancestors.resource_subtype |
Utilizzato per il sottotipo di antenato della risorsa di destinazione, se presente negli audit log. |
security_result.description |
metadata.description |
Utilizzato per la descrizione dell'evento se non si tratta di un evento di controllo. |
security_result.severity |
security_result.severity |
Maps direttamente, se presente. Impostato su "LOW" per i log KV, su "INFORMATIONAL" per determinati messaggi di errore e derivato dai campi level o Severity. |
security_result.severity_details |
security_result.severity_details |
Maps direttamente, se presente. |
security_result.summary |
security_result.summary |
Maps direttamente, se presente. Imposta "Connessione effettuata utilizzando l'autenticazione di Windows" o motivi specifici dagli eventi di accesso oppure "Record di controllo di SQL Server" per gli eventi di controllo. |
security_result_action |
security_result.action |
Unito a security_result.action. Imposta su "ALLOW" per la maggior parte degli eventi e derivato da login_result per gli eventi di accesso. |
server_instance_name |
target.hostname |
Utilizzato per il nome host di destinazione, se presente negli audit log. |
server_principal_name |
principal.user.userid |
Utilizzato per l'ID utente principale, se presente nei log di controllo. |
server_principal_sid |
principal.asset_id |
Utilizzato per creare l'ID risorsa principale, con il prefisso "server SID:". |
session_id |
network.session_id |
Utilizzato per l'ID sessione di rete, se presente nei log di controllo. |
sev |
security_result.severity |
Utilizzato per determinare la gravità del risultato di sicurezza. |
Severity |
security_result.severity |
Utilizzato per determinare la gravità del risultato di sicurezza. |
Source |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "Source". |
source |
principal.resource.attribute.labels |
Aggiunto come coppia chiave-valore a principal.resource.attribute.labels con la chiave "source". |
SourceModuleType |
observer.application |
Mappa all'applicazione dell'osservatore. |
SourceModuleName |
additional.fields |
Aggiunto come coppia chiave-valore a additional.fields con la chiave "SourceModuleName". |
source_module_name |
observer.labels |
Aggiunto come coppia chiave-valore a observer.labels con la chiave "SourceModuleName". |
source_module_type |
observer.application |
Mappa all'applicazione dell'osservatore. |
SPID |
network.session_id |
Corrisponde all'ID sessione di rete. |
statement |
target.process.command_line |
Utilizzato per la riga di comando del processo di destinazione, se presente nei log di controllo. |
TextData |
security_result.description, metadata.description |
Utilizzato per la descrizione del risultato di sicurezza se non si tratta di un evento di accesso o per la descrizione dell'evento se lo è. |
time |
metadata.event_timestamp |
Analizzato e utilizzato come timestamp dell'evento. |
Time |
metadata.event_timestamp |
Combinato con Date per creare il timestamp dell'evento. |
transaction_id |
target.resource.attribute.labels |
Aggiunto come coppia chiave-valore a target.resource.attribute.labels con la chiave "transaction_id". |
UserID |
principal.user.windows_sid |
Utilizzato per l'SID di Windows dell'utente principale, se presente e nel formato corretto. |
user_id |
principal.user.userid |
Utilizzato per l'ID utente principale, se presente. |
metadata.log_type |
metadata.log_type |
Codificato in modo permanente su "MICROSOFT_SQL". |
metadata.vendor_name |
metadata.vendor_name |
Codificato come "Microsoft". |
metadata.product_name |
metadata.product_name |
Codificato in modo permanente su "SQL Server". |
metadata.event_type |
metadata.event_type |
Impostato su vari valori a seconda del contenuto del log, tra cui "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" e "STATUS_UNCATEGORIZED" come valore predefinito. |
extensions.auth.type |
extensions.auth.type |
Imposta "MACHINE" per gli eventi di accesso e disconnessione. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.