Je continue l’intégration de mes services à FreeIPA; dans cette optique je vous présente aujourd’hui comment intégrer Zabbix à FreeIPA grâce au module Kerberos d’Apache

Génération de la keytab

A faire sur le serveur FreeIPA

ipa service-add HTTP/zabbix.domain.local

Dans mon cas j’ouvre le service sur l’extérieur, il faut donc que le nom du service externe soit aussi dans la keytab sinon le service Kerberos ne valide pas l’authentification.

ipa service-add HTTP/zabbix.domain.com

une fois les deux services ajoutés, on peut concaténer le tout directement sur le serveur cible (ici Zabbix):

A faire sur le serveur cible

ipa-getkeytab -s freeipa.domain.local -p HTTP/zabbix.domain.local -k /etc/httpd/zabbix.keytab
ipa-getkeytab -s freeipa.domain.local -p HTTP/zabbix.domain.com -k /etc/httpd/zabbix.keytab

On liste le contenu de la keytab pour vérifier :

klist -e -k /etc/httpd/zabbix.keytab

FILE:/etc/httpd/zabbix.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   1 HTTP/zabbix.domain.local@DOMAIN.LOCAL (aes256-cts-hmac-sha1-96)
   1 HTTP/zabbix.domain.local@DOMAIN.LOCAL (aes128-cts-hmac-sha1-96)
   1 HTTP/zabbix.domain.local@DOMAIN.LOCAL (des3-cbc-sha1)
   1 HTTP/zabbix.domain.local@DOMAIN.LOCAL (arcfour-hmac)
   1 HTTP/zabbix.domain.com@DOMAIN.LOCAL (aes256-cts-hmac-sha1-96)
   1 HTTP/zabbix.domain.com@DOMAIN.LOCAL (aes128-cts-hmac-sha1-96)
   1 HTTP/zabbix.domain.com@DOMAIN.LOCAL (des3-cbc-sha1)
   1 HTTP/zabbix.domain.com@DOMAIN.LOCAL (arcfour-hmac)

Ajout de l’utilisateur dans Zabbix et modification de l’authentification

Afin de ne pas se retrouver sans pouvoir accéder a notre plateforme après la modification de l’authentification, il faut créer les utilisateurs sur la plateforme. Faite ça de façon classique en passant par l’interface de Zabbix. Il faut savoir que par défaut l’authentification va prendre en compte l’uid du compte , il faut donc que les uid corresponde.

Une fois l’ajout effectué on peut changer l’authentification en HTTP

Ne vous déloguez pas, ainsi vous gardez le ticket de session le temps de valider que votre infrastructure est fonctionnel.

Modification d’Apache

On va s’appuyer sur un module qui s’appel : auth_kerb. Pour l’installer sur CentOS il suffi de simplement faire :

yum install mod_auth_kerb.x86_64

Il ne reste plus qu’à modifier apache pour prendre en compte la nouvelle méthode authentification

On modifie le virtualhost de Zabbix pour intégrer les lignes en gras :

<VirtualHost *:80>
...
<Directory /usr/share/zabbix/>

                      AuthType Kerberos
                      AuthName "Kerberos Login"
                      KrbMethodNegotiate on
                      KrbMethodK5Passwd on
                      KrbServiceName HTTP
                      KrbAuthRealms DOMAIN.LOCAL
                      Krb5KeyTab /etc/httpd/zabbix.keytab
                      KrbSaveCredentials on
                      KrbConstrainedDelegation on
                      Require valid-user

</Directory>

...

</VirtualHost>

puis on redémarre apache

service httpd restart

A ce stade vous en mesure de vous authentifier sur Zabbix via Kerberos

Si maintenant vous voulez filtrer par groupe d’utilisateurs, le module Kerberos n’est pas en mesure de le faire en l’état, il faut passer par le module LDAP de apache qui va vérifier l’appartenance du compte au groupe avant de valider l’accès.

Je ne l’ai pas encore fait, mais cela ne serai tarder, j’updaterai ce billet en fonction.

Monitoring Web

Dans Zabbix il est possible d’effectuer des checks de services web. Mais une problématique se pose quand ceux-ci se situe derrière un proxy. En effet, dans les versions antérieurs à la 2.2 il n’est pas possible de configurer dans l’interface web le serveur proxy.

Il faut donc passer par le système d’exploitation pour effectuer l’opération. La documentation de Zabbix est clair sur le comment, mais après moult essais, je n’ai pas réussi à le faire fonctionner correctement. Je livre donc ici une méthodologie qui m’est fonctionnel.

Configuration du système

Pour faire les choses propres, on va créer un fichier de configuration qui exportera les variables systèmes et qui sera lu au lancement du serveur.

On créer donc le fichier de configuration suivant : /etc/sysconfig/zabbix (Red Hat like) en y mettant le contenu suivant :

