Collecter les journaux Microsoft SQL Server
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- 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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
- 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
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
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
- 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,viou le Bloc-notes).
- Trouvez le fichier
Modifiez le fichier
config.yamlcomme 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.jsonpar 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
- Ouvrez SQL Server Management Studio (SSMS) et connectez-vous à votre instance SQL Server.
- Dans l'Explorateur d'objets, développez l'instance de votre serveur.
- Développez le dossier Security.
- Effectuez un clic droit sur Audits (Audits), puis sélectionnez New Audit (Nouvel audit).
- 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.
- Nom de l'audit : saisissez
- Cliquez sur OK pour créer l'audit.
- 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
- Dans l'Explorateur d'objets, développez Sécurité.
- 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).
- 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.
- Nom : saisissez
- 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
- Cliquez sur OK pour créer la spécification d'audit.
- 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
- Dans l'Explorateur d'objets, développez Sécurité > Audits.
- Effectuez un clic droit sur ChronicleAudit, puis sélectionnez Propriétés.
- Vérifiez que l'état indique Démarré ou Activé.
- Développez Sécurité > Spécifications d'audit du serveur.
- Effectuez un clic droit sur ChronicleAuditSpec, puis sélectionnez Properties (Propriétés).
- 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
- Ouvrez SQL Server Management Studio (SSMS) et connectez-vous à votre instance SQL Server.
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); GOCré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
- Téléchargez NXLog Community Edition depuis nxlog.co/downloads.
- Exécutez le programme d'installation et suivez les instructions de l'assistant d'installation.
Ouvrez le fichier de configuration NXLog situé à l'adresse suivante :
C:\Program Files\nxlog\conf\nxlog.confRemplacez 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.1de Hôte par l'adresse IP de l'agent Bindplane. - Assurez-vous que la valeur Port correspond au port du récepteur Bindplane
udplogconfiguré précédemment.
- Remplacez la valeur actuelle
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.