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/

Linux : iptables et autour (IPSET, Conntrack,Munin)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *