Collecter les journaux Microsoft SQL Server

Compatible avec :

Ce document explique comment ingérer des journaux Microsoft SQL Server dans Google Security Operations à l'aide de Bindplane. L'analyseur gère les journaux Microsoft SQL Server structurés (JSON, paires clé-valeur) et semi-structurés (syslog). Il extrait les champs, normalise les codes temporels, gère différents formats de journaux en fonction du contenu SourceModuleType et Message (y compris les événements d'audit, de connexion et de base de données), et les mappe à l'UDM. Il effectue également une logique d'analyse spécifique pour les journaux d'audit, les tentatives de connexion et les opérations de base de données, en enrichissant les données avec des informations supplémentaires sur le contexte et la gravité.Il collecte les journaux d'audit et d'erreur SQL Server à partir du journal des événements Windows à l'aide d'un redirecteur syslog (NXLog) et les envoie à l'agent BindPlane pour qu'il les transmette à Google SecOps.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Une instance Google SecOps
  • Un hôte Windows Server 2016 ou version ultérieure exécutant Microsoft SQL Server
  • Accès administrateur pour installer et configurer l'agent BindPlane et NXLog
  • Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports de pare-feu sont ouverts conformément aux exigences de l'agent Bindplane.

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.

Obtenir l'ID client Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Profil.
  3. Copiez et enregistrez le numéro client de la section Informations sur l'organisation.

Installer l'agent Bindplane

Installez l'agent Bindplane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.

Installation de fenêtres

  1. Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Ressources d'installation supplémentaires

Pour plus d'options d'installation, consultez le guide d'installation.

Configurer l'agent Bindplane pour ingérer Syslog et l'envoyer à Google SecOps

  1. Accédez au fichier de configuration :
    • Trouvez le fichier config.yaml. Il se trouve généralement dans le répertoire `C:\Program Files\observIQ\bindplane-agent` sous Windows.
    • Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple, nano, vi ou le Bloc-notes).
  2. Modifiez le fichier config.yaml comme suit :

      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
    
    • Remplacez le port et l'adresse IP selon les besoins de votre infrastructure.
    • Remplacez <customer_id> par le numéro client réel.
    • Remplacez /path/to/ingestion-authentication-file.json par le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.

Redémarrez l'agent Bindplane pour appliquer les modifications.

  • Pour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante :

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Activer l'audit SQL Server dans le journal des événements Windows

Vous pouvez activer l'audit SQL Server à l'aide de l'interface utilisateur graphique de SQL Server Management Studio (SSMS) ou des commandes T-SQL. Choisissez l'option qui convient le mieux à votre environnement.

Option 1 : Activer l'audit SQL Server via l'interface graphique SSMS

Créer un audit de serveur dans l'interface utilisateur de SQL Server Management Studio

  1. Ouvrez SQL Server Management Studio (SSMS) et connectez-vous à votre instance SQL Server.
  2. Dans l'Explorateur d'objets, développez l'instance de votre serveur.
  3. Développez le dossier Security.
  4. Effectuez un clic droit sur Audits (Audits), puis sélectionnez New Audit (Nouvel audit).
  5. Dans la boîte de dialogue Créer un audit, fournissez les informations de configuration suivantes :
    • Nom de l'audit : saisissez ChronicleAudit.
    • Délai de file d'attente (en millisecondes) : saisissez 1000.
    • En cas d'échec du journal d'audit : sélectionnez Continuer.
    • Destination de l'audit : sélectionnez Journal des applications.
  6. Cliquez sur OK pour créer l'audit.
  7. Dans l'explorateur d'objets, effectuez un clic droit sur ChronicleAudit, puis sélectionnez Activer l'audit.

Créer une spécification d'audit de serveur via l'interface graphique SSMS

  1. Dans l'Explorateur d'objets, développez Sécurité.
  2. Effectuez un clic droit sur Server Audit Specifications (Spécifications d'audit du serveur), puis sélectionnez New Server Audit Specification (Nouvelle spécification d'audit du serveur).
  3. Dans la boîte de dialogue Créer une spécification d'audit du serveur, fournissez les informations de configuration suivantes :
    • Nom : saisissez ChronicleAuditSpec.
    • Audit : sélectionnez ChronicleAudit dans le menu.
  4. Dans la section Type d'action d'audit, cliquez sur Ajouter et sélectionnez les groupes d'actions d'audit suivants (ajoutez-les un par un en cliquant sur Ajouter après chaque sélection) :
    • 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. Cliquez sur OK pour créer la spécification d'audit.
  6. Dans l'explorateur d'objets, effectuez un clic droit sur la nouvelle spécification ChronicleAuditSpec, puis sélectionnez Activer la spécification d'audit du serveur.

