Lors du déploiement de Graylog dans l'environnement de production, nous avons rencontré quelques problèmes, dont le plus important était l'impossibilité d'installer MongoDB et l'impossibilité de redémarrer la machine à tout moment pour modifier les paramètres du BIOS afin de résoudre le problème [ ] WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
. À la recherche d'une solution plus réalisable, nous avons décidé de porter notre attention sur un autre système de gestion de journaux puissant : Grafana Loki. Dans le même temps, nous avons également utilisé nfcolector pour collecter les informations Netflow des périphériques réseau et les enregistrer dans InfluxDB. Enfin, nous avons utilisé Grafana pour afficher de manière centralisée tous ces journaux et données collectés, offrant ainsi une interface plus belle et plus intuitive pour la gestion quotidienne des périphériques réseau. Cette combinaison d'architecture et d'outils nous permet d'obtenir de meilleurs résultats en matière de gestion et de surveillance des périphériques réseau.
Architecture
Grafana Loki
Grafana Loki est un système d'agrégation de journaux open source. Il vous permet de collecter, stocker, parcourir et interroger des données de journaux distribuées à grande échelle. Comparé aux systèmes traditionnels de gestion des bûches, le concept de conception de Grafana Loki est plus léger et efficace.
Avec Grafana Loki, vous implémentez la gestion des journaux via deux composants principaux : Loki et Promtail.
-
Loki : Loki est le cœur du système Grafana Loki, qui est un système de stockage de journaux distribué. Loki diffère du stockage de journaux traditionnel dans la mesure où il utilise des pipelines pour traiter et indexer les données afin que les données de journaux requises soient rapidement accessibles lorsqu'elles sont interrogées. Loki utilise un modèle de stockage basé sur des balises et prend en charge la mise à l'échelle horizontale, vous permettant de gérer de grandes quantités de données de journal.
-
Promtail : Promtail est un agent de collecte de journaux chargé de collecter les données de journaux provenant de diverses sources (telles que les fichiers, les journaux système, les journaux de conteneurs, etc.) et de les envoyer à Loki pour stockage. Promtail peut être intégré à diverses sources de journaux et prend en charge les formats de journaux standard, tels que JSON, GELF, etc.
Aller au collecteur Netflow(goNfCollector)
goNfCollector vous aide à collecter des données Netflow à partir de périphériques réseau. Il stocke toutes les informations nécessaires dans InfluxDB pour une analyse et une visualisation plus approfondies à l'aide de Grafana.
Grafana
Grafana est une plateforme de visualisation de données open source populaire. Il offre de puissantes capacités de visualisation de données et un riche écosystème de plug-ins, permettant aux utilisateurs de créer des tableaux de bord, des rapports et des alertes, et d'effectuer une analyse approfondie des données. Grafana peut être utilisé conjointement avec Grafana Loki, InfluxDB, etc. Grâce aux sources de données, vous pouvez facilement créer des requêtes de journaux et des tableaux de bord dans Grafana, ainsi qu'afficher et analyser les données de journaux et les données de surveillance de manière unifiée.
déployer
Déclaration environnementale
- Ubuntu 22.04
- Docker version 24.0.5
- Docker Compose version v2.20.2
1. Déploiement de rsyslog
Par défaut, Rsyslog est installé sur les serveurs Ubuntu. S'il n'est pas installé, vous pouvez l'installer en exécutant la commande suivante :
apt install rsyslog -y
Modifier le fichier de configuration/etc/rsyslog.conf
vim /etc/rsyslog.conf
Voici les résultats finaux et les explications approximatives :
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
$template RemoteLogs,"/var/log/network/%FROMHOST-IP%.log" *
*.* ?RemoteLogs
& ~
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
-
module(load="imudp")
:imudp
module de chargement, qui fournit la fonction de réception Syslog du protocole UDP. UDP est un protocole sans connexion utilisé pour recevoir les messages Syslog envoyés par des hôtes distants. -
input(type="imudp" port="514")
: Configurez l'entrée Syslog UDP. Il spécifie que rsyslogd écoute sur le port local 514 pour recevoir les messages Syslog UDP. -
module(load="imtcp")
:imtcp
module de chargement, qui fournit la fonction de réception Syslog du protocole TCP. Contrairement à UDP, TCP est un protocole orienté connexion qui fournit une messagerie fiable. -
input(type="imtcp" port="514")
: Configurez l'entrée du syslog TCP. Il spécifie que rsyslogd écoute sur le port local 514 pour recevoir les messages syslog TCP. -
module(load="imklog" permitnonkernelfacility="on")
: Chargeimklog
un module qui fournit la prise en charge de la journalisation du noyau et permet de recevoir des messages klog non-noyau. klog est un périphérique spécial pour les journaux du noyau. -
$template RemoteLogs,"/var/log/network/%FROMHOST-IP%.log" *
: définit un modèle de journal nommé RemoteLogs. Il spécifie l'emplacement de sortie et le format du journal. Cela signifie ici de sauvegarder le journal de l'hôte distant dans le/var/log/network/
répertoire avec l'adresse IP comme nom de fichier. -
*.* ?RemoteLogs
: Il s'agit d'une règle de journal qui spécifie que tous les types de messages de journal sont envoyés à l'emplacement de sortie défini dans le modèle RemoteLogs. -
& ~
: Il s'agit d'une autre règle de journal qui spécifie d'ignorer tous les messages de journal correspondants. Le but ici est d'éviter que les messages soient traités de manière répétée.
Le but de ces lignes de configuration est de configurer rsyslogd pour recevoir des messages syslog de différentes sources et les enregistrer dans les fichiers journaux appropriés.
Après avoir enregistré la configuration, redémarrez le service rsyslog et vérifiez l'état
systemctl restart rsyslog
systemctl status rsyslog
netstat -nltup | grep 514
2. Déploiement de goNfCollector
Exigences environnementales : les outils docker, docker-compose et wget doivent être installés. Il est requis pendant le processus d'installation 魔法
, sinon il risque d'échouer.Télécharger
la dernière version : Téléchargez la dernière version du fichier de script en local via la commande suivante :
wget -O latest.sh https://raw.githubusercontent.com/javadmohebbi/goNfCollector/main/dockerize/build-up-from-github.sh
Rendre le fichier de script exécutable : accordez les autorisations d'exécution au fichier de script téléchargé via la commande suivante :
chmod +x latest.sh
Exécutez le script téléchargé : Exécutez le fichier de script téléchargé avec la commande suivante :
./latest.sh
Lors de l'exécution, il peut vous être demandé de saisir votre mot de passe utilisateur.
Après exécution, le script vous indiquera comment exécuter le conteneur. Mais nous n’en avons pas besoin pour exécuter le conteneur.
3. Déploiement de Grafana Loki
Parce qu'il est déployé à l'aide d'un environnement docker, il est relativement pratique. Il vous suffit de modifier le fichier de composition docker, de fusionner influxdb et nfcolector à l'étape précédente et de modifier les paramètres réseau.
version: "3"
networks:
loki:
external: true
services:
loki:
image: grafana/loki:2.8.0
ports:
- "3100:3100"
volumes:
- loki-config:/etc/loki
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:2.8.0
volumes:
- promtail-config:/etc/promtail
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
networks:
- loki
grafana:
environment:
- GF_PATHS_PROVISIONING=/etc/grafana/provisioning
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,agenty-flowcharting-panel
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: http://loki:3100
basicAuth: false
isDefault: true
version: 1
editable: false
EOF
/run.sh
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
networks:
- loki
# Influx DB
influxdb:
image: influxdb:2.0.7
restart: always
volumes:
- /docker/nfcollector/vendors/influxdb:/var/lib/influxdb2
ports:
- "8086:8086"
# - "8082:8082"
#- "8089:8089"
networks:
- loki
nfcolector:
image: javadmohebbi/gonfcollector
restart: always
# network_mode: host
ports:
- "6859:6859/udp"
volumes:
- /docker/nfcollector/bin:/opt/nfcollector/bin
- /docker/nfcollector/etc:/opt/nfcollector/etc
- /docker/nfcollector/var:/opt/nfcollector/var
- /docker/nfcollector/vendors:/opt/nfcollector/vendors
networks:
- loki
environment:
- NFC_DEBUG=true
# total number of cpu nfcollector could use
- NFC_CPU_NUM=0
- NFC_LISTEN_ADDRESS=0.0.0.0
- NFC_LISTEN_PORT=6859
- NFC_INFLUXDB_HOST=influxdb
- NFC_INFLUXDB_PORT=8086
- NFC_INFLUXDB_TOKEN=5vqt0q0b4g_lZwNgp7-8GgPq5Nxf3YY37xbVZP_ypeK_G3dwdNlTrAkcKN_Q6QzbmG-Th96lT_65Kp0j2UD1HA==
- NFC_INFLUXDB_BUCKET=nfCollector
- NFC_INFLUXDB_ORG=OPENINTELLIGENCE
- NFC_IP_REPTATION_IPSUM=/opt/nfcollector/vendors/ipsum/ipsum.txt
- NFC_IP2L_ASN=/opt/nfcollector/vendors/ip2location/db/IP2LOCATION-LITE-ASN.IPV6.CSV/IP2LOCATION-LITE-ASN.IPV6.CSV
- NFC_IP2L_IP=/opt/nfcollector/vendors/ip2location/db/IP2LOCATION-LITE-DB11.IPV6.BIN/IP2LOCATION-LITE-DB11.IPV6.BIN
- NFC_IP2L_PROXY=/opt/nfcollector/vendors/ip2location/db/IP2PROXY-LITE-PX10.IPV6.CSV/IP2PROXY-LITE-PX10.IPV6.CSV
- NFC_IP2L_LOCAL=/opt/nfcollector/vendors/ip2location/local-db/local.csv
- NFC_SOCK_PATH=/opt/nfcollector/var/socket/fw.socket
volumes:
loki-config:
promtail-config:
grafana-storage:
Après l'édition, utilisez la ligne de commande pour vérifier les paramètres yaml et démarrer Docker
docker compose config #命令用于验证和查看`docker-compose.yaml`文件的配置。
docker compose up -d #命令用于在后台启动并运行基于`docker-compose.yaml`文件定义的容器组。其中,`-d`标志表示以后台(守护)模式运行容器。
Visitez Grafana
Accédez à la plateforme Grafana en accédant à http://hostip:3000. Le mot de passe initial est admin/admin.
Suivi
- Videz les journaux des périphériques réseau et Netflow vers le service correspondant.
- Filtrer et afficher les données sur Grafana.
Référence
[1] https://github.com/javadmohebbi/goNfCollector
[2] https://grafana.com/docs/loki/latest/installation/docker/
[3] https://github.com/grafana/loki
[ 4] https://github.com/grafana/grafana