export http_proxy=http://PROXY_USER:PROXY_USER_PASSWORD@PROXY_IP:PROXY_PORT
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
#Upper Case
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
export FTP_PROXY=$http_proxy
# Exclusions Proxy
export no_proxy="127.0.0.1,HOST_TO_Exclude,DOMAIN_TO_Exclude"
export NO_PROXY=$no_proxy

puis on modifie le script de lancement du serveur afin d’y ajouter notre fichier de configuration. Celui-ci sera lu au lancement par l’utilisateur système zabbix (ici zabbixsrv), ce qui permettra aux checks de pouvoir sortir via le proxy.

Modifiez le fichier /etc/init.d/zabbix-server afin d’y ajouter ces deux lignes :

...
# Source function library.
 . /etc/rc.d/init.d/functions
# Source sysconfig
 . /etc/sysconfig/zabbix
exec=zabbix_server
 prog=${exec##*/}
 ...

Puis redémarrer le serveur Zabbix :

/etc/init.d/zabbix-server restart

Si vous avez bien suivi, le fichier est lu au démarrage de Zabbix, cela veux dire que si vous voulez ajouter des exclusions, il faut redémarrer le serveur Zabbix.

Vivement mon passage en 2.2 🙂

Merci a l’utilisateur BDiE8VNy qui a donné la solution sur le forum Zabbix

Il m’est arrivé de ne plus me souvenir du mot de passe admin d’une plateforme Zabbix de préproduction que j’avais mis en place quelques temps auparavant. Après avoir cherché un peu je suis tombé sur la solution et la marque ici afin d’avoir un pense bête en cas de nouvel oublis.
Il faut bien évidement avoir accès root à la machine puis :

mysql -u root -p
use zabbix;
update zabbix.users set passwd=md5('MYNEWPASSWORD') where alias='Admin';

Avec ça reset le mot de passe admin (ou autre utilisateur), par contre ce que j’avais oublié c’est que j’avais connecté ce Zabbix sur un LDAP, du coup même le reset du mot de passe ne m’a servi à rien.

La solution consiste à changer la méthode d’authentification le temps de tout reconfigurer correctement :

mysql -u root -p
select zabbix;
update zabbix.config set authentication_type=0 where authentication_type=1;

Puis, pour que cela ne se reproduise plus j’ai créé un nouveau groupe qui ne s’authentifiera qu’en interne :

et le tour est joué !

A la suite de divers changement d’humeurs, je ne savais plus quelles versions de Linux j’avais installé au sein de mon infrastructure. Alors plutôt que de me connecter sur chaque serveur et vérifier quelle version et quelle révision de était présente, j’ai utilisé la fonction d’inventaire de Zabbix pour effectuer l’opération. Pour cela on va créer un nouvel item dans le template OS Linux fourni de base dans l’installation de Zabbix :

Aller dans Configuration -> Template -> Template OS Linux -> Items -> Create Item

puis créer l’item avec les informations suivantes :

Explications des informations importantes :

Name : System Distribution

-> Ici c’est le nom de l’item

Type : Zabbix Agent

-> le type de check qui va être effectué. Dans notre cas c’est l’agent Zabbix qui va nous remonter l’information.

Key : system.sw.os[name]

-> On positionne la clef que l’on souhaite remonter. Le « name » permet de ne remonter que la distribution, d’autres options sont disponibles.

Type of information : Character

-> la donnée remonté est de type character

Update interval : 86400

-> l’intervalle d’interrogation, étant donné que je ne met pas a jour mes serveurs tous les quatre matins, je l’ai positionné a 1 jour.

Populate host inventory field : OS (Short)

-> ici on stipule où sera placé l’information dans l’inventaire.

Attention : ceci n’est disponible qu’avec un agent égal ou supérieur à la version 2.0

Une fois que l’item est sauvegardé, il suffi de patienter que l’information remonte :

Je continue sur ma lancé avec la supervision de NGINX avec zabbix. Plusieurs sites effectue cette opération via des scripts. Comme je l’ai dis dans mon précédent article, je préfèré une solution qui fonctionne « out of the box » (comme dirait les commerciaux).

Nginx dispose d’un module de status (a la apache) . Si vous voulez avoir plus d’informations sur ce qu’il monitore, je vous conseil de lire la documentation officiel.

Maintenant que l’on sais ce que l’on va monitorer, voici comment il faut faire :

Création d’un virtualhost spécifique accessible uniquement par l’agent zabbix :

Au niveau de votre serveur NGINX, il faut créer un virtualhost avec la configuration suivante :

server {
      listen 127.0.0.1:8080; # écoute en local sur un port différent
      location / {
          stub_status on; # on charge le module de status
          access_log off; # on ne logge pas inutilement les accès
          allow 127.0.0.1; # autorisation uniquement depuis le localhost
          deny all; # on refuse tout le reste
       }
 }

et bien sur faire un reload de NGINX a la fin de votre configuration

Modification du fichier zabbix_agentd.conf

Afin que le système prenne en compte les futurs checks contenu dans le template on ajoute ces paramètres utilisateurs à la configuration de l’agent zabbix (zabbix_agentd.conf):

UserParameter=nginx.active[*],wget -O- -q $1:$2 | awk ‘/^Active/ {print $NF}’
UserParameter=nginx.reading[*],wget -O- -q $1:$2 | awk ‘/Reading/ {print $$2}’
UserParameter=nginx.writing[*],wget -O- -q $1:$2 | awk ‘/Writing/ {print $$4}’
UserParameter=nginx.waiting[*],wget -O- -q $1:$2 | awk ‘/Waiting/ {print $$6}’
UserParameter=nginx.accepted[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$1}’
UserParameter=nginx.handled[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$2}’
UserParameter=nginx.requests[*],wget -O- -q $1:$2 | awk ‘/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $$3}’

Il ne reste plus qu’a importer et associer à vos hosts le template Zabbix qui suit : Template_nginx

J’ai enfin pris le temps de configurer un serveur de monitoring; pour diverses raisons j’ai choisi zabbix.Je vais détailler dans une suite d’article les différents check que j’ai mis en place afin de garder une trace et qui sait aider quelqu’un 🙂 Je ne traiterai pas de l’installation de Zabbix, de multiple tutoriaux étant disponible sur le web; cela serai une perte de temps.

Mysql & Zabbix
Par défaut Zabbix propose un template pour monitorer la base de données. Comme je n’ai pas de gros besoins en terme de supervision sur Mysql, j’ai décidé de partir sur quelque chose de simple plutôt que des check plus lourds qui font appel à des scripts externes.

Voici comment utiliser le template par défaut :
Dans un premier temps on va créer utilisateur dédié sur chaque serveur Mysql que l’on souhaite monitorer :

Linux#> Mysql -u root -p
Mysql#> GRANT USAGE ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'super_password';

Une fois celui-ci créé on va paramétrer l’agent Zabbix pour qu’il prenne en compte les « Key » fourni par le serveur.

CentOS

On commence par copier le fichier d’exemple fourni par les repository EPEL :

cp /usr/share/doc/zabbix20-agent-2.0.5/userparameter_mysql.conf /var/lib/zabbixsrv/

Puis à la fin du fichier on ajoute les lignes suivantes :

UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/var/lib/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/var/lib/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/var/lib/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/var/lib/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/var/lib/zabbix mysqladmin status | cut -f9 -d":"

Afin que le fichier soit pris en compte on l’inclus dans le fichier de configuration de l’agent :

Include=/var/lib/zabbix/userparameter_mysql.conf

A ce moment précis le check fonctionne, mais sans utilisateur; il faut donc stipuler à l’utilisateur zabbix quel utilisateur utiliser lors de la connexion à la base. Pour cela je vais reprendre ce qu’a fait Tiramiseb car à mon sens c’est la plus correcte et surtout la plus élégante !

On créer le fichier /var/lib/zabbix/dot.my.cnf  (home directory de votre user zabbix) puis on ajoute le contenu suivant :

[client]
user= »zabbix »
password= »super_password »

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

service zabbix-agent restart

Debian

Sur Debian on créer le fichier Mysql pour l’agent avec le contenu suivant :

UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/etc/zabbix mysql -N | awk '{print $$2}'
UserParameter=mysql.size[*],echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema='$1'")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name='$2'");" | HOME=/etc/zabbix mysql -N
UserParameter=mysql.ping,HOME=/etc/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
UserParameter=mysql.uptime,HOME=/etc/zabbix mysqladmin status | cut -f2 -d":" | cut -f1 -d"T"
UserParameter=mysql.threads,HOME=/etc/zabbix mysqladmin status | cut -f3 -d":" | cut -f1 -d"Q"
UserParameter=mysql.questions,HOME=/etc/zabbix mysqladmin status | cut -f4 -d":" | cut -f1 -d"S"
UserParameter=mysql.slowqueries,HOME=/etc/zabbix mysqladmin status | cut -f5 -d":" | cut -f1 -d"O"
UserParameter=mysql.qps,HOME=/etc/zabbix mysqladmin status | cut -f9 -d":"

Et comme pour la configuration sous CentOS on l’inclus dans le fichier de configuration de l’agent:

Include=/etc/zabbix/userparameter_mysql.conf

Et enfin on reprend l’astuce de Tiramiseb :

Création du fichier /etc/zabbix/dot.my.cnf avec le contenu :

[client]
user="zabbix"
password="super_password"

Ensuite, on fait un lien symbolique pour qu’il soit reconnu par MySQL :

cd /var/lib/zabbix
ln -s dot.my.cnf .my.cnf
chown zabbix.zabbix dot.my.cnf .my.cnf
chmod 600 dot.my.cnf

Et enfin on redémarre l’agent Zabbix

/etc/init.d/zabbix-agent restart

Et maintenant il ne reste plus qu’a affecter le template Mysql dans l’interface web a notre serveur Mysql.