Munin

De OpenWikiBSD.

Un suivi en temps réel des charges CPU,disque etc...

Pas un système d'alerte à la Nagios, mais un joli cracheur des graphes.

Une bonne base de départ, ici.

Principe :

One master to rule them all !!

Sommaire

Serveur : Qui aura l'interface ouebe

apt-get install munin munin-node

Ajouter les clients dans /etc/munin/munin.conf

[bcdiX]
   address @IP
   use_node_name yes


a2ensite

Sous Debian Squeeze, ajouter :

<directory /var/cache/munin/www>
allow from all
</directory>

à /etc/apache2/sites-enabled/000-default

ou à /etc/munin.apache2.conf si virtualhosts

Sinon Error 403

/etc/init.d/apache2 reload

Client

apt-get install munin-node munin-plugins-extra

ou

pkg_add p5-LWP-UserAgent-Determined munin-node


Le Fiere wall

  # Autorise munin
  /sbin/iptables -A INPUT -i interface -p tcp --dport 4949 -j ACCEPT

ou

pass in quick on $LAN_IF inet  proto tcp from $SRV_MUNIN to any port 4949 keep state


Autoriser le serveur à se connecter sur le client , port 4949 (par défaut)

Ajouter au fichier /etc/munin/munin-node.conf la ligne correspondant au serveur munin :

allow ^IP\.IP\.0\.1$

Forcément en regexp !

/etc/init.d/munin-node restart


Les points à surveiller

munin-node-configure --shell

Il faudra patienter 5 minutes, au maximum.

A la fin :

apache2ctl restart


Attention, la communication entre le client et le serveur munin se fait en clair. Issu d'un tcpdump sur le port TCP/4949:

 .......U........
	0x0020:  8018 0227 92c4 0000 0101 080a 0ad2 ce58  ...'...........X
	0x0030:  0ad6 95ce 6665 7463 6820 6170 6163 6865  ....fetch.apache
	0x0040:  5f61 6363 6573 7365 730a                 _accesses.
