Article en cours … Voir :
- Munin : voir les actions / mails
I Iptables
I.1 Exemple de script (simple) pour configuration d’un firewall
Exemple de script de configuration (à améliorer) :
#!/bin/bash
echo "--------------------------"
echo "-- Configuration IPSET ---"
echo "--------------------------"
wget -O /home/xavior/scripts/bl_all.txt https://lists.blocklist.de/lists/all.txt # téléchargement black list : dernière attaque connue -24h tout port confondu
ipset -exist create blacklist hash:ip # création de la liste "blacklist"
ipset flush blacklist # vide la table
# parcours fichier et intégration dans ipset
while read line
do
ipset add blacklist $line
done < /home/xavior/scripts/bl_all.txt
echo "--------------------------"
echo "- Configuration parefeu --"
echo "--------------------------"
IPTABLES='/usr/sbin/iptables' # Commande par defaut
# argument ?
if [ -n "$1" ]; then # Teste si arg1 contient une string
IPTABLES=$1
fi
echo "Utilisation de la commande : $IPTABLES"
# Réinitialisation des chaines
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
# Politique par défaut des chaines
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT # Autoriser les connexions déjà établies
#######################
# Chaine OUPUT / INPUT
$IPTABLES -A INPUT -i lo -j ACCEPT # Boucle locale
$IPTABLES -A OUTPUT -o lo -j ACCEPT # Boucle locale
# IPSET
$IPTABLES -A INPUT -m set --match-set blacklist src -j LOG --log-prefix 'IPTABLES_DROP_IN_BL '
$IPTABLES -A INPUT -m set --match-set blacklist src -j DROP
$IPTABLES -A OUTPUT -m set --match-set blacklist dst -j LOG --log-prefix 'IPTABLES_DROP_OUT_BL '
$IPTABLES -A OUTPUT -m set --match-set blacklist dst -j DROP
# PING
$IPTABLES -A INPUT -i wlp2s0 -p icmp -j ACCEPT # On autorise les pings sur carte WIFI
$IPTABLES -A INPUT -i eno1 -p icmp -j ACCEPT # On autorise les pings sur carte LAN
#$IPTABLES -A OUTPUT -p icmp -j ACCEPT # Autorise sortie PING
###############################
# Services SERVEUR sur PC
# Port web
$IPTABLES -A INPUT -p tcp --dport 80 -j LOG --log-prefix 'IPTABLES_IN_80 '
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 443 -j LOG --log-prefix 'IPTABLES_IN_443 '
$IPTABLES -A INPUT -p tcp --dport 443 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT # Serveur SSH
$IPTABLES -A INPUT -p tcp --dport 4049 -j ACCEPT # Munin-node
# regle pour que ces protocoles / port n'apparaissent pas dans les log
$IPTABLES -A INPUT -p udp --dport 5353 -j DROP # Multicast DNS
$IPTABLES -A INPUT -p udp --dport 7437 -j DROP # Multicast du routeur maison (? service)
$IPTABLES -A INPUT -p udp --dport 135 -j DROP # EPMAP (RPC)
$IPTABLES -A INPUT -p udp --dport 137 -j DROP # NetBios Name Service
$IPTABLES -A INPUT -p udp --dport 138 -j DROP # Netbios Datagram Service
$IPTABLES -A INPUT -p udp --dport 139 -j DROP # Netbios Session Service
$IPTABLES -A INPUT -p tcp --dport 135 -j DROP # EPMAP RPC
$IPTABLES -A INPUT -p tcp --dport 137 -j DROP # NetBios / SMB
$IPTABLES -A INPUT -p tcp --dport 138 -j DROP # NetBios / SMB
$IPTABLES -A INPUT -p tcp --dport 139 -j DROP # NetBios / SMB
$IPTABLES -A INPUT -p udp --dport 67 -j DROP # Bootp du routeur local
$IPTABLES -A INPUT -p udp --dport 68 -j DROP # Bootp du routeur local
$IPTABLES -A INPUT -p udp --dport 20002 -j DROP # Multicast routeur maison
$IPTABLES -A INPUT -p igmp -d 224.0.0.1/24 -j DROP #IGMP Multicast routeur maison
# LOG du reste ...
$IPTABLES -A INPUT -j LOG --log-prefix 'IPTABLES_IN_DROP ' # on loggue les DROP ...
$IPTABLES -A OUTPUT -j LOG --log-prefix 'IPTABLES_OUT ' # on loggue la sortie ...
# Affichage global
echo "IPATBLES : "
$IPTABLES -L -v # Affichage des règles
echo "IPSET : "
ipset list -t
1.2 Vérifier la prise en compte
Pour vérifier il suffit de lire ma table d’iptables :
sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate ESTABLISHED
ACCEPT all -- anywhere anywhere
LOG all -- anywhere anywhere match-set blacklist src LOG level warning prefix "IPTABLES_DROP_IN_BL "
DROP all -- anywhere anywhere match-set blacklist src
ACCEPT icmp -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
LOG tcp -- anywhere anywhere tcp dpt:http LOG level warning prefix "IPTABLES_IN_80 "
ACCEPT tcp -- anywhere anywhere tcp dpt:http
LOG tcp -- anywhere anywhere tcp dpt:https LOG level warning prefix "IPTABLES_IN_443 "
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:4049
DROP udp -- anywhere anywhere udp dpt:mdns
DROP udp -- anywhere anywhere udp dpt:7437
DROP udp -- anywhere anywhere udp dpt:135
DROP udp -- anywhere anywhere udp dpt:netbios-ns
DROP udp -- anywhere anywhere udp dpt:netbios-dgm
DROP udp -- anywhere anywhere udp dpt:netbios-ssn
DROP tcp -- anywhere anywhere tcp dpt:epmap
DROP tcp -- anywhere anywhere tcp dpt:netbios-ns
DROP tcp -- anywhere anywhere tcp dpt:netbios-dgm
DROP tcp -- anywhere anywhere tcp dpt:netbios-ssn
DROP udp -- anywhere anywhere udp dpt:bootps
DROP udp -- anywhere anywhere udp dpt:bootpc
DROP udp -- anywhere anywhere udp dpt:20002
DROP igmp -- anywhere base-address.mcast.net/24
LOG all -- anywhere anywhere LOG level warning prefix "IPTABLES_IN_DROP "
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
LOG all -- anywhere anywhere match-set blacklist dst LOG level warning prefix "IPTABLES_DROP_OUT_BL "
DROP all -- anywhere anywhere match-set blacklist dst
LOG all -- anywhere anywhere LOG level warning prefix "IPTABLES_OUT "
Néanmoins ce n’est pas optimal car on ne voit pas les règles sur les interfaces. il vaut mieux préférer les options suivantes pour visualier les targets et interfaces in et out :
sudo iptables -L -v
Chain INPUT (policy DROP 40 packets, 4648 bytes)
pkts bytes target prot opt in out source destination
1130K 34G ACCEPT all -- any any anywhere anywhere ctstate ESTABLISHED
1400 106K ACCEPT all -- lo any anywhere anywhere
0 0 LOG all -- any any anywhere anywhere match-set blacklist src LOG level warning prefix "IPTABLES_DROP_IN_BL "
0 0 DROP all -- any any anywhere anywhere match-set blacklist src
0 0 ACCEPT icmp -- wlp2s0 any anywhere anywhere
0 0 ACCEPT icmp -- eno1 any anywhere anywhere
1 52 LOG tcp -- any any anywhere anywhere tcp dpt:http LOG level warning prefix "IPTABLES_IN_80 "
1 52 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
98 5096 LOG tcp -- any any anywhere anywhere tcp dpt:https LOG level warning prefix "IPTABLES_IN_443 "
98 5096 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:4049
...
Nous n’irons pas plus loin sur iptables car l’objectif n’est pas de montrer le fonctionnement de ce dernier.
II IPSET
II.1 Présentation
Lorsqu’il faut bloquer plusieurs milliers d’adresses IP iptables trouve ses limites :
- dans la performance à traiter ces règles,
- dans le lecture du fichier de configuration ou la table des règles (iptable -L -v).
Pour cela il existe IPSET qui permettant de peupler des tables spécifiques et à la volée. Les performances de traitement sont meilleures car il utilise des tables de hashage pour stocker puis récupérer les adresses IP à bannir, ce qui est plus rapide que la lecture séquentielle des règles via iptables.
II.2 Installation
sudo apt install ipset
II.3 Commandes IPSET utiles
Pour créer une liste :
Il existe différente table à utiliser qui prennent en compte @IP, @MAC, notation CIDR, spécification d’un port ou pas, interface spécifique, etc.
La liste étant la suivante :
list:set 3 skbinfo support
list:set 2 comment support
list:set 1 counters support
list:set 0 Initial revision
hash:mac 0 Initial revision
hash:ip,mac 0 Initial revision
hash:net,iface 7 skbinfo and wildcard support
hash:net,iface 6 skbinfo support
hash:net,iface 5 forceadd support
hash:net,iface 4 comment support
hash:net,iface 3 counters support
hash:net,iface 2 /0 network support
hash:net,iface 1 nomatch flag support
hash:net,iface 0 Initial revision
hash:net,port 7 skbinfo support
hash:net,port 6 forceadd support
hash:net,port 5 comment support
hash:net,port 4 counters support
hash:net,port 3 nomatch flag support
hash:net,port 2 Add/del range support
hash:net,port 1 SCTP and UDPLITE support
hash:net,port,net 2 skbinfo support
hash:net,port,net 1 forceadd support
hash:net,port,net 0 initial revision
hash:net,net 2 skbinfo support
hash:net,net 1 forceadd support
hash:net,net 0 initial revision
hash:net 6 skbinfo support
hash:net 5 forceadd support
hash:net 4 comment support
hash:net 3 counters support
hash:net 2 nomatch flag support
hash:net 1 Add/del range support
hash:net 0 Initial revision
hash:ip,port,net 7 skbinfo support
hash:ip,port,net 6 forceadd support
hash:ip,port,net 5 comment support
hash:ip,port,net 4 counters support
hash:ip,port,net 3 nomatch flag support
hash:ip,port,net 2 Add/del range support
hash:ip,port,net 1 SCTP and UDPLITE support
hash:ip,port,ip 5 skbinfo support
hash:ip,port,ip 4 forceadd support
hash:ip,port,ip 3 comment support
hash:ip,port,ip 2 counters support
hash:ip,port,ip 1 SCTP and UDPLITE support
hash:ip,mark 2 skbinfo support
hash:ip,mark 1 forceadd support
hash:ip,mark 0 initial revision
hash:ip,port 5 skbinfo support
hash:ip,port 4 forceadd support
hash:ip,port 3 comment support
hash:ip,port 2 counters support
hash:ip,port 1 SCTP and UDPLITE support
hash:ip 4 skbinfo support
hash:ip 3 forceadd support
hash:ip 2 comment support
hash:ip 1 counters support
hash:ip 0 Initial revision
bitmap:port 3 skbinfo support
bitmap:port 2 comment support
bitmap:port 1 counters support
bitmap:port 0 Initial revision
bitmap:ip,mac 3 skbinfo support
bitmap:ip,mac 2 comment support
bitmap:ip,mac 1 counters support
bitmap:ip,mac 0 Initial revision
bitmap:ip 3 skbinfo support
bitmap:ip 2 comment support
bitmap:ip 1 counters support
bitmap:ip 0 Initial revision
Dans notre cas nous allons utiliser une table de type « hash:ip ».
Création l’une liste :
sudo ipset create blacklist hash:ip
Par défaut cette liste ne pourra pas contenir plus de 65536 entrée.
Visualiser les listes gérées par IPSET :
sudo ipset list
Name: blacklist
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 200
References: 0
Number of entries: 0
Members:
Name: blacklist2
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 128000
Size in memory: 200
References: 0
Number of entries: 0
Members:
Ici nous voyons 2 listes dont celle que nous venons de créer.
On préférera à termes les options suivantes :
sudo ipset list -t #Affiche les listes avec entêtes sans les @IP
sudo ipset list -n #Affiche que les noms des listes
Pour voir les règles d’une liste particulière :
sudo ipset list blacklist # Les options -t ou -n restent valables
Enfin il existe des options de sortie sous différent format tel que le xml par ex. A voir dans le man d’iptables
Suppression d’une liste :
Pour supprimer une liste il faut utiliser l’option « destroy »
sudo ipset destroy blacklist
Peupler une liste :
Le principe est d’ajouter dans une liste existante l’adresse ip voulue
sudo ipset add blacklist 192.168.1.10 # ajoute une adresse IP
sudo ipset add blacklist 192.168.2.0/24 # va ajouter toutes les adresses IP de la classe
Vider une liste :
sudo ipset flush blacklist
II.4 IPSET avec IPTABLES
Après avoir créer nos listes d’adresses IP, il faut indiquer à iptables comment les utiliser (bien faire attention à son emplacement suivant la politique choisie).
$IPTABLES -A INPUT -m set --match-set blacklist src -j LOG --log-prefix 'LOG_IPTABLES_DROP_BLACKLIST '
$IPTABLES -A INPUT -m set --match-set blacklist src -j DROP
$IPTABLES -A OUTPUT -m set --match-set blacklist dst -j LOG --log-prefix 'LOG_IPTABLES_DROP_BLACKLIST '
$IPTABLES -A OUTPUT -m set --match-set blacklist dst -j DROP
Nous avons appliquer ici un filtrage tant pour les flux entrants que sortant.
Maintenant les listes peuvent être peuplées à part avec IPSET, et ce, de manière dynamique !
Exemple de script d’automatisation de mise en oeuvre d’une blacklist :
wget -O /home/xavior/scripts/bl_all.txt https://lists.blocklist.de/lists/all.txt # téléchargement black list : dernière attaque connue -24h tout port confondu
ipset -exist create blacklist hash:ip # création de la liste "blacklist"
ipset flush blacklist # vide la table
# parcours fichier et intégration dans ipset
while read line
do
ipset add blacklist $line
done < /home/xavior/scripts/bl_all.txt
Pour plus d’information sur cette liste aller voir le site suivant : https://www.blocklist.de
III Conntrack
III.1 L’outil conntrack
Conntrack permet de suivre les connexions de netfilter. Je l’ai utiliseréour voir si des connexions rdp étaient établies entre le serveur « broker » et les instances Windows à lier.
Mais cet outil permet de manipuler directement les règles. Ce que nous ne verrons pas ici.
Pour visualiser la table, sous ubuntu, il faut passer par l’outil « Conntrack-tools », Les fichiers nf_conntrack ou ip_conntrack dans /proc/net/ n’étant plus disponibles.
Pour l’installer :
apt install conntrack
Afin de voir la table des connexions il faut taper la commande suivante :
sudo conntrack -L
tcp 6 51 TIME_WAIT src=192.168.2.136 dst=146.88.232.72 sport=40740 dport=80 src=146.88.232.72 dst=192.168.2.136 sport=80 dport=40740 [ASSURED] mark=0 use=1
unknown 2 346 src=192.168.2.233 dst=224.0.0.251 [UNREPLIED] src=224.0.0.251 dst=192.168.2.233 mark=0 use=1
udp 17 27 src=192.168.2.1 dst=255.255.255.255 sport=55870 dport=7437 [UNREPLIED] src=255.255.255.255 dst=192.168.2.1 sport=7437 dport=55870 mark=0 use=1
tcp 6 99 TIME_WAIT src=192.168.2.136 dst=35.232.111.17 sport=52762 dport=80 src=35.232.111.17 dst=192.168.2.136 sport=80 dport=52762 [ASSURED] mark=0 use=1
tcp 6 36 TIME_WAIT src=192.168.2.136 dst=146.88.232.72 sport=40738 dport=80 src=146.88.232.72 dst=192.168.2.136 sport=80 dport=40738 [ASSURED] mark=0 use=1
tcp 6 431991 ESTABLISHED src=192.168.2.136 dst=192.168.1.10 sport=52644 dport=445 src=192.168.1.10 dst=192.168.2.136 sport=445 dport=52644 [ASSURED] mark=0 use=1
unknown 2 593 src=192.168.2.1 dst=224.0.0.1 [UNREPLIED] src=224.0.0.1 dst=192.168.2.1 mark=0 use=1
tcp 6 431998 ESTABLISHED src=192.168.2.136 dst=159.89.97.13 sport=55536 dport=443 src=159.89.97.13 dst=192.168.2.136 sport=443 dport=55536 [ASSURED] mark=0 use=1
tcp 6 431991 ESTABLISHED src=192.168.2.136 dst=192.168.1.10 sport=52642 dport=445 src=192.168.1.10 dst=192.168.2.136 sport=445 dport=52642 [ASSURED] mark=0 use=1
tcp 6 431742 ESTABLISHED src=192.168.2.136 dst=35.155.82.30 sport=58496 dport=443 src=35.155.82.30 dst=192.168.2.136 sport=443 dport=58496 [ASSURED] mark=0 use=1
tcp 6 96 TIME_WAIT src=192.168.2.136 dst=146.88.232.72 sport=40742 dport=80 src=146.88.232.72 dst=192.168.2.136 sport=80 dport=40742 [ASSURED] mark=0 use=1
tcp 6 431991 ESTABLISHED src=192.168.2.136 dst=192.168.1.10 sport=52640 dport=445 src=192.168.1.10 dst=192.168.2.136 sport=445 dport=52640 [ASSURED] mark=0 use=1
conntrack v1.4.5 (conntrack-tools): 12 flow entries have been shown.
III.2 Le service Conntrackd
Ces quelques lignes pour juste le mentionner. Ce service permet de répliquer l’état de suivi des connexions sur plusieurs serveurs. Cela sert notemment lorsque l’on veut monter un firewall en cluster et ainsi parer à une panne. Ayant le suivi de connexion, le passage d’un serveur à un autre permettra de ne pas perdre les sessions des utilisateurs. Mais attention, conntrackd ne fait que de la réplication de suivi de connexion. Il faudra ajouter des services supplémentaires pour gérer les adresses IP virtuelles par exemple.
IV Métrologie Munin
Nous allons utiliser Munin pour monitorer les accès réseaux via les log Iptables. Cet outil fait bien plus bien entendu …
Munin est composé de 2 briques principales :
- la partie serveur qui récolterera les données clientes et fera les états de surveillance,
- la partie cliente (à installer sur les autres serveurs) qui butinera les données.
IV.1 Munin serveur
IV.1.1 Installation et présentation rapide
Installation :
sudo apt install munin
Cela installe la partie serveur et également la partie noeud ou « node »
IV.1.2 Architecture générale
Peut bien comprendre ce que fait Munin, ci dessous un image générale présentant l’architecture :

