
Kit d'outils de capture et de surveillance DNS passif
Nous explorons une solution SaaS gérée pour dnsmonster ! Aidez à façonner l'avenir de la surveillance DNS passive en partageant vos retours et besoins : Répondez à notre rapide sondage
Table des matières
Framework de surveillance DNS passive construit en Golang.
dnsmonster implémente un renifleur de paquets pour le trafic DNS. Il peut accepter le trafic à partir d'un fichier pcap, d'une interface en direct ou d'un socket dnstap,
et peut être utilisé pour indexer et stocker des centaines de milliers de requêtes DNS par seconde, car il s'est avéré capable d'indexer plus de 200 000 requêtes DNS par seconde sur un ordinateur standard. Il vise à être évolutif, simple et facile à utiliser, et à aider
les équipes de sécurité à comprendre les détails du trafic DNS d'une entreprise. dnsmonster ne cherche pas à suivre les conversations DNS, mais plutôt à indexer les paquets DNS dès leur arrivée. Il ne vise pas non plus à violer
la vie privée des utilisateurs finaux, grâce à la capacité de masquer les adresses IP de couche 3 (IPv4 et IPv6), permettant aux équipes d'effectuer des analyses de tendances sur des données agrégées sans pouvoir retracer les requêtes jusqu'à un individu. Article de blog
Le code antérieur à la version 1.x est considéré comme de qualité bêta et peut subir des changements disruptifs. Veuillez consulter les notes de version pour chaque tag afin de voir la liste des scénarios de rupture entre chaque version, et comment atténuer une éventuelle perte de données.```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end
subgraph "Process"
C1["Sampling based of ratio"]
C2["Packet Process"]
C3["Dispatcher"]
O11["Output1"]
O12["Domain Skip (optional)"]
O13["Domain Allow (optional)"]
O21["Output2"]
O22["Domain Skip (optional)"]
O23["Domain Allow (optional)"]
O31["Output3"]
O32["Domain Skip (optional)"]
O33["Domain Allow (optional)"]
end
B1 --> Process
B2 --> Process
B3 --> Process
C1 --> C2
C2 --> C3
C3 --> O11
C3 --> O21
C3 --> O31
O11 --> O12 --> O13
O21 --> O22 --> O23
O31 --> O32 --> O33
subgraph Output
Splunk
Syslog
H["ClickHouse"]
Postgres
Kafka
I["JSON File"]
Influx
Elastic
J["stdout"]
Parquet
Sentinel
end
O13 --> H
O23 --> I
O33 --> J
# Fonctionnalités principales
- Capacité à utiliser `afpacket` de Linux et la capture de paquets sans copie.
- Prend en charge BPF
- Capacité à masquer l'adresse IP pour renforcer la confidentialité
- Capacité à définir un ratio d'échantillonnage de prétraitement
- Capacité à avoir une liste de `fqdn` à ignorer pour éviter d'écrire certains domaines/suffixes/préfixes dans le stockage
- Capacité à avoir une liste de domaines autorisés, utilisée pour journaliser l'accès à certains domaines
- Rechargement à chaud des fichiers/URLs de domaines à ignorer et autorisés
- Sortie modulaire avec logique configurable par flux de sortie.
- Politique de conservation automatique des données utilisant l'attribut TTL de ClickHouse
- Tableau de bord Grafana intégré pour la sortie ClickHouse.
- Capacité à être distribué sous forme d'un binaire unique lié statiquement
- Capacité à être configuré à l'aide de variables d'environnement, d'options de ligne de commande ou d'un fichier de configuration
- Capacité à échantillonner les sorties en utilisant la fonctionnalité SAMPLE de ClickHouse
- Capacité à envoyer des métriques en utilisant `prometheus` et `statstd`
- Taux de compression élevé grâce au stockage LZ4 intégré de ClickHouse
- Prend en charge DNS sur TCP, DNS fragmenté (udp/tcp) et IPv6
- Prend en charge [dnstap](https://github.com/dnstap/golang-dnstap) sur socket Unix ou TCP
- intégration SIEM intégrée avec Splunk et Microsoft Sentinel
# Installation
## Linux
La meilleure façon de démarrer avec `dnsmonster` est de télécharger le binaire depuis la section des versions. Le binaire est compilé statiquement contre `musl`, donc il devrait fonctionner prêt à l'emploi pour de nombreuses distributions. Pour le support `afpacket`, vous devez utiliser un noyau 3.x+. Toute distribution Linux moderne (CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+) est livrée avec une version 3.x+ donc elle devrait fonctionner sans problème. Si votre distribution ne fonctionne pas avec la version précompilée, veuillez soumettre un problème avec les détails et construire `dnsmonster` manuellement en utilisant cette section [Build Manually](#build-manually).
### Conteneur
Puisque `dnsmonster` utilise la fonctionnalité de capture brute de paquets, le démon Docker/Podman doit accorder la capacité au conteneur```
sudo docker run --rm -it --net=host --cap-add NET_RAW --cap-add NET_ADMIN --name dnsmonster ghcr.io/mosajjal/dnsmonster:latest --devName lo --stdoutOutputType=1
libpcap:
Assurez-vous d'avoir installé les paquets go, libpcap-devel et linux-headers. Le nom des paquets peut différer selon votre distribution. Après cela, clonez simplement le dépôt et exécutez `go build ./cmd/dnsmonster````sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster- sans `libpcap`:
`dnsmonster` n'utilise qu'une seule fonction de `libpcap`, qui est de convertir les filtres de style `tcpdump` en bytecode BPF. Si vous pouvez vous passer du support BPF, vous pouvez compiler `dnsmonster` sans `libpcap`. Notez que pour toute autre plateforme, la capture de paquets retombe sur `libpcap`, ce qui en fait une dépendance obligatoire (*BSD, Windows, Darwin)```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster -tags nolibpcap ./cmd/dnsmonster
La construction ci-dessus fonctionne également sur ARMv7 (RPi4) et AArch64.
Si vous possédez une copie de libpcap.a, vous pouvez le lier statiquement à dnsmonster et le construire entièrement de manière statique. Dans le code ci-dessous, veuillez remplacer /root/libpcap-1.9.1/libpcap.a par l'emplacement de votre copie.```
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster/
go get
go build --ldflags "-L /root/libpcap-1.9.1/libpcap.a -linkmode external -extldflags "-I/usr/include/libnl3 -lnl-genl-3 -lnl-3 -static"" -a -o dnsmonster ./cmd/dnsmonster
Pour plus d'informations sur la façon dont le binaire lié statiquement est créé, jetez un œil à [ce](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile) Dockerfile.
## Windows
La construction sous Windows est très similaire à Linux. Assurez-vous simplement d'avoir `npcap`. Clonez le dépôt (`--history 1` fonctionne), et exécutez `go get` et `go build ./cmd/dnsmonster`.
Comme mentionné, la version Windows du binaire dépend de l'installation de [npcap](https://nmap.org/npcap/#download). Après l'installation, le binaire devrait fonctionner sans problème. Il a été testé dans un environnement Windows 10 et s'est exécuté sans problème. Pour trouver les noms d'interface à donner au paramètre `--devName` et commencer à sniffer, vous devrez effectuer les opérations suivantes :
- ouvrez cmd.exe en tant qu'Administrateur et exécutez la commande suivante : `getmac.exe`, vous verrez un tableau avec l'adresse MAC de vos interfaces et une colonne Nom de transport avec quelque chose comme ceci : `\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
- exécutez `dnsmonster.exe` dans `cmd.exe` comme ceci :```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
Notez que vous devez changer \Tcpip de getmac.exe en \NPF puis le passer à dnsmonster.exe.
Comme pour Linux et Windows, assurez-vous d'avoir git, libpcap et go installés, puis suivez les mêmes instructions :```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster
# Architecture
## Installation tout-en-un avec Docker

Dans le diagramme d'exemple, le trafic entrant/sortant du serveur DNS est capturé, puis une couche optionnelle d'agrégation de paquets est ajoutée avant d'atteindre le serveur DNSMonster. Les données sortantes des serveurs DNS sont très utiles pour effectuer une analyse du cache et des performances sur la flotte DNS. Si vous ne disposez pas d'un agrégateur, vous pouvez connecter les deux TAP directement à DNSMonster et avoir deux agents DNSMonster qui observent le trafic.
L'exécution de `./autobuild.sh` crée plusieurs conteneurs :
* plusieurs instances de `dnsmonster` pour observer le trafic sur n'importe quelle interface. La liste des interfaces sera demandée dans le cadre de `autobuild.sh`
* une instance de `clickhouse` pour collecter la sortie de `dnsmonster` et enregistrer tous les logs/données dans un répertoire de données et de logs. Les deux seront demandés dans le cadre de `autobuild.sh`
* une instance de `grafana` qui interroge les données de `clickhouse` avec un tableau de bord pré-construit.
### Démo tout-en-un
[](static/aio_demo.svg)
## Déploiement entreprise

# Configuration
DNSMonster peut être configuré selon 3 méthodes différentes. Options en ligne de commande, variables d'environnement et fichier de configuration. Ordre de priorité :
- Options en ligne de commande (insensible à la casse)
- Variables d'environnement (toujours en majuscules)
- Fichier de configuration (sensible à la casse, minuscules)
- Valeurs par défaut (aucune configuration)
## Options en ligne de commande
Notez que les arguments de la ligne de commande sont insensibles à la casse depuis la version v0.9.5
[//]: <> (start of command line options)```sh
# [capture]
# Device used to capture
--devname=
# Pcap filename to run
--pcapfile=
# dnstap socket path. Example: unix:///tmp/dnstap.sock, tcp://127.0.0.1:8080
--dnstapsocket=
# Port selected to filter packets
--port=53
# Capture Sampling by a:b. eg sampleRatio of 1:100 will process 1 percent of the incoming packets
--sampleratio=1:1
# Cleans up packet hash table used for deduplication
--dedupcleanupinterval=1m0s
# Set the dnstap socket permission, only applicable when unix:// is used
--dnstappermission=755
# Number of routines used to handle received packets
--packethandlercount=2
# Size of the tcp assembler
--tcpassemblychannelsize=10000
# Size of the tcp result channel
--tcpresultchannelsize=10000
# Number of routines used to handle tcp packets
--tcphandlercount=1
# Size of the channel to send packets to be defragged
--defraggerchannelsize=10000
# Size of the channel where the defragged packets are returned
--defraggerchannelreturnsize=10000
# Size of the packet handler channel
--packetchannelsize=1000
# Afpacket Buffersize in MB
--afpacketbuffersizemb=64
# BPF filter applied to the packet stream. If port is selected, the packets will not be defragged.
--filter=((ip and (ip[9] == 6 or ip[9] == 17)) or (ip6 and (ip6[6] == 17 or ip6[6] == 6 or ip6[6] == 44)))
# Use AFPacket for live captures. Supported on Linux 3.0+ only
--useafpacket
# The PCAP capture does not contain ethernet frames
--noetherframe
# Deduplicate incoming packets, Only supported with --devName and --pcapFile. Experimental
--dedup
# Do not put the interface in promiscuous mode
--nopromiscuous
# [clickhouse_output]
# Address of the clickhouse database to save the results. multiple values can be provided.
--clickhouseaddress=localhost:9000
# Username to connect to the clickhouse database
--clickhouseusername=
# Password to connect to the clickhouse database
--clickhousepassword=
# Database to connect to the clickhouse database
--clickhousedatabase=default
# Table which data will be stored on clickhouse database
--clickhousetable=DNS_LOG
# Interval between sending results to ClickHouse. If non-0, Batch size is ignored and batch delay is used
--clickhousedelay=0s
# Clickhouse connection LZ4 compression level, 0 means no compression
--clickhousecompress=0
# Debug Clickhouse connection
--clickhousedebug
# Use TLS for Clickhouse connection
--clickhousesecure
# Save full packet query and response in JSON format.
--clickhousesavefullquery
# Use DNSTap identity field instead of ServerName for the identity field in ClickHouse
--clickhouseusednstapidentity
# What should be written to clickhouse. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--clickhouseoutputtype=0
# Minimum capacity of the cache array used to send data to clickhouse. Set close to the queries per second received to prevent allocations
--clickhousebatchsize=100000
# Number of Clickhouse output Workers
--clickhouseworkers=1
# Channel Size for each Clickhouse Worker
--clickhouseworkerchannelsize=100000
# [elastic_output]
# What should be written to elastic. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--elasticoutputtype=0
# elastic endpoint address, example: http://127.0.0.1:9200. Used if elasticOutputType is not none
--elasticoutputendpoint=
# elastic index
--elasticoutputindex=default
# Send data to Elastic in batch sizes
--elasticbatchsize=1000
# Interval between sending results to Elastic if Batch size is not filled
--elasticbatchdelay=1s
# [file_output]
# What should be written to file. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--fileoutputtype=0
# Path to output folder. Used if fileoutputType is not none
--fileoutputpath=
# Interval to rotate the file in cron format
--fileoutputrotatecron=0 0 * * *
# Number of files to keep. 0 to disable rotation
--fileoutputrotatecount=4
# Output format for file. options:json, csv, csv_no_header, gotemplate. note that the csv splits the datetime format into multiple fields
--fileoutputformat=json
# Go Template to format the output as needed
--fileoutputgotemplate={{.}}
# [influx_output]
# What should be written to influx. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--influxoutputtype=0
# influx Server address, example: http://localhost:8086. Used if influxOutputType is not none
--influxoutputserver=
# Influx Server Auth Token
--influxoutputtoken=dnsmonster
# Influx Server Bucket
--influxoutputbucket=dnsmonster
# Influx Server Org
--influxoutputorg=dnsmonster
# Minimum capacity of the cache array used to send data to Influx
--influxoutputworkers=8
# Minimum capacity of the cache array used to send data to Influx
--influxbatchsize=1000
# [kafka_output]
# What should be written to kafka. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--kafkaoutputtype=0
# kafka broker address(es), example: 127.0.0.1:9092. Used if kafkaOutputType is not none
--kafkaoutputbroker=
# Kafka topic for logging
--kafkaoutputtopic=dnsmonster
# Minimum capacity of the cache array used to send data to Kafka
--kafkabatchsize=1000
# Output format. options:json, gob.
--kafkaoutputformat=json
# Kafka connection timeout in seconds
--kafkatimeout=3
# Interval between sending results to Kafka if Batch size is not filled
--kafkabatchdelay=1s
# Compress Kafka connection
--kafkacompress
# Compression Type Kafka connection [snappy gzip lz4 zstd]; default(snappy).
--kafkacompressiontype=snappy
# Use TLS for kafka connection
--kafkasecure
# Path of CA certificate that signs Kafka broker certificate
--kafkacacertificatepath=
# Path of TLS certificate to present to broker
--kafkatlscertificatepath=
# Path of TLS certificate key
--kafkatlskeypath=
# [parquet_output]
# What should be written to parquet file. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--parquetoutputtype=0
# Path to output folder. Used if parquetoutputtype is not none
--parquetoutputpath=
# Number of records to write to parquet file before flushing
--parquetflushbatchsize=10000
# Number of workers to write to parquet file
--parquetworkercount=4
# Size of the write buffer in bytes
--parquetwritebuffersize=256000
# [psql_output]
# What should be written to Microsoft Psql. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--psqloutputtype=0
# Psql endpoint used. must be in uri format. example: postgres://username:password@hostname:port/database?sslmode=disable
--psqlendpoint=
# Psql table which data will be stored on database
--psqltable=DNS_LOG
# Number of PSQL workers
--psqlworkers=1
# Psql Batch Size
--psqlbatchsize=1
# Interval between sending results to Psql if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
--psqlbatchdelay=0s
# Timeout for any INSERT operation before we consider them failed
--psqlbatchtimeout=5s
# Save full packet query and response in JSON format.
--psqlsavefullquery
# [sentinel_output]
# What should be written to Microsoft Sentinel. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--sentineloutputtype=0
# Sentinel Shared Key, either the primary or secondary, can be found in Agents Management page under Log Analytics workspace
--sentineloutputsharedkey=
# Sentinel Customer Id. can be found in Agents Management page under Log Analytics workspace
--sentineloutputcustomerid=
# Sentinel Output LogType
--sentineloutputlogtype=dnsmonster
# Sentinel Output Proxy in URI format
--sentineloutputproxy=
# Sentinel Batch Size
--sentinelbatchsize=100
# Interval between sending results to Sentinel if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
--sentinelbatchdelay=0s
# [splunk_output]
# What should be written to HEC. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--splunkoutputtype=0
# splunk endpoint address, example: http://127.0.0.1:8088. Used if splunkOutputType is not none, can be specified multiple times for load balanace and HA
--splunkoutputendpoint=
# Splunk HEC Token
--splunkoutputtoken=00000000-0000-0000-0000-000000000000
# Splunk Output Index
--splunkoutputindex=temp
# Splunk Output Proxy in URI format
--splunkoutputproxy=
# Splunk Output Source
--splunkoutputsource=dnsmonster
# Splunk Output Sourcetype
--splunkoutputsourcetype=json
# Send data to HEC in batch sizes
--splunkbatchsize=1000
# Interval between sending results to HEC if Batch size is not filled
--splunkbatchdelay=1s
# [stdout_output]
# What should be written to stdout. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--stdoutoutputtype=0
# Output format for stdout. options:json,csv, csv_no_header, gotemplate. note that the csv splits the datetime format into multiple fields
--stdoutoutputformat=json
# Go Template to format the output as needed
--stdoutoutputgotemplate={{.}}
# Number of workers
--stdoutoutputworkercount=8
# [syslog_output]
# What should be written to Syslog server. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--syslogoutputtype=0
# Syslog endpoint address, example: udp://127.0.0.1:514, tcp://127.0.0.1:514. Used if syslogOutputType is not none
--syslogoutputendpoint=udp://127.0.0.1:514
# [victoria_output]
# Victoria Output Endpoint. example: http://localhost:9428/insert/jsonline?_msg_field=rcode_id&_time_field=time
--victoriaoutputendpoint=
# What should be written to Microsoft Victoria. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--victoriaoutputtype=0
# Victoria Output Proxy in URI format
--victoriaoutputproxy=
# Number of workers
--victoriaoutputworkers=8
# Victoria Batch Size
--victoriabatchsize=100
# Interval between sending results to Victoria if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
--victoriabatchdelay=0s
# [zinc_output]
# What should be written to zinc. options:
# 0: Disable Output
# 1: Enable Output without any filters
# 2: Enable Output and apply skipdomains logic
# 3: Enable Output and apply allowdomains logic
# 4: Enable Output and apply both skip and allow domains logic
--zincoutputtype=0
# index used to save data in Zinc
--zincoutputindex=dnsmonster
# zinc endpoint address, example: http://127.0.0.1:9200/api/default/_bulk. Used if zincOutputType is not none
--zincoutputendpoint=
# zinc username, example: [email protected]. Used if zincOutputType is not none
--zincoutputusername=
# zinc password, example: password. Used if zincOutputType is not none
--zincoutputpassword=
# Send data to Zinc in batch sizes
--zincbatchsize=1000
# Interval between sending results to Zinc if Batch size is not filled
--zincbatchdelay=1s
# Zing request timeout
--zinctimeout=10s
# [general]
# Garbage Collection interval for tcp assembly and ip defragmentation
--gctime=10s
# Duration to calculate interface stats
--capturestatsdelay=1s
# Mask IPv4s by bits. 32 means all the bits of IP is saved in DB
--masksize4=32
# Mask IPv6s by bits. 32 means all the bits of IP is saved in DB
--masksize6=128
# Name of the server used to index the metrics.
--servername=default
# Set debug Log format
--logformat=text
# Set debug Log level, 0:PANIC, 1:ERROR, 2:WARN, 3:INFO, 4:DEBUG
--loglevel=3
# Size of the result processor channel size
--resultchannelsize=100000
# write cpu profile to file
--cpuprofile=
# write memory profile to file
--memprofile=
# GOMAXPROCS variable
--gomaxprocs=-1
# Limit of packets logged to clickhouse every iteration. Default 0 (disabled)
--packetlimit=0
# Skip outputing domains matching items in the CSV file path. Can accept a URL (http:// or https://) or path
--skipdomainsfile=
# Hot-Reload skipdomainsfile interval
--skipdomainsrefreshinterval=1m0s
# Allow Domains logic input file. Can accept a URL (http:// or https://) or path
--allowdomainsfile=
# Hot-Reload allowdomainsfile file interval
--allowdomainsrefreshinterval=1m0s
# Skip TLS verification when making HTTPS connections
--skiptlsverification
# [metric]
# Metric Endpoint Service
--metricendpointtype=
# Statsd endpoint. Example: 127.0.0.1:8125
--metricstatsdagent=
# Prometheus Registry endpoint. Example: http://0.0.0.0:2112/metric
--metricprometheusendpoint=
# Format for output.
--metricformat=json
# Interval between sending results to Metric Endpoint
--metricflushinterval=10s
tous les indicateurs peuvent également être définis via des variables d'environnement. Gardez à l'esprit que le nom de chaque paramètre est toujours en majuscules et que le préfixe pour toutes les variables est "DNSMONSTER."
Exemple :```shell $ export DNSMONSTER_PORT=53 $ export DNSMONSTER_DEVNAME=lo $ sudo -E dnsmonster
## Fichier de configuration
vous pouvez exécuter `dnsmonster` en utilisant la commande suivante pour utiliser le fichier de configuration :```shell
$ sudo dnsmonster --config=dnsmonster.ini
# Or you can use environment variables to set the configuration file path
$ export DNSMONSTER_CONFIG=dnsmonster.ini
$ sudo -E dnsmonster
La politique de rétention par défaut pour les tables ClickHouse est fixée à 30 jours. Vous pouvez changer ce nombre en construisant les conteneurs avec ./autobuild.sh. Comme ClickHouse ne dispose pas d'horodatage interne, le TTL se basera sur la date des paquets entrants dans les fichiers pcap. Ainsi, lors de l'importation de vieux fichiers pcap, ClickHouse peut automatiquement commencer à supprimer les données au fur et à mesure qu'elles sont écrites et vous ne verrez aucune donnée réelle dans votre Grafana. Pour corriger cela, vous pouvez modifier le TTL pour qu'il soit d'un jour plus ancien que le paquet le plus ancien dans le fichier PCAP.
REMARQUE : pour modifier un TTL à tout moment, vous devez vous connecter directement au serveur ClickHouse à l'aide d'un client clickhouse et exécuter l'instruction SQL suivante (cet exemple le change de 30 à 90 jours) :```sql
ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;`
NOTE: La commande ci-dessus ne modifie que le TTL pour les données brutes des logs DNS, qui constituent la majorité de votre consommation de capacité. Pour vous assurer d'ajuster le TTL pour chaque table d'agrégation, vous pouvez exécuter la commande suivante :```sql
ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_DOMAIN_COUNT` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_DOMAIN_UNIQUE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_PROTOCOL` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_GENERAL_AGGREGATIONS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_EDNS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_OPCODE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_TYPE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_CLASS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_RESPONSECODE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
ALTER TABLE `.inner.DNS_SRCIP_MASK` MODIFY TTL DnsDate + INTERVAL 90 DAY;
MISE À JOUR : dans la dernière version de clickhouse, les tables .inner n'ont pas le même nom que les vues d'agrégation correspondantes. Pour modifier le TTL, vous devez trouver les noms de tables au format UUID en utilisant SHOW TABLES et répéter la commande ALTER avec ces UUID.
dnsmonster prend en charge l'échantillonnage avant traitement des paquets à l'aide d'un paramètre simple : sampleRatio. Ce paramètre accepte une valeur de "ratio", comme 1:2. 1:2 signifie que pour chaque 2 paquets arrivant, un seul est traité (échantillonnage à 50%). Notez que cet échantillonnage a lieu APRÈS les filtres bpf et non avant. Si vous avez du mal à suivre le volume de votre trafic DNS, vous pouvez définir ce paramètre sur quelque chose comme 2:10, ce qui signifie que 20% des paquets passant votre filtre bpf seront traités par dnsmonster.
dnsmonster prend en charge une liste de domaines à ignorer en post-traitement pour éviter d'écrire des données répétitives et bruyantes dans votre base de données. La liste de domaines à ignorer est un fichier au format CSV, avec seulement deux colonnes : une chaîne de caractères et une logique pour cette chaîne. dnsmonster supporte trois logiques : prefix, suffix et fqdn. prefix et suffix signifient que seuls les domaines commençant/se terminant par la chaîne mentionnée seront ignorés lors de l'écriture dans la base de données. Notez que, comme le processus s'effectue sur les questions DNS, votre chaîne aura très probablement un . final qui doit également être inclus dans votre ligne de la liste d'ignorance (jetez un œil à skipdomains.csv.sample pour une meilleure vue). Vous pouvez également faire correspondre un FQDN complet pour éviter d'écrire des FQDN très bruyants dans votre base de données.
dnsmonster dispose du concept de domaines autorisés, ce qui aide à la détection si certains FQDN, préfixes ou suffixes sont présents dans le trafic DNS. Étant donné que dnsmonster supporte plusieurs flux de sortie avec une logique différente pour chacun, il est possible de collecter tout le trafic DNS dans ClickHouse, mais de collecter uniquement les domaines de la liste autorisée dans stdout ou dans un fichier dans la même instance de dnsmonster.
Par défaut, les tables principales créées par le fichier tables.sql (DNS_LOG) ont la capacité d'échantillonner un résultat selon les besoins, puisque chaque question DNS est associée à un UUID semi-unique. Pour plus d'informations sur les requêtes SAMPLE dans Clickhouse, veuillez consulter ce document.
REMARQUE : si votre fichier pcap a été capturé par l'une des méta-interfaces de Linux (par exemple tcpdump -i any), dnsmonster ne pourra pas y lire la trame Ethernet car elle n'existe pas. Vous pouvez utiliser un outil comme tcprewrite pour convertir le fichier pcap en Ethernet.
afpacketallowDomains et skipDomains depuis des points de terminaison HTTP(S)libpcap et passage à pcapgo pour le traitement des paquetsstatsd et Prometheus![]() | Signature de code gratuite sur Windows fournie par signpath.io, certificat par SignPath Foundation |