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.
-
facilityest 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 -
severityest 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écuterpour 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 :
journalctlaffiche tous les logs ;journalctl -p erraffiche les logs ayant une severity donnée ;journalctl -u sshaffiche les logs pour une unité systemd ;journalctl -t sudoaffiche les logs pour une commande donnée ;journalctl -u NetworkManager --since "1 hour ago"affiche les messages dans la dernière heure ;journalctl -n 10affiche les 10 dernières lignes ;journalctl -faffiche 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.confl'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 (
rsyslogousyslog-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. Pare-feux
18.4.1. Introduction
Un pare-feu (uk: firewall) est un service chargé de filtrer le trafic entrant ou sortant à partir de règles.
Un pare-feu peut être local, virtuel, ou tourner sur une machine dédiée :
- local : sur la machine physique ; des logiciels existent pour tous les OS, voire des distributions dédiées ;
- virtuel : dans une VM, avec du routage ;
- machine dédiée :
- il y a de nombreux constructeurs ; les machines pouvant être très puissantes, avec de l'apprentissage, etc (Cisco, Nortel, PaloAlto, ...)
- la plupart utilisent un OS dérivé de Linux ; certaines sont basées sur un BSD, sur Windows, ou encore sur un OS spécifique.
18.4.2. Sous Linux en local
Sous Linux, la plupart des pare-feux s'appuient sur le module netfilter
du noyau (module développé par Rusty Russel depuis 1998).
L'interface pour gérer les règles de netfilter est en général iptables (du
même auteur) pour IPv4, sous la forme d'une famille de commandes iptables-*,
et ip6tables (commandes ip6tables-*) pour IPv6.
Dans les versions antérieures du noyau (de 2.1 à 2.4), les pare-feux s'appuyaient
sur ipchains (du même auteur), et avant cela sur ipfw (depuis 1.1, porté
depuis FreeBSD).
La gestion des règles iptables peut être complexe, c'est pourquoi il existe
de nombreux front-end pour simplifier la tâche. Par ailleurs, la
tendance actuelle est que iptables soit remplacé par le projet
nftables.
Dans la suite nous présentons le front-end UFW.
18.4.3. Configuration simple avec UFW
UFW signifie Uncomplicated Firewall.
Il peut s'appuyer indifférement sur iptables ou nftables.
UFW se présente sous la forme d'une
commande ufw avec un certain nombre d'options.
Il existe également une version graphique gufw.
Les paquets correspondants sont ufw et gufw.
La configuration se fait principalement en ligne de commandes ; voici une configuration typique :
-
Par défaut on interdit toutes les connexions entrantes, et on autorise toutes les connexions sortantes :
$ sudo ufw default deny incoming $ sudo ufw default allow outgoing -
Ensuite on autorise les connexions
sshentrantes :$ sudo ufw allow sshSi le port de
sshdn'est pas 22, mais par exemple 10022, on écrira plutôt$ sudo ufw allow ssh 10022/tcp -
Pour le moment le firewall est inactif :
$ sudo ufw status État : inactifOn active le pare-feu (nécessaire uniquement lorsqu'on vient d'installer le paquet) :
$ sudo ufw enable Le pare-feu est actif et lancé au démarrage du système -
On peut ensuite lister les règles actives :
$ sudo ufw status numbered État : actif Vers Action De ---- ------ -- [ 1] 22/tcp ALLOW IN Anywhere [ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)
L'option numbered affiche le numéro de chaque règle, ce qui permet par
exemple de supprimer une règle :
$ sudo ufw delete 2
Les modifications effectuées avec ufw sont permanentes ; la commande
les stocke dans les fichiers /etc/ufw/*.rules.
Les différents fichiers dans /etc/ufw/ et /etc/ufw/applications.d/
contiennent tout un ensemble de règles qui viennent
avec l'installation du paquet. Pour les afficher :
$ sudo ufw show raw
...
$ sudo ufw app list
Applications disponibles :
CUPS
OpenSSH
$ sudo ufw app info CUPS
...
Par exemple, pour autoriser le serveur multimédia UMS, on rajoutera le fichier
$ cat /etc/ufw/applications.d/ums
[UMS]
title=Universal Media Server, an UPnP server
description=UMS is a free UPnP server
ports=9000/udp|9001:9002/tcp|5001/tcp
puis on exécutera les commandes :
$ sudo ufw app update UMS
$ sudo ufw allow UMS
Selon la charge du réseau, les fichiers de logs peuvent rapidement se remplir
avec des messages de blocage du pare-feux.
On peut arrêter les logs du pare-feux avec ufw logging off (et les rétablir
si besoin avec ufw logging on).
On peut aussi configurer cron pour qu'il exécute logrotate plus souvent,
et configurer la taille max des logs pour logrotate.
Les différentes possibilités de UFW sont décrites dans ces documents :
18.4.4. Compléments
UFW demeure néanmoins assez simpliste, et pour des scénarios plus sophistiqués
il faudra revenir à des règles iptables ou nftables, ou utiliser un
front-end plus élaboré.
Par exemple, le front-end firewalld offre la
possibilité :
- de gérer des règles pour de nombreux backends (
iptables,nftables,ebtables,ipset, ...), - de déclarer des zones de confiance,
- de distinguer la configuration permanente de celle donnée au runtime,
- de commander le pare-feux via le D-Bus, et donc de permettre une intégration complète avec le Desktop.
De plus dans firewalld, de nombreux éléments sont prédéfinis, il y a un
langage riche de configuration, et une interface graphique est fournie.
firewalld est installé par défaut sur CentOS, et disponible sur de nombreuses
distributions, dont Debian et Ubuntu.
Pour tester : systemctl status firewalld ; firewall-cmd --help.
Il existe des outils complémentaires, tels que fail2ban, voir
le wiki d'installation pour Ubuntu :
cet outil analyse les logs, et est capable de rajouter automatiquement des
règles iptables ou nftables pour bannir des IPs, par exemple au bout de
10 échecs de connexion ssh.
Une possibilité intéressante est le port knocking, qui est une méthode permettant de modifier le comportement d'un firewall en temps réel pour provoquer l'ouverture d'un port suite au lancement préalable d'une suite de connexions sur des ports distincts dans un certain ordre. Exemple sur le wiki Ubuntu.