Collecter les journaux DNS personnalisés
Version de l'analyseur : 1.0
Ce document explique comment ingérer des journaux DNS personnalisés dans Google Security Operations à l'aide de Google Cloud Storage V2.
Le DNS personnalisé est un type de journal générique pour les journaux de serveur DNS provenant d'implémentations DNS personnalisées ou non compatibles. Il capture les données de requête et de réponse DNS, y compris les domaines, les types d'enregistrements et les informations sur le client. Étant donné que ces journaux proviennent de sources DNS non standards, vous devez les exporter vers un bucket Google Cloud Storage (GCS), puis configurer un flux Google SecOps pour les ingérer.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Un projet Google Cloud avec l'API Cloud Storage activée
- Autorisations permettant de créer et de gérer des buckets GCS
- Autorisations permettant de gérer les stratégies IAM sur les buckets GCS
- Un serveur ou un service DNS générant des journaux dans un format compatible (JSON recommandé)
- Accès administrateur au serveur DNS pour configurer l'exportation des journaux
Créer un bucket Google Cloud Storage
- Accédez à la console Google Cloud.
- Sélectionnez votre projet ou créez-en un.
- Dans le menu de navigation, accédez à Cloud Storage > Buckets.
- Cliquez sur Créer un bucket.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Attribuez un nom au bucket Saisissez un nom unique (par exemple, custom-dns-logs).Type d'emplacement Choisissez en fonction de vos besoins (région, birégion, multirégion). Emplacement Sélectionnez l'emplacement le plus proche de votre instance Google SecOps (par exemple, us-central1).Classe de stockage Standard (recommandé pour les journaux auxquels vous accédez fréquemment) Access control (Contrôle des accès) Uniforme (recommandé) Outils de protection Facultatif : Activez la gestion des versions des objets ou la règle de conservation. Cliquez sur Créer.
Configurer une exportation automatique des journaux DNS vers GCS
La méthode d'exportation des journaux DNS dépend de l'implémentation de votre serveur DNS. Choisissez l'approche qui correspond le mieux à votre environnement.
Option 1 : Récepteur Cloud Logging (pour les serveurs DNS sur GCE)
Si votre serveur DNS s'exécute sur une instance Google Compute Engine et enregistre les journaux dans Cloud Logging, créez un récepteur de journaux pour exporter les journaux DNS directement vers GCS.
- Dans la console GCP, accédez à Logging > Routeur de journaux.
- Cliquez sur Créer un récepteur.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nom du récepteur custom-dns-to-gcsDestination du récepteur Bucket Cloud Storage Catégorie custom-dns-logsFiltre d'inclusion Un filtre correspondant à vos entrées de journal DNS (par exemple, resource.type="gce_instance" AND logName="projects/YOUR_PROJECT_ID/logs/dns")Cliquez sur Créer un récepteur.
Option 2 : Cloud Scheduler avec Cloud Build (pour les serveurs DNS sur site)
Utilisez Cloud Build déclenché par Cloud Scheduler pour exécuter un job d'exportation conteneurisé qui collecte les journaux DNS à partir d'un serveur distant et les écrit dans GCS.
Créez un compte de service pour le job d'exportation :
- Dans la console GCP, accédez à IAM et administration > Comptes de service.
- Cliquez sur Créer un compte de service.
- Fournissez les informations de configuration suivantes :
- Nom du compte de service : saisissez
dns-log-export-sa. - Description du compte de service : saisissez
Service account for automated DNS log export to GCS.
- Nom du compte de service : saisissez
- Cliquez sur Créer et continuer.
- Ajoutez les rôles suivants :
- Administrateur des objets Storage (pour écrire des fichiers dans GCS)
- Éditeur Cloud Build (pour exécuter des jobs Cloud Build)
- Cliquez sur OK.
Créez un fichier de configuration Cloud Build (
cloudbuild.yaml) :steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | # Collect DNS logs from your server # Replace with the actual command for your environment # Example: pull logs via syslog-ng, rsync from remote server, or query DNS log API curl -s -H "Authorization: Bearer $${API_TOKEN}" \ "https://your-dns-server.example.com/api/logs?format=json" \ -o /workspace/dns_logs.json # Upload to GCS gcloud storage cp /workspace/dns_logs.json \ gs://${_BUCKET_NAME}/dns/dns_logs_$(date -u +%Y%m%d_%H%M%S).json substitutions: _BUCKET_NAME: 'custom-dns-logs'Créez un job Cloud Scheduler pour déclencher la compilation :
- Dans la console GCP, accédez à Cloud Scheduler.
- Cliquez sur Créer une tâche.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nom dns-log-export-hourlyRégion Sélectionnez la même région que votre bucket GCS. Fréquence 0 * * * *(toutes les heures)Fuseau horaire UTC (recommandé) Type de cible HTTP URL https://cloudbuild.googleapis.com/v1/projects/YOUR_PROJECT_ID/buildsMéthode HTTP POST En-tête d'authentification Ajouter un jeton OAuth Compte de service dns-log-export-sa@YOUR_PROJECT_ID.iam.gserviceaccount.comCliquez sur Créer.
Option 3 : Service de transfert de stockage (pour les systèmes de fichiers sur site)
Si les journaux DNS sont écrits dans un système de fichiers local, utilisez le service de transfert de stockage avec un agent de transfert pour les déplacer vers GCS.
- Dans la console GCP, accédez à Service de transfert de stockage.
- Cliquez sur Créer un job de transfert.
- Sélectionnez Système de fichiers POSIX comme source.
- Suivez les instructions pour installer l'agent Storage Transfer sur le serveur DNS ou sur une machine ayant accès aux fichiers journaux DNS.
Configurez la tâche de transfert :
Paramètre Valeur Répertoire source Chemin d'accès au répertoire du fichier journal DNS Bucket de destination custom-dns-logsChemin de destination dns/Programmation Définir une programmation récurrente (par exemple, toutes les heures) Cliquez sur Créer.
Récupérer le compte de service Google SecOps
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Ajouter un flux.
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Custom DNS Logs). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez DNS personnalisé comme Type de journal.
- Cliquez sur Obtenir un compte de service.
Une adresse e-mail de compte de service unique s'affiche, par exemple :
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopiez cette adresse e-mail pour l'utiliser à l'étape suivante.
Accorder des autorisations IAM au compte de service Google SecOps
Le compte de service Google SecOps a besoin du rôle Lecteur des objets Storage sur votre bucket GCS.
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket (par exemple,
custom-dns-logs). - Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : collez l'adresse e-mail du compte de service Google SecOps (par exemple,
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com). - Attribuer des rôles : sélectionnez Lecteur d'objets Storage.
- Ajouter des comptes principaux : collez l'adresse e-mail du compte de service Google SecOps (par exemple,
Cliquez sur Enregistrer.
Configurer le flux Google SecOps
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Ajouter un flux.
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Custom DNS Logs). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez DNS personnalisé comme Type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
URI du bucket de stockage : saisissez l'URI du bucket GCS :
gs://custom-dns-logs/dns/- Remplacez
custom-dns-logspar le nom de votre bucket GCS. - Remplacez
dnspar le chemin d'accès du préfixe que vous avez configuré.
- Remplacez
Option de suppression de la source : sélectionnez l'option de suppression de votre choix :
- Jamais : ne supprime jamais aucun fichier après les transferts (recommandé pour les tests).
Supprimer les fichiers transférés et les répertoires vides : supprime les fichiers et les répertoires vides une fois le transfert réussi.
Âge maximal du fichier : incluez les fichiers modifiés au cours des derniers jours (180 jours par défaut).
Espace de noms de l'élément : espace de noms de l'élément.
Libellés d'ingestion : libellé à appliquer aux événements de ce flux.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
receiveTimestamp |
metadata.event_timestamp |
Analysé en tant que RFC 3339 |
message |
metadata.event_type |
Mappé : "dns_query" → NETWORK_DNS |
jsonPayload.msg |
metadata.product_event_type |
Mappé directement |
insertId |
metadata.product_log_id |
Mappé directement |
message |
metadata.product_name |
Mappé : "dns_query" → Custom DNS |
message |
metadata.vendor_name |
Mappé : "dns_query" → CUSTOM |
message |
network.application_protocol |
Mappé : "dns_query" → DNS |
dns_answers |
network.dns.answers |
Fusionné |
message |
network.dns.answers |
Mappé : "dns_query" → dns_answers |
dns_question |
network.dns.questions |
Fusionné |
message |
network.dns.questions |
Mappé : "dns_query" → dns_question |
dns.response_code |
network.dns.response_code |
Renommé/Mappé |
message |
principal.hostname |
Mappé : "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
principal.ip |
Fusionné |
message |
principal.ip |
Mappé : "dns_query" → jsonPayload.dns_query.server |
message |
security_result |
Mappé : "dns_query" → security_result |
logName |
security_result.category_details |
Fusionné |
message |
security_result.category_details |
Mappé : "dns_query" → logName |
message |
security_result.severity |
Mappé : "dns_query" → INFORMATIONAL, "dns_query" → MEDIUM, "dns_query" → HIGH |
labels.application |
target.application |
Mappé directement |
message |
target.hostname |
Mappé : "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
target.ip |
Fusionné |
message |
target.ip |
Mappé : "dns_query" → jsonPayload.dns_query.server |
component_label |
target.labels |
Fusionné |
instance_group_label |
target.labels |
Fusionné |
message |
target.labels |
Mappé : "dns_query" → component_label, "dns_query" → instance_group_label |
labels.region |
target.location.country_or_region |
Mappé directement |
resource.labels.zone |
target.resource.attribute.cloud.availability_zone |
Mappé directement |
message |
target.resource.attribute.cloud.environment |
Mappé : "dns_query" → GOOGLE_CLOUD_PLATFORM |
resource.labels.project_id |
target.resource.attribute.cloud.project.id |
Mappé directement |
message |
target.resource.resource_type |
Mappé : "dns_query" → VIRTUAL_MACHINE |
| N/A | metadata.event_type |
Constante : NETWORK_DNS |
| N/A | metadata.product_name |
Constante : Custom DNS |
| N/A | metadata.vendor_name |
Constante : CUSTOM |
| N/A | network.application_protocol |
Constante : DNS |
| N/A | principal.hostname |
Constante : jsonPayload.dns_query.server |
| N/A | security_result.severity |
Constante : INFORMATIONAL |
| N/A | target.hostname |
Constante : jsonPayload.dns_query.server |
| N/A | target.resource.attribute.cloud.environment |
Constante : GOOGLE_CLOUD_PLATFORM |
| N/A | target.resource.resource_type |
Constante : VIRTUAL_MACHINE |
Journal des modifications
Afficher le journal des modifications pour ce parseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.