Les fichiers de configuration se situent sur /etc/munin/* :
.
├── apache24.conf
├── munin.conf
├── munin-conf.d
├── munin-node.conf
├── plugin-conf.d
├── plugins
├── static
└── templates
Par défaut les fichiers suivant se trouvent ici sous ubuntu :
- dbdir /var/lib/munin
- htmldir /var/cache/munin/www
- logdir /var/log/munin
- rundir /var/run/munin
IV.1.3 Activation application web
Un exemple de configuration d’apache pour le serveur web est consultable dans le fichier « apache24.conf ».
Exemple pour un apache (déjà installé) :
cd /etc/munin/
sudo cp apache24.conf /etc/apache2/sites-available/apache_munin.conf
cd /etc/apache2/sites-enabled/
sudo ln -s ../sites-available/apache_munin.conf
sudo systemctl restart apache2
Une fois copié (et adapté à son infrastructure) nous devons avoir ceci pour la partie web (http://127.0.0.1/munin) :

On peut remarquer que des données sont déjà présentes car le client est installé sur le serveur.
Pour optimiser la partie web ou utiliser ce service via NGINX par exemple, il est recommandé de lire le README situé dans le répertoire « /usr/share/doc/munin ».
IV.2 Munin client
IV.2.1 Installation
Si munin a été installé alors il n’est pas nécessaiere d’installer le client. En revanche, sur un autre serveur il faut installer le client Munin nommé « munin-node » :
sudo apt install munin-node
Ensuite il faut configurer l’autorisation d’accès via le fichier conf /etc/munin/munin-node.conf pour authoriser le serveur à collecter les données :
# A list of addresses that are allowed to connect. This must be a
# regular expression, since Net::Server does not understand CIDR-style
# network notation unless the perl module Net::CIDR is installed. You
# may repeat the allow line as many times as you'd like
allow ^127\.0\.0\.1$
allow ^::1$
IV.2.2 Pluggin Munin
Les pluggins sont placés dans le répertoire suivant : »/etc/munin/plugins« . Ce sont des liens symbolique pointant vers des plugins situé dans « /usr/share/munin/plugins/ ».
Donc pour désactiver un plugin, il suffit d’enlever le lien symbolique. Extrait du répertoire :
/etc/munin/plugins$ ls -als
total 8
4 drwxr-xr-x 2 root root 4096 mai 9 11:58 .
4 drwxr-xr-x 7 root root 4096 mai 9 11:58 ..
0 lrwxrwxrwx 1 root root 29 mai 9 11:58 acpi -> /usr/share/munin/plugins/acpi
0 lrwxrwxrwx 1 root root 28 mai 9 11:58 cpu -> /usr/share/munin/plugins/cpu
0 lrwxrwxrwx 1 root root 33 mai 9 11:58 cpuspeed -> /usr/share/munin/plugins/cpuspeed
0 lrwxrwxrwx 1 root root 27 mai 9 11:58 df -> /usr/share/munin/plugins/df
0 lrwxrwxrwx 1 root root 33 mai 9 11:58 df_inode -> /usr/share/munin/plugins/df_inode
0 lrwxrwxrwx 1 root root 34 mai 9 11:58 diskstats -> /usr/share/munin/plugins/diskstats
0 lrwxrwxrwx 1 root root 32 mai 9 11:58 entropy -> /usr/share/munin/plugins/entropy
0 lrwxrwxrwx 1 root root 30 mai 9 11:58 forks -> /usr/share/munin/plugins/forks
0 lrwxrwxrwx 1 root root 37 mai 9 11:58 fw_conntrack -> /usr/share/munin/plugins/fw_conntrack
Le répertoire « /etc/munin/plugin-conf.d
» contient les fichiers de configuration des pluggins. On trouvera le fichier « munin-node » qui permet d’indiquer quel compte utiliser pour quel type de service à utiliser sur la machine à monitorer (ex : apache, conntrack, etc).
Il existe la commande qui permet de lister les plugin actifs et non actifs ou de voir si certains sont fonctionnels ou pas avec la raison : « munin-node-configure«
Exemple :
/etc/munin$ sudo munin-node-configure --suggest
Plugin | Used | Suggestions
------ | ---- | -----------
acpi | yes | yes
amavis | no | no [command logtail or file /var/log/mail.info not found]
apache_accesses | no | no [Port 80: Can't connect to pc-xavior:443 (certificate verify failed)]
apache_processes | no | no [Port 80: Can't connect to pc-xavior:443 (certificate verify failed)]
apache_volume | no | no [Port 80: Can't connect to pc-xavior:443 (certificate verify failed)]
apc_envunit_ | no | no [no units to monitor]
bonding_err_ | no | no [No /proc/net/bonding]
courier_mta_mailqueue | no | no [spooldir not found]
courier_mta_mailstats | no | no [could not find executable]
courier_mta_mailvolume | no | no [could not find executable]
cps_ | no | no [ipvsadm not found]
cpu | yes | yes
cpuspeed | yes | yes
cupsys_pages | no | no [logfile not found]
...
IV.2.3 Personnalisation Pluggin Munin
Il est possible de personnaliser les valeurs Warning et Critical pour la remonté d’information. Pour cela il faut modifier, suivant le type de pluggin, soit :
- le fichier /etc/munin/plugin-conf.d/munin-node ou autres fichiers dans ce répertoire ;
- le fichier /etc/munin/munin.conf en surchangeant certaines valeurs dans le groupe de serveur audité ;
- dans le pire des cas, le script.
Pour le cas du module « df », les variables « globales » telle que la valeur par defaut de Warning se modifie dans le fichier /etc/munin/plugin-conf.d/munin-node. Ci-dessous on passe le warning à 80% pour toutes les mesures d’espace occupée pour tous les disques trouvés.
[cps*]
user root
[df*]
env.warning 80
env.critical 98
env.exclude_re ^/run/user
[exim_mailqueue]
group adm, (Debian-exim)
Il est possible de spécifier des valeurs pour des disques spécifiques. Ceci se défénit dans le fichier /etc/munin/munin.conf
# a simple host tree
[localhost.localdomain]
address 127.0.0.1
use_node_name yes
df._dev_sda5.warning 70
Pour la prise en compte des modifications des valeurs, il faut relancer le service « munin-node » :
sudo systemctl restart munin-node
Pour voir les valeurs qui peuvent être modifiées, elles sont consultables dans les rapports, comme ci-dessous :

Il est également possible de voir les valeurs via ligne de commande avec la commande « munin-run » :
sudo munin-run df
_dev_sda5.value 85.6973293995805
_dev_shm.value 0
_run.value 0.228940200721419
_run_lock.value 0.078125
_sys_fs_cgroup.value 0
_dev_sda7.value 15.229950042718
IV.2.4 Munin et Iptables
Il existe à l’installation de Munin des rapports déjà existants tel que les connexions du parefeu (pluggin fw conntrack), l’etat de la bande passante (pluggin « fw packets »), etc ..
Exemple de graphe :

Dans notre cas, nous souhaitons avoir un graphe sur les LOG d’iptables. Par défaut il n’existe pas d’état préconfiguré pour ce cas d’usage.
Nous allons utiliser un pluggin existant qui permet de faire des recherches dans les fichiers log et compter suivant un pattern de recherche. Le pluggin utilisé sera « loggrep« .
Dans un premier temps il faut l’activer :
cd /etc/munin/pluggins
sudo ln -s /usr/share/munin/plugins/loggrep loggrep
Ensuite nous allons créer un fichier de configuration dans le répertoire « /etc/munin/plugin-conf.d ».
touch loggrep
Le contenu sera le suivant qui va reprendre le groupe de log défini dans le script de configuration d’iptables en de début de page :
[loggrep]
group adm
env.logfile /var/log/syslog
env.regex_iptablesTotal IPTABLES*
env.label_iptablesTotal iptables total
env.regex_iptablesDrop IPTABLES_IN_DROP
env.label_iptablesDrop iptables drop
env.regex_iptablesOut IPTABLES_OUT
env.label_iptablesOut iptable out
env.regex_iptablesDropInBL IPTABLES_DROP_IN_BL
env.label_iptablesDropInBL iptable drop in black list
env.regex_iptablesDropOutBL IPTABLES_DROP_OUT_BL
env.label_iptablesDropOutBL iptable drop out black list
env.regex_iptablesIN443 IPTABLES_IN_443
env.label_iptablesIN443 iptable entrée 443
env.regex_iptablesIN80 IPTABLES_IN_80
env.label_iptablesIN80 iptable entrée 80
env.title Surveillance IPTABLES LOG
Dans les lignes « regex » il est tout à fait possible de mettre des expressions régulières. Pas besoin dans ce cas mais c’est très utile car le travail de l’expression régulière peut se faire en ligne commande …
journalctl -f -g "IPTABLES.*OUT= .*DPT=443"
-- Logs begin at Tue 2020-12-15 18:00:00 CET. --
mai 13 18:44:28 PC-XAVIOR kernel: IPTABLES_IN_443 IN=wlp2s0 OUT= MAC=48:51:b7:5b:bb:c0:80:86:f2:91:5f:5a:08:00 SRC=192.168.2.105 DST=192.168.2.136 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=65274 DF PROTO=TCP SPT=57156 DPT=443 WINDOW=64240 RES=0x00 SYN URGP=0
mai 13 18:44:28 PC-XAVIOR kernel: IPTABLES_IN_443 IN=wlp2s0 OUT= MAC=48:51:b7:5b:bb:c0:80:86:f2:91:5f:5a:08:00 SRC=192.168.2.105 DST=192.168.2.136 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=65281 DF PROTO=TCP SPT=57157 DPT=443 WINDOW=64240 RES=0x00 SYN URGP=0
…puis une fois validé un simple copier/coller dans le fichier de configuration du pluggin est à faire.
Une fois fait, il faudra tester ce pluggin par la commande « munin-run ». Si pas d’erreur le résultat devrait ressembler à celui-ci :
sudo munin-run loggrep
iptablesOut.value 63705
iptablesTotal.value 66439
iptablesIN443.value 18
iptablesDropOutBL.value 0
iptablesDrop.value 231
iptablesDropInBL.value 0
iptablesIN80.value 0
Enfin on redémarre le service munin-node :
sudo systemctl restart muni-node
On peut revéfier la présence du module par la commande « munin-node-configure » :
munin-node-configure
Plugin | Used | Extra information
------ | ---- | -----------------
acpi | yes |
amavis | no |
...
loggrep | yes |
...
Conseil : changer le nom du lien symbolique pour avoir une lecture plus claire de la fonction du module (ex : loggrep_iptables)
Puis attendre quelques minutes et le graphe apparaitra dans l’interface web. Ces graphes sont associés à la catégorie « other » qui ne peut être changé sans toucher au code du pluggin. Exemple de résultat ci-dessous :

IV.3 Log
Il est toujours interessant de voir les logs.
Dans systemctl nous verrons les logs d’execution de munin. En revanche il est interessant de voir ceux de munin pour la partie serveur et client.
Les logs sont situées dans /var/log/munin :
ls -als
total 1812
4 drwxr-xr-x 2 munin adm 4096 mai 14 00:00 .
4 drwxrwxr-x 20 root syslog 4096 mai 14 00:00 ..
0 -rw-r----- 1 www-data adm 0 mai 9 11:58 munin-cgi-graph.log
0 -rw-r----- 1 www-data adm 0 mai 9 11:58 munin-cgi-html.log
0 -rw-rw-r-- 1 munin munin 0 mai 9 12:00 munin-graph.log
224 -rw-r----- 1 munin adm 224971 mai 14 10:12 munin-html.log
100 -rw-r----- 1 munin adm 95628 mai 14 10:12 munin-limits.log
8 -rw-r--r-- 1 root root 4554 mai 9 11:58 munin-node-configure.log
304 -rw-r--r-- 1 root root 306050 mai 14 11:04 munin-node.log
348 -rw-r----- 1 munin adm 349346 mai 14 11:04 munin-update.log
Exemple pour trouver les dysfonctionnements :
cat /var/log/munin/munin-node.log | grep Error
2021/05/14-00:00:07 [1164743] Error output from lpstat:
2021/05/14-00:00:07 [1164743] Error output from lpstat:
...
2021/05/14-00:26:07 [1179610] Error output from lpstat:
2021/05/14-00:27:06 [1180174] Error output from fw_conntrack:
2021/05/14-00:27:07 [1180174] Error output from lpstat:
...
Et connaitre le détail pour une connexion particulière :
cat /var/logmunin-node.log | grep 1180174
2021/05/14-00:27:06 [1180174] Error output from fw_conntrack:
2021/05/14-00:27:06 [1180174] cat: /proc/sys/net/nf_conntrack_max: Cannot allocate memory
2021/05/14-00:27:07 [1180174] Error output from lpstat:
2021/05/14-00:27:07 [1180174] lpstat: No destinations added.
2021/05/14-00:27:07 [1180174] lpstat: No destinations added.
2021/05/14-00:27:07 [1180174] Error output from lpstat:
2021/05/14-00:27:07 [1180174] lpstat: No destinations added.
2021/05/14-00:27:07 [1180174] lpstat: No destinations added.
V Pour aller plus loin
Très bon article pour entrer dans les entrailles d’Iptables pour tout flux entrants : https://geekeries.org/2017/12/configuration-avancee-du-firewall-iptables/