Aller au contenu

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 est installé par défaut sur les systèmes Debian.

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. 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

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 ou syslog-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.

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 :

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 client dhcp intégré. Il est possible de configurer networkmanager pour utiliser dhclient, voir ce lien.