IP Client.munin > SRV.57545: tcp 23
	0x0000:  4500 004b 357d 4000 4006 f105 0a08 001a  E..K5}@.@.......
	0x0010:  0a08 0001 1355 e0c9 b3e9 bab5 b0a1 c3a5  .....U..........
	0x0020:  8018 005b a363 0000 0101 080a 0ad6 95e7  ...[.c..........
	0x0030:  0ad2 ce58 6163 6365 7373 6573 3830 2e76  ...Xaccesses80.v
	0x0040:  616c 7565 2034 3136 3735 0a              alue.41675.

Néanmoins, vous pouvez utiliser les capacités TLS de munin. (man munin.conf) pour chiffre le tout.

Apache 1.3

  • Sous OpenBSD :

Modifier le /var/www/conf/httpd.conf

Décommenter

#ExtendedStatus On


Décommenter la directive server-status et autoriser le serveur Munin

#<Location /server-status>
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
#</Location>


Devient

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from @IP_SRV_MUNIN
</Location>
apachectl stop
apachectl starssl

Munin, maintenant

ln -s /usr/local/libexec/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
ln -s /usr/local/libexec/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/local/libexec/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
kill -HUP `ps ax |grep munin |awk '{print $1}'`


  • Sous Debian
ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume
/etc/init.d/munin restart

Apache2

a2enmod status
a2enmod info
echo "<Location /server-status>
SetHandler server-status
Order Deny,Allow
Allow from 127.0.0.1
Allow from @IP_SRV_Nagios_Munin
Deny from All
</Location>" >> /etc/apache2/httpd.conf
echo "
ExtendedStatus On
" >> /etc/apache2/apache2.conf
apache2ctl restart

Fini pour un client Nagios. Pour le client Munin, il faut ajouter :

munin-node-configure --shell
ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
ln -s /usr/share/munin/plugins/apache_volume /etc/munin/plugins/apache_volume

Commandes qu'il faut copier coller

Vous devez obtenir :

munin-node-configure  |grep apache
apache_accesses            | yes  |                                        
apache_processes           | yes  |                                        
apache_volume              | yes  |
/etc/init.d/munin-node restart

Ajouter un plugin de surveillance

Linux

  • Copier le plugin dans /etc/munin/plugins
  • L'ajouter dans /etc/munin/plugin-conf.d/munin-node


munin-node-configure --shell
/etc/munin/plugins/PLUGIN config
/etc/init.d/munin-node restart


OpenBSD

  • Copier le plugin dans /etc/munin/plugins
  • L'ajouter dans /etc/munin/plugin-conf.d/openbsd-packages
munin-node-configure --shell
/etc/munin/plugins/PLUGIN config

Samba

Téléchargez Fichier:Samba.txt renommez-le et en samba.

samba configure
/etc/init.d/munin-node restart


OpenLdap

FreeRadius

Ce plugin configuré avec [ces modifications ] de syslog permettent de suivre les cx/deconnexions, etc..

Nagios

Munin surveille Nagios

[1]

J'ai modifié le fichier de log

BackupPC

Télécharger le plugin

tar zxvf backuppc.tar.gz
mv munin-plugins-backuppc-1.2/backuppc /usr/share/munin/plugins/
rm -rf munin-plugins-backuppc-1.2/
ln -s /usr/share/munin/plugins/backuppc backuppc
chown root.root /usr/share/munin/plugins/backuppc 
echo "
[backuppc] 
user backuppc
group backuppc
" >> /etc/munin/plugin-conf.d/munin-node
/etc/init.d/munin-node restart


J'ai du ajouter ce script en crontab. Le test munin se basant sur un fichier LOG qui n'existe pas en debian squeeze.

#!/bin/bash

REP=/var/lib/backuppc/pc

for PC in `ls $REP`
 do echo $REP/$PC
 LOGFILE=`ls -lht $REP/$PC/LOG.* |  awk 'NR>1{exit};1' |  awk '{ print $NF }' |cut -d"/" -f7`
 cp $REP/$PC/$LOGFILE $REP/$PC/LOG
 chown backuppc.backuppc $REP/$PC/LOG
done


A mettre dans la crontab toutes les ..5 (?) minutes

Météo

gunzip weather_2.gz
mv weather_  /usr/share/munin/plugins/weather_
ln -s /usr/share/munin/plugins/weather_ weather_XXXXXX
/etc/init.d/munin-node restart

où XXXXX est le code de votre lieu à l'adresse [2]

Si le plugin affiche Unknown pour la ville :

perl -pi -e 's/Unknown/VILLE/'  /etc/munin/plugins/weather_XXXXXX
/etc/init.d/munin-node restart

Pf

gunzip pf-1.gz
mv pf-1 pf
chmod 755 pf 
mv pf /usr/local/libexec/munin/plugins/
cd /etc/munin/plugins
ln -s  /usr/local/libexec/munin/plugins/pf pf
echo "[pf]
user root
" >> /etc/munin/plugin-conf.d/openbsd-packages


Pf juste les paquets IPV4/IPv6

gunzip pf_ipv4_ipv6_packets-v1.gz
chmod 755 pf_ipv4_ipv6_packets-v1
mv pf_ipv4_ipv6_packets-v1 pf_ipv4_ipv6 
mv pf_ipv4_ipv6  /usr/local/libexec/munin/plugins/
cd /etc/munin/plugins
ln -s  /usr/local/libexec/munin/plugins/pf_ipv4_ipv6 pf_ipv4_ipv6 
echo "[pf_ipv4_ipv6 ]
user root
" >> /etc/munin/plugin-conf.d/openbsd-packages
munin-node-configure --shell


kill -HUP `ps ax |grep munin|cut -d" " -f1`

ou, sous 4.9

/etc/rc.d/munin-node restart

SSH

gunzip sshd_log
mv sshd_log-1 sshd_log
chmod 755 sshd_log
dos2unix sshd_log
mv sshd_log /usr/local/libexec/munin/plugins/
ln -s  /usr/local/libexec/munin/plugins/sshd_log sshd_log
echo "
[sshd_log]
user root
group root
env.logfile /var/log/messages
env.category users
" >> etc/munin/plugin-conf.d/munin-node


Dovecot

  • Télécharger le paquet
  • Merci pour l'idée.
  • Pour OpenBSD, je l'ai modifié afin qu'il ..fonctionne juste !. C'est [ici]
mv dovecot.sh /etc/munin/plugins/dovecot

echo "[dovecot]
env.logfile /var/log/maillog
env.statefile /var/run/munin/plugin-dovecot.state
" >> /etc/munin/plugin-conf.d/openbsd-packages 
chmod 755 /etc/munin/plugins/dovecot
chown root._munin /var/run/munin/
chmod -R g+w /var/run/munin/
chown root._munin /var/log/maillog
chmod g+r /var/log/maillog
/etc/rc.d/munin_node restart

La partie

chown root._munin /var/run/munin/
chmod -R g+w /var/run/munin/
chown root._munin /var/log/maillog
chmod g+r /var/log/maillog

devant être relancée à chaque redémarrage de la machine, ou du démon syslog

Postfix

Sur munin_exchange, il y a le choix. J'aime bien celui là : postfix_stats

Wget le paquet
dos2unix download
mv download postfix_stats

wget http://jimsun.linxnet.com/downloads/pflogsumm-1.1.1.tar.gz

tar zxvf pflogsumm-1.1.1.tar.gz 
cd pflogsumm-1.1.1
cp pflogsumm.pl /usr/local/bin/pflogsumm
chown bin:bin /usr/local/bin/pflogsumm
chmod 755 /usr/local/bin/pflogsumm
perl -MCPAN -e 'install Date::Calc'
chmod g+r /var/log/maillog
echo "

[postfix_stats] user _postfix " >> /etc/munin/plugin-conf.d/openbsd-packages

  • Modifier le plugins :
/usr/local/bin/pflogsumm --smtpd_stats -d today /var/log/maillog /var/log/maillog.0.gz | head -n 15 > $TMP

Drupal

Monitorer le nombre d'articles et d'utilisateurs, pourquoi pas . L'idée est tirée d'ici et modifiée pour ..marcher chez moi .

Vous installez le module te suivez les instructions ou :

  • Les nodes :
#!/usr/local//bin/bash
# Drupal munin plugin - This script was generated by the munin Drupal module.
# Nodes
# Variables
CONF_MYSQL_USER="xxxxxx"
CONF_MYSQL_PASS="xxxxxxx"
CONF_DATABASE="xxxxxxx"
SOCK=" --socket=xxxxxxx/mysql.sock "
#SOCK=""
#Moi mon MySQL utilise des sockets///

# config settings
case $1 in
  config)
    cat <<'EOM'
graph_title Content statistics
graph_vlabel Amount
graph_category Drupal
curnodes.label Existing nodes
curnodes.type GAUGE
curcmnt.label Existing comments
curcmnt.type GAUGE
newnodes.label New nodes
newnodes.type GAUGE
newcmnt.label New Comments
newcmnt.type GAUGE
EOM
  exit 0;;
esac

# Stats for Existing nodes
# Number of existing nodes on this site.
echo "select count(nid) from node" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "curnodes.value $VALUE.00"
}

# Stats for Existing comments
# Number of existing comments on this site.
echo "select count(cid) from comments" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "curcmnt.value $VALUE.00"
}

# Stats for New nodes
# Number of new nodes on this site.
echo "select count(nid) from node where unix_timestamp() - created < 300" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "newnodes.value $VALUE.00"
}

# Stats for New Comments
# Number of new comments on this site.
echo "select count(cid) from comments where unix_timestamp() - timestamp < 300" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "newcmnt.value $VALUE.00"
}

  • Les users :
#!/usr/local/bin/bash
# Drupal munin plugin - This script was generated by the munin Drupal module.
# Users
# Variables
CONF_MYSQL_USER="xxxxxx"
CONF_MYSQL_PASS="xxxxxxx"
CONF_DATABASE="xxxxxxx"
SOCK=" --socket=xxxxxxx/mysql.sock "
#SOCK=""

# config settings
case $1 in
  config)
    cat <<'EOM'
graph_title User information
graph_vlabel Nombre
graph_category Drupal
curuser.label Currently logged in user
curuser.type GAUGE 
newuser.label New users
newuser.type GAUGE
EOM
  exit 0;;
esac

# Stats for Currently logged in user
# This item shows the number of currently logged in users.
echo "select count(uid) from users where unix_timestamp() - access < 300" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "curuser.value $VALUE.00"
}

# Stats for New users
# This item shows the number of users that have been created.
echo "select count(uid) from users where unix_timestamp() - created < 300" | mysql --user=$CONF_MYSQL_USER --password=$CONF_MYSQL_PASS --database $CONF_DATABASE $SOCK | tail -n+2 | {
  read VALUE ; echo "newuser.value $VALUE.00"
}


Bind

  • Wget le paquet
  • Installez rndc
  • Bind est chrooté, il faut rajouter le fichier à lire par le process munin :
mkdir -p /var/named/var/run
chown -R named.named /var/named/var/run/
chmod -R ug+w /var/named/var/run/
  • Ajoutez dans la partie options :
  statistics-file "/var/run/named.stats";
  one-statistics yes ;
  • On relance et on demande les stats :
rndc reload
rndc stats

et le fichier se remplit.

  • Installez le paquet perl:
perl -MCPAN -e 'install Digest::MD5'

OpenBSD spécifique

[3]


pkg_add munin-node

Remarque  : Depuis la 4.9, cette série de commandes n'est plus nécessaire.

echo "if [ -x /usr/local/sbin/munin-node ]; then
       install -d -o _munin /var/run/munin
       echo -n ' munin-node';   /usr/local/sbin/munin-node
fi
" >> /etc/rc.local
install -d -o _munin /var/run/munin
echo -n ' munin-node'
/usr/local/sbin/munin-node


à la place le script est désormais :

/etc/rc.d/munin-node  {start|restart..}

FreeBSD spécifique

cd /usr/ports/sysutils/munin-node

make config install clean

echo 'munin_node_enable="YES"'>> /etc/rc.conf
  /usr/local/etc/rc.d/munin-node onestart
  • fichier de config : /usr/local/etc/munin/munin-node.conf
  • Générer les sondes munin-node-configure --shell et copy&paste le résultat, puis relancer munin-node

ZFS

mv ZFS_statistics_for_FreeBSD-v1 ZFS_statistics_for_FreeBSD-v1.tar
cp ZFS_statistics_for_FreeBSD-v1.tar /usr/local/etc/munin/plugins/
tar xvf ZFS_statistics_for_FreeBSD-v1.tar
rm ZFS_statistics_for_FreeBSD-v1.tar
chown root.wheel zfs_*
chown root zfs_*
chgrp wheel zfs_*
  • Relancer munin-node
  • Installer zfs-stats
cd /usr/ports/sysutils/zfs-stats/
make config install clean

IPhone spécifique

Et oui, on peut monitorer beaucoup de trucs inutiles avec Munin..

Tiré d'ici

apt-get install --reinstall perl p5-Getopt-Long p5-Exporter p5-lib p5-IO p5-AutoLoader p5-XSLoader  p5-Net-Server
lynx http://sourceforge.net/projects/munin/files/munin%20stable/1.4.5/munin-1.4.5.tar.gz
tar zxvf munin-1.4.5.tar.gz 
cd munin-1.4.5
perl -pi -e 's/USER       := munin/USER       := mobile/' Makefile.config
perl -pi -e 's/GROUP      := munin/GROUP      := mobile/' Makefile.config
make
make install-common-prime install-node-prime install-plugins-prime
/opt/munin/sbin/munin-node-configure --shell --families=contrib,auto | sh
perl -pi -e 's/user root/user mobile/' /etc/opt/munin/munin-node.conf 
perl -pi -e 's/group root/group mobile/' /etc/opt/munin/munin-node.conf 
  • Ajouter l'@IP du serveur Munin dans /etc/opt/munin/munin-node.conf
  • Ne pas oublier de mettre le host_name iphone-de-XXXXX dans /etc/opt/munin/munin-node.conf . Attention à la casse.
/opt/munin/sbin/munin-node

Avoir un oeil sur les durées d'appel

Coller ce script dans /etc/opt/munin/plugins

#!/bin/bash
#Philippe Schwarz 
#GPL v3
# Mars 2011
# Munin plugin to log call history of IPhone over the 24 last hours
# Telco ''offers'' 3 free numbers, they're computed separetly

#Pour les 3 numéros gratuits, je vire le préfixe pour éviter les ennuis entre 06 et +336
# 3 Telcos offered Numbers. Only the last 8 digits

FREENUM1="MON_NUM1"
FREENUM2="MON_NUM1"
FREENUM3="MON_NUM1"

BASE=/private/var/wireless/Library/CallHistory/call_history.db
#On calcule sur les dernières 24h
H24=`echo \`date +"%s"\` - 86400 |bc`

case $1 in
   config)
        cat <<'EOM'
graph_category Phone
graph_title 24h Call Log
graph_vlabel Duration of Calls
graph_order  Incoming_Calls Outgoing_Calls Outgoing_Free_Calls Outgoing_Non_free_Calls
Incoming_Calls.label Incoming_Calls
Outgoing_Calls.label Outgoing_Calls
Outgoing_Free_Calls.label Outgoing_Free_Calls
Outgoing_Non_free_Calls.label Outgoing_Non_free_Calls
EOM
        exit 0;;
esac

echo -n "Incoming_Calls.value "

IC=`sqlite3 $BASE "select sum(duration) from call where flags=4  and date > $H24 "`
if [ "$IC" == "" ]
then IC=0
fi
echo $IC / 60 |bc

echo -n "Outgoing_Calls.value "
OC=`sqlite3 $BASE "select sum(duration) from call where flags=5  and date > $H24 "`  
if [ "$OC" == "" ]
then OC=0
fi
echo $OC / 60 |bc

echo -n "Outgoing_Free_Calls.value "
OCF=`sqlite3 $BASE "select sum(duration) from call where ( address like \"%$FREENUM1\" or address  like \"%$FREENUM2\" or address like \"%$FREENUM3\") and flags=5  and date > $H24"`

if [ "$OCF" == "" ]
then OCF=0
fi
echo $OCF / 60 |bc

echo -n "Outgoing_Non_free_Calls.value "
ONFC=`sqlite3 $BASE "select sum(duration) from call where flags=5 and address not like \"%$FREENUM1\" and address not like \"%$FREENUM2\" and address not like \"%$FREENUM3\" and date > $H24"`
if [ "$ONFC" == "" ]
then ONFC=0
fi
echo $ONFC / 60 |bc

On obtient ça :

Image:Call hist-day.png

Sécuriser les flux et authentifier mutuellement

Tiré d'ici

On va chiffrer et authentifier la connexion de manière bi-directionnelle; je m'explique :

  • Le serveur sera certain de bien parler au client, sans aucune possibilité pour quelqu'un d'autre de se faire passer pour le client.
  • de même, le client sera certain de l'identité du serveur.
  • Enfin le flux de données sera chiffré et illisible pour un tiers.
  • vous créez vos certificats et clés
  • Il vous faut pour le client comme pour le serveur :
    • La clé de serveur au format .pem, sans passphrase, avec le certificat.
    • Le certificat de serveur au format .pem, avec la clé, avec l'empreinte.
    • Le certificat au format .pem de l'AC.

Sous OpenBSD :

pkg_add p5-Net-SSLeay

Sous Debian

 apt-get install libnet-ssleay-perl

Sur le client

Dans munin-node.conf
tls paranoid
tls_verify_certificate yes
tls_private_key    /etc/munin/client.key.pem
tls_certificate    /etc/munin/client.crt.pem
tls_ca_certificate /etc/munin/cacert.pem
tls_verify_depth 5

Sur le serveur

Dans munin.conf
tls paranoid
tls_verify_certificate yes
tls_private_key    /etc/munin/serveur.key.pem
tls_certificate    /etc/munin/serveur.crt.pem
tls_ca_certificate /etc/munin/cacert.pem
tls_verify_depth 5

Tests & config

Une fois TLS activé de manière obligatoire,de chaque côté :

telnet @client 4949
Trying @client...
Connected to @client.
Escape character is '^]'.
# munin node at dirac.schwarz-fr.net
list
# I require TLS. Closing.
Connection closed by foreign host.

Il est obligatoire de causer TLS avec celui-là...

Si vous souhaitez ne pas causer TLS avec certains, ajoutez la directive

        tls disabled

dans leur partie sur le serveur dans munin.conf.

Debug de la partie TLS

Debug

  • Votre client n'apparait pas dans les machines surveillées.
    • Patientez ! Jusqu'à deux cycles (2X5 minutes) sont parfois nécessaires.
    • Il faut que les deux commandes suivantes renvoient exactement le même nom, avec la même casse!!

Depuis le serveur

telnet IP_CLIENT 4949
 Trying IP_CLIENT...iphone-de-XXXXX
 Connected to IP_CLIENT.
 Escape character is '^]'.
 # munin node at iphone-de-XXXXX

Le nom attendu est donc iphone-de-XXXXX

Depuis le client

grep host_name /etc/opt/munin/munin-node.conf 
 host_name iphone-de-XXXX
Outils personnels