Administration Unix - CM séance 19
18. Services réseau (suite)
18.3. La gestion des logs
Les logs désignent des journaux d'événements d'un système informatique.
Ils sont traditionnellement stockés dans /var/log/
.
18.3.1. Le système de logs syslog
Syslog définit un protocole et des outils pour fournir un service de logs.
Il a été développé dans les années 1980 par Eric Allman pour le projet Sendmail, puis est devenu la solution de journalisation standard sur les systèmes Unix.
Syslog est caractérisé par plusieurs éléments :
-
Plusieurs RFC :
RFC 3164 The BSD syslog protocol RFC 3195 Reliable Delivery for syslog RFC 5424 The Syslog Protocol RFC 5425 TLS Transport Mapping for Syslog RFC 5426 Transmission of Syslog Messages over UDP ...
Voir https://en.wikipedia.org/wiki/Syslog#Internet_standard_documents
-
Plusieurs programmes (et leurs implémentations, éventuellement sous la forme d'un serveur qui écoute sur le réseau).
-
Des fichiers dans lesquels les logs sont stockés.
-
Des librairies.
-
Les messages peuvent être émis par des programmes en local, ou des machines à distance.
-
L'enregistrement des messages sera réalisé en local, dans des fichiers (habituellement dans le répertoire
/var/log
), mais il peut aussi être dans une base de données ou sur une machine distante.
Dans le cas d'un enregistrement dans des fichiers, il loguera des messages sous la forme :
Mar 17 15:50:27 localhost NetworkManager[1571]: <info> (eth1): DHCPv4 changed
Mar 17 15:50:28 localhost dhclient: Listening on LPF/eth1/80:00:60:0f:e8:00
Mar 17 15:50:28 localhost dhclient: Sending on LPF/eth1/80:00:60:0f:e8:00
Un événement est constitué par 3 éléments : facility
, severity
et un message.
-
facility
est un canal qui est fonction de leur origine :0 KERN messages du noyau 1 USER messages au niveau user 2 MAIL gestion des mails 3 DAEMON démons système 4 AUTH messages de sécurité/autorisations 5 SYSLOG messages internes générés par syslogd 6 LPR gestion des impressions 7 NEWS gestion des news 8 UUCP gestion uucp 9 CRON démon cron 10 AUTHPRIV messages privés de sécurité/autorisations 11 FTP démon ftp 16-23 LOCAL0-LOCAL7 réservés pour usage local
-
severity
est un drapeau qui concerne leur gravité :0 Emerg (emergency) Système inutilisable 1 Alert Une intervention immédiate est nécessaire 2 Crit (critical) Erreur critique pour le système 3 Err (error) Erreur de fonctionnement 4 Warning Avertissement 5 Notice Événement normal méritant d'être signalé 6 Info Pour information seulement 7 Debug Message de mise au point
-
le message lui-même qui est un texte, par exemple
dhclient: Sending on LPF/eth1/80:00:60:0f:e8:00
On verra plus loin l'utilisation de facility
et severity
.
18.3.2. Le projet syslog-ng
Ce programme a vu le jour en 1998, développé par Balázs Scheidler.
Il est distribué sous plusieurs formes (open source, ou propriétaire avec des modules supplémentaires et un support).
Il étend le protocole syslog
de base avec de nouvelles fonctionnalités telles
que :
- un filtrage basé sur le contenu ;
- la connexion directe à une base de données.
Le fichier de configuration est /etc/syslog-ng/syslog-ng.conf
.
Il est complètement différent du fichier de configuration de syslog
.
Il comprend 5 mots clé :
Options les options génériques du programme
Source permet de définir comment il reçoit les informations
(écouter en local, sur le réseau, surveiller tel fichier, etc).
Destination permet de définir la destination des messages (écrire dans un
fichier, sur le réseau vers la machine untel en tcp, etc).
Filter permet de définir des filtres sur le contenu des messages
(seulement les messages de warning, pas les messages de tel
programme, etc).
Log ce sont ces directives qui permettent aux filtres d'agir sur
des sources, et de renvoyer tout cela vers des destinations :
c'est ici que l'on dit explicitement à syslog-ng d'agir.
Par exemple :
options {
time-reap(30); # timeout fichier idle
mark-freq(10); # durée entre 2 msg MARK (alive)
keep-hostname(yes);
};
source s_local {
system(); internal();
};
source s_network {
syslog(transport(tcp));
};
destination d_logs {
file(
"/var/log/syslog-ng/logs.txt"
owner("root")
group("root")
perm(0777)
);
};
log {
source(s_local); source(s_network); destination(d_logs);
};
- Voir :
man syslog-ng.conf
https://www.syslog-ng.com/products/open-source-log-management/
18.3.3. Le projet rsyslog
Le démon rsyslogd
(reliable and extended syslogd
) est développé depuis 2004
par Rainer Gerhards. Il était installé par défaut sur les systèmes Debian
(remplacé depuis par systemd-journal
).
Par rapport à syslog-ng
:
- les plus :
- la retenue des messages en mémoire tampon ;
- le protocole RELP (Reliable Event Loggin Protocol) ;
- des fichiers de configuration compatibles avec
syslog
;
- les moins :
- ne permet pas de surveiller directement un fichier ;
- le format des fichiers de configuration est moins souple.
La configuration se fait par les fichiers :
/etc/rsyslog.conf
/etc/rsyslog.d/*
(sur certains systèmes tout est dans rsyslogd.conf
).
Le fichier rsyslog.conf
contient
-
des déclarations de modules :
module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support ... # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") ... # Enable non-kernel facility klog messages $KLogPermitNonKernelFacility on
-
des directives globales :
$FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 ... $WorkDirectory /var/spool/rsyslog ... # Include all config files in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf
Les fichiers de rsyslog.d/
définissent des règles :
-
/etc/rsyslog.d/20-ufw.conf
:# enregistre les messages du firewall ufw dans un fichier :msg,contains,"[UFW " /var/log/ufw.log ...
-
/etc/rsyslog.d/50-default.conf
:auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log mail.err /var/log/mail.err *.emerg :omusrmsg:* local7.* /var/log/boot.log # centos8: msg de boot ...
La partie gauche concerne les règles sur les canaux et les gravités
(facility.severity
).
La partie droite de la règle est la destination. Cela peut être :
- un fichier : il sera écrit immédiatement, ou mis dans un tampon s'il est précédé d'un tiret ;
- un tube nommé, une console ;
- une destination réseau, sous la forme
@machine
(transmission en UDP) ou@@machine
(en TCP) ; - une liste d'utilisateurs (
:omusrmsg:*
signifie tous les users logués) ; ^programme_à_exécuter
pour passer le message à un programme ou un script ;~
: supprime les messages ;- etc.
- Voir :
man rsyslogd.conf
https://www.rsyslog.com/
18.3.4. Systemd journal
Installé par défaut sur Debian depuis la version 12.
Les événements sont mémorisés dans le répertoire /var/log/journal
:
$ tree /var/log/journal
/var/log/journal
└── 881e856bde44475f9d7cb824ea20fa1d
├── system@420f1aeb05934779b9df68b32b8eb90e-0000000000000001-00061b1bd31170a2.journal
├── system@420f1aeb05934779b9df68b32b8eb90e-0000000000000422-00061b1bd3304acc.journal
...
├── system.journal
├── user-1000@302e8eaf4ccb451abca9f56710c2fd45-000000000000d249-00062661a194d9ab.journal
├── user-1000@302e8eaf4ccb451abca9f56710c2fd45-000000000000f383-000626c7503e34a0.journal
├── user-1000.journal
...
1 directory, 100 files
Pour voir les logs on utilise la commande journalctl
:
journalctl
affiche tous les logs ;journalctl -p err
affiche les logs ayant une severity donnée ;journalctl -u ssh
affiche les logs pour une unité systemd ;journalctl -t sudo
affiche les logs pour une commande donnée ;journalctl -u NetworkManager --since "1 hour ago"
affiche les messages dans la dernière heure ;journalctl -n 10
affiche les 10 dernières lignes ;journalctl -f
affiche les nouveaux logs en continu.
Voir man journalctl
.
Les logs peuvent être configurés dans /etc/systemd/journald.conf
,
voir man.journald.conf
:
[Journal]
SystemMaxUse=500M
SystemMaxFileSize=100M
Il est possible d'utiliser quand même rsyslog
. Pour cela,
- installer le paquet
rsyslog
; - rajouter dans
/etc/systemd/journald.conf
l'optionForwardToSyslog=yes
(semble être activée par défaut).
18.3.5. Programmes annexes
Le programme logger
permet de générer un message de log.
Exemple :
-
dans un terminal, affichage dynamique de la fin de
syslog
$ tail -f /var/log/syslog
-
dans un autre terminal :
$ logger -p local3.info -- "Voici un message"
Il permet de tester un système de logs.
Par exemple :
$ logger "Message1"
$ logger -p local3.info "Message2"
$ logger -p mail.warning "Message3"
$ grep "Message[123]" /var/log/* 2>/dev/null
/var/log/mail.log:Mar 17 14:29:51 tesla thiel: Message3
/var/log/syslog:Mar 17 14:29:08 tesla thiel: Message1
/var/log/syslog:Mar 17 14:29:36 tesla thiel: Message2
/var/log/syslog:Mar 17 14:29:51 tesla thiel: Message3
Remarque : avec systemd-journal
, on peut obtenir les logs ainsi
(-g
grep avec expression régulière, -q
mode quiet) :
$ journalctl -g "Message[123]" -q
mars 21 11:14:26 localhost thiel[18801]: Message1
mars 21 11:26:49 localhost thiel[18901]: Message2
mars 21 11:27:01 localhost thiel[18902]: Message3
$ journalctl -g "Message[123]" -q -p warning
mars 21 11:27:01 localhost thiel[18902]: Message3
$ journalctl -g "Message[123]" -q --facility=mail
mars 21 11:27:01 localhost thiel[18902]: Message3
Le programme logrotate
permet de gérer la rotation des logs via une crontab
(les fichiers sont automatiquement compressés et numérotés).
-
la rotation est indépendante du système qui recueille les messages (
rsyslog
ousyslog-ng
). -
la configuration se fait via les fichiers
/etc/logrotate.conf
/etc/logrotate.d/*
elle permet de spécifier la périodicité, combien on garde de versions numérotées (par défaut 5), si on compresse les fichiers, etc.
Pour systemd-journal
, la rotation des logs se fait différement
(configuré dans /etc/systemd/journalct.conf
) avec les directives
Compress
, MaxRetentionSec
, MaxFileSec
; on peut aussi forcer une rotation avec
journalctl --rotate
.
La commande dmesg
affiche les messages spécifiques au noyau.
Pour voir les messages en direct : dmesg -w
Des programmes permettent d'effectuer des tris de logs et de la recherche, d'effectuer des analyses quotidiennes et d'envoyer les résultats par mail, d'afficher des rapports ou des tableaux de bord dans une page web :
zabbix
: https://www.zabbix.com/nagios
: https://www.nagios.com/solutions/open-source-log-monitoring/grafana
: https://grafana.com/oss/prometeus
: https://prometheus.io/loganalyser
: https://loganalyzer.adiscon.com/logstash
: https://www.elastic.co/fr/logstashlogwatch
: sourcesoctopussy
: sources- ...
18.4. Installation d'un serveur DHCP
18.4.1. Installation du serveur
Le seul paquet nécessaire est isc-dhcp-server
.
Le serveur doit avoir des interfaces directement sur les réseaux pour lesquels il distribue des adresses IP.
Il y a 2 fichiers de configuration :
-
/etc/default/isc-dhcp-server
pour les options de configuration du service (fichiers à lire, PID, interfaces auxquelles se connecter) :#DHCPDCONF=/etc/dhcp/dhcpd.conf #DHCPDPID=/var/run/dhcpd.pid INTERFACES="enp0s8 ensp0s9"
-
/etc/dhcp/dhcpd.conf
pour la configuration du programme :- les options DHCP
- la définition des zones du DNS
Le fichier par défaut contient des directives générales, et des définitions de zones et d'adresses fixes :
# nom du serveur DHCP
server-name "dhcp.mondomaine.lan";
# suffixe domaine
option domain-name "mondomaine.lan";
# serveurs de noms
option domain-name-servers 192.168.1.1, 192.168.1.2;
# type de mise à jour du DNS (aucune)
ddns-update-style none;
# mode autoritaire
authoritative;
# adresse réseau donnée pour une durée en secondes
default-lease-time 600;
# durée maximale en secondes pour une adresse réseau lorsque le client
# demande une durée spécifique
max-lease-time 7200;
# masque de sous-réseau, broadcast, passerelle, serveur de date
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option ntp-servers 192.168.1.254;
# autoriser/interdire (allow/deny) les clients inconnus, c-à-d non dans
# la liste d'adresses MAC ci-dessous
allow unknown-clients;
subnet 192.168.1.0 netmask 255.255.255.0 {
# plages d'adresses IP assignée au client
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
# IP fixes à partir des adresses MAC
host client1 {
hardware ethernet 12:34:56:78:90:AB;
fixed-address 192.168.1.101;
}
host client2 {
hardware ethernet 23:45:67:89:0A:BC;
fixed-address 192.168.1.102;
}
}
# messages syslog
log-facility local7;
Pour les diagnostics : /var/log/syslog
Pour gérer le service :
$ systemctl status|start|stop isc-dhcp-server
Voir : https://doc.ubuntu-fr.org/isc-dhcp-server
18.4.2. Configuration du client
Pour configurer une interface en dhcp
, on peut utiliser la commande :
$ dhclient eth0
Elle enverra une requête pour configurer l'interface eth0
, et gérera ensuite
le bail.
Pour libérer le bail, il suffira d'utiliser l'option -r
de cette commande :
$ dhclient -r eth0
Pour que la configuration soit inscrite dans un fichier, il faudra modifier le
fichier /etc/network/interfaces
, et utiliser la directive dhcp
:
allow-hotplug eth0
iface eth0 inet dhcp
Après quoi les commandes ifup
et ifdown
permettront de lancer et désactiver
l'interface (voir aussi section 17.2.1).
Voir :
man dhclient.conf
.
- Remarque :
- Les clients basés sur
networkmanager
ont un clientdhcp
intégré. Il est possible de configurernetworkmanager
pour utiliserdhclient
, voir ce lien.