Vérifier la configuration de l'audit

  1. Dans l'Explorateur d'objets, développez Sécurité > Audits.
  2. Effectuez un clic droit sur ChronicleAudit, puis sélectionnez Propriétés.
  3. Vérifiez que l'état indique Démarré ou Activé.
  4. Développez Sécurité > Spécifications d'audit du serveur.
  5. Effectuez un clic droit sur ChronicleAuditSpec, puis sélectionnez Properties (Propriétés).
  6. Vérifiez que les huit groupes d'actions d'audit sont listés et que la spécification est activée.

Option 2 : Activer l'audit SQL Server à l'aide de T-SQL

  1. Ouvrez SQL Server Management Studio (SSMS) et connectez-vous à votre instance SQL Server.
  2. Exécutez les commandes T-SQL suivantes pour créer un audit de serveur qui écrit dans le journal des applications 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. Créez une spécification d'audit pour capturer les événements de sécurité pertinents :

    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
    

Cette configuration garantit que les événements d'authentification, les modifications d'autorisations et les modifications d'objets sont consignés dans le journal des événements Windows.

Installer et configurer NXLog pour transférer des événements vers Bindplane

  1. Téléchargez NXLog Community Edition depuis nxlog.co/downloads.
  2. Exécutez le programme d'installation et suivez les instructions de l'assistant d'installation.
  3. Ouvrez le fichier de configuration NXLog situé à l'adresse suivante :

    C:\Program Files\nxlog\conf\nxlog.conf
    
  4. Remplacez le contenu par la configuration suivante :

    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>
    
    • Remplacez la valeur actuelle 127.0.0.1 de Hôte par l'adresse IP de l'agent Bindplane.
    • Assurez-vous que la valeur Port correspond au port du récepteur Bindplane udplog configuré précédemment.
  5. Enregistrez le fichier et redémarrez le service NXLog :

    net stop nxlog && net start nxlog
    

Table de mappage UDM

Champ de journal Mappage UDM Logique
AccountName principal.user.userid Utilisé pour principal.user.userid s'il est présent dans les journaux, par exemple "Démarrage de la base de données" ou "Journal sauvegardé".
AgentDevice additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "AgentDevice".
AgentLogFile additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "AgentLogFile".
agent.hostname observer.asset.hostname Correspond au nom d'hôte de l'observateur.
agent.id observer.asset_id Concaténation avec agent.type pour former observer.asset_id.
agent.type observer.asset_id Concaténation avec agent.id pour former observer.asset_id.
agent.version observer.platform_version Correspond à la version de la plate-forme d'observateur.
ApplicationName principal.application Mappé à l'application principale.
application_name target.application Mappé sur l'application cible.
client_address principal.ip Utilisée pour l'adresse IP principale si elle est différente de l'hôte et n'est pas un canal local ou nommé.
client_ip principal.ip Correspond à l'adresse IP du compte principal.
computer_name about.hostname Correspond à "À propos du nom d'hôte".
correlationId security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "correlationId".
Date metadata.event_timestamp Combiné à Time pour créer le code temporel de l'événement.
database_name target.resource_ancestors.name Utilisé pour le nom de l'ancêtre de la ressource cible, s'il est présent dans les journaux d'audit.
durationMs network.session_duration.seconds Converti de millisecondes en secondes et mappé.
ecs.version metadata.product_version Correspond à la version du produit.
error security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "error".
err_msg security_result.description Correspond à la description du résultat de sécurité.
EventID metadata.product_event_type Permet de créer un type d'événement produit si d'autres champs ne sont pas disponibles. Il est précédé de "EventID: ".
event.action Source Utilisé comme source, le cas échéant.
event.code metadata.product_event_type Combiné avec event.provider pour former metadata.product_event_type.
event.provider metadata.product_event_type Combiné avec event.code pour former metadata.product_event_type.
EventReceivedTime metadata.ingested_timestamp Analysé et utilisé comme horodatage d'ingestion.
event_time metadata.event_timestamp Analysé et utilisé comme code temporel de l'événement.
file_name principal.process.file.full_path Mappe le chemin d'accès complet au fichier de processus principal.
file_path target.file.full_path Utilisé pour le chemin d'accès complet au fichier cible s'il est trouvé dans les journaux de sauvegarde.
first_lsn target.resource.attribute.labels Ajouté en tant que paire clé-valeur à target.resource.attribute.labels avec la clé "First LSN".
host principal.hostname, observer.hostname Utilisé pour le nom d'hôte principal ou de l'observateur s'il ne s'agit pas d'une adresse IP. Également utilisé pour le nom d'hôte ou l'adresse IP cible, selon qu'il s'agit d'une adresse IP ou non.
host.ip principal.ip Fusionné dans l'adresse IP principale.
host.name host Utilisé comme hôte, le cas échéant.
Hostname principal.hostname, target.hostname Utilisé pour le nom d'hôte principal ou cible, le cas échéant.
hostinfo.architecture principal.asset.hardware.cpu_platform Mappe la plate-forme CPU du matériel de l'asset principal.
hostinfo.os.build additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "os_build".
hostinfo.os.kernel principal.platform_patch_level Correspond au niveau de correctif de la plate-forme principale.
hostinfo.os.name additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "os_name".
hostinfo.os.platform principal.platform En majuscules et mappé à la plate-forme principale.
hostinfo.os.version principal.platform_version Correspond à la version de la plate-forme principale.
last_lsn target.resource.attribute.labels Ajouté en tant que paire clé-valeur à target.resource.attribute.labels avec la clé "Last LSN".
level security_result.severity Si la valeur est "Informational", security_result.severity est défini sur "INFORMATIONAL".
log.level security_result.severity_details Mappe les détails de gravité des résultats de sécurité.
LoginName principal.user.userid Utilisé pour l'ID utilisateur principal, s'il est présent dans les journaux KV.
login_result security_result.action Détermine l'action du résultat de sécurité (ALLOW ou BLOCK).
logon_user principal.user.userid Utilisé pour l'ID utilisateur principal, s'il est présent dans les journaux de connexion.
logstash.process.host intermediary.hostname Correspond au nom d'hôte intermédiaire.
Message metadata.description, security_result.description Utilisé pour la description d'un événement ou d'un résultat de sécurité, selon le type de journal.
msg metadata.description Utilisé pour la description de l'événement, le cas échéant.
ObjectName target.resource.name Correspond au nom de la ressource cible.
object_name target.resource.name Utilisé pour le nom de la ressource cible, le cas échéant, dans les journaux d'audit.
ObjectType target.resource.type Mappé au type de ressource cible.
operationId security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "operationId".
operationName metadata.product_event_type Correspond au type d'événement produit.
operationVersion additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "operationVersion".
ProcessInfo additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "ProcessInfo".
properties.apiVersion metadata.product_version Correspond à la version du produit.
properties.appId target.resource.product_object_id Correspond à l'ID de l'objet produit de la ressource cible.
properties.clientAuthMethod extensions.auth.auth_details Utilisé pour déterminer les informations d'authentification.
properties.clientRequestId additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "clientRequestId".
properties.durationMs network.session_duration.seconds Convertie en secondes et mappée.
properties.identityProvider security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "identityProvider".
properties.ipAddress principal.ip, principal.asset.ip Analysé pour l'adresse IP et fusionné dans l'adresse IP principale et l'adresse IP de l'actif principal.
properties.location principal.location.name Correspond au nom du lieu principal.
properties.operationId security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "operationId".
properties.requestId metadata.product_log_id Correspond à l'ID du journal de produit.
properties.requestMethod network.http.method Correspond à la méthode HTTP du réseau.
properties.requestUri target.url Mappe l'URL cible.
properties.responseSizeBytes network.received_bytes Converti en entier non signé et mappé.
properties.responseStatusCode network.http.response_code Convertie en entier et mappée.
properties.roles additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "roles".
properties.servicePrincipalId principal.user.userid Utilisé pour l'ID utilisateur principal si properties.userId n'est pas présent.
properties.signInActivityId network.session_id Correspond à l'ID de session réseau.
properties.tenantId metadata.product_deployment_id Correspond à l'ID de déploiement du produit.
properties.tokenIssuedAt additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "tokenIssuedAt".
properties.userAgent network.http.user_agent Mappe l'user-agent HTTP du réseau.
properties.userId principal.user.userid Utilisé pour l'ID utilisateur principal, le cas échéant.
properties.wids security_result.detection_fields Ajouté en tant que paire clé-valeur à security_result.detection_fields avec la clé "wids".
reason security_result.summary Utilisé pour le récapitulatif des résultats de sécurité dans les événements de connexion.
resourceId target.resource.attribute.labels Ajouté en tant que paire clé-valeur à target.resource.attribute.labels avec la clé "ID de ressource".
schema_name target.resource_ancestors.resource_subtype Utilisé pour le sous-type d'ancêtre de la ressource cible, s'il est présent dans les journaux d'audit.
security_result.description metadata.description Utilisé pour la description de l'événement s'il ne s'agit pas d'un événement d'audit.
security_result.severity security_result.severity Mappe directement si elle est présente. Défini sur "LOW" pour les journaux KV, sur "INFORMATIONAL" pour certains messages d'erreur et dérivé des champs level ou Severity.
security_result.severity_details security_result.severity_details Mappe directement si elle est présente.
security_result.summary security_result.summary Mappe directement si elle est présente. Définissez la valeur sur "Connexion établie à l'aide de l'authentification Windows" ou sur des raisons spécifiques issues des événements de connexion, ou sur "Enregistrement d'audit SQL Server" pour les événements d'audit.
security_result_action security_result.action Fusionné avec security_result.action. Définissez sa valeur sur "ALLOW" pour la plupart des événements. Pour les événements de connexion, elle est dérivée de login_result.
server_instance_name target.hostname Utilisé pour le nom d'hôte cible s'il est présent dans les journaux d'audit.
server_principal_name principal.user.userid Utilisé pour l'ID utilisateur principal, s'il est présent dans les journaux d'audit.
server_principal_sid principal.asset_id Utilisé pour construire l'ID de l'élément principal, avec le préfixe "server SID:".
session_id network.session_id Utilisé pour l'ID de session réseau, s'il est présent dans les journaux d'audit.
sev security_result.severity Permet de déterminer la gravité du résultat de sécurité.
Severity security_result.severity Permet de déterminer la gravité du résultat de sécurité.
Source additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "Source".
source principal.resource.attribute.labels Ajouté en tant que paire clé-valeur à principal.resource.attribute.labels avec la clé "source".
SourceModuleType observer.application Mappe l'application d'observateur.
SourceModuleName additional.fields Ajouté en tant que paire clé-valeur à additional.fields avec la clé "SourceModuleName".
source_module_name observer.labels Ajouté en tant que paire clé-valeur à observer.labels avec la clé "SourceModuleName".
source_module_type observer.application Mappe l'application d'observateur.
SPID network.session_id Correspond à l'ID de session réseau.
statement target.process.command_line Utilisé pour la ligne de commande du processus cible, le cas échéant, dans les journaux d'audit.
TextData security_result.description, metadata.description Description du résultat de sécurité si ce n'est pas un événement de connexion, ou description de l'événement si c'en est un.
time metadata.event_timestamp Analysé et utilisé comme code temporel de l'événement.
Time metadata.event_timestamp Combiné à Date pour créer le code temporel de l'événement.
transaction_id target.resource.attribute.labels Ajouté en tant que paire clé-valeur à target.resource.attribute.labels avec la clé "transaction_id".
UserID principal.user.windows_sid Utilisé pour le SID Windows de l'utilisateur principal, s'il est présent et au bon format.
user_id principal.user.userid Utilisé pour l'ID utilisateur principal, le cas échéant.
metadata.log_type metadata.log_type Codé en dur sur "MICROSOFT_SQL".
metadata.vendor_name metadata.vendor_name Codé en dur sur "Microsoft".
metadata.product_name metadata.product_name Codé en dur sur "SQL Server".
metadata.event_type metadata.event_type Définie sur différentes valeurs en fonction du contenu du journal, y compris "USER_LOGIN", "USER_LOGOUT", "STATUS_STARTUP", "STATUS_SHUTDOWN", "NETWORK_HTTP", "GENERIC_EVENT" et "STATUS_UNCATEGORIZED" par défaut.
extensions.auth.type extensions.auth.type Définissez sa valeur sur "MACHINE" pour les événements de connexion et de déconnexion.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.