Installation d'un serveur CentOS

Cette page est une prise de notes pour l'installation d'un serveur Zabbix (avec base MySQL) sur une CentOS 6 x6_64. Avant d'attaquer cette partie, il faut préparer le système de base en suivant ces instructions.

Installation de Zabbix

yum --enablerepo=fws install zabbix-server-mysql zabbix-agent \
zabbix-web-mysql mysql-server httpd php-gd php-mysql php-bcmath \
mod_ssl --exclude=*i386

le --exclude=*i386 est seulement valable si le serveur est en 64bits
Zabbix 2.0 est disponible sur notre dépôt de test, i faut dans ce cas utiliser la commande yum --enablerepo=fws-testing install zabbix-server-mysql zabbix-agent \ zabbix-web-mysql mysql-server httpd php-gd php-mysql php-bcmath mod_ssl

Configuration mysql

Sauvegarde de la configuration par défaut

cp -a /etc/my.cnf /etc/my.cnf.default
echo '' > /etc/my.cnf
vim /etc/my.cnf

Configuration my.cnf

Et y placer les lignes suivantes (à ajuster en fonction des performances du serveur)

[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
basedir=/usr
datadir=/var/lib/mysql
innodb_data_home_dir = /var/lib/mysql/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/lib/mysql/
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 128M
innodb_log_file_size = 300M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 120
innodb_file_per_table
innodb_flush_method=O_DIRECT
max_allowed_packet=128M
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
user=mysql
skip-name-resolve
skip-networking
default-storage-engine = MyISAM
max_connections = 300
table_cache = 2048
sort_buffer_size = 256k
join_buffer_size = 256k
read_buffer_size = 256k
read_rnd_buffer_size=256k
myisam_sort_buffer_size = 64M
skip-external-locking
key_buffer_size = 128M
thread_stack = 256K
thread_cache_size = 4
tmp_table_size=256M
max_heap_table_size=256M
query_cache_limit = 1M
query_cache_size = 128M
query_cache_type = 1
#skip-bdb
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M

Définition d'un mot de passe root

/etc/init.d/mysqld start
/usr/bin/openssl rand -base64 60 | tr -c -d '[:alnum:]'> ~/.my.pw
chmod 600 ~/.my.pw
/usr/bin/mysqladmin -u root password $(cat ~/.my.pw)
echo '[client]'> ~/.my.cnf
echo "password="$(cat ~/.my.pw)>> ~/.my.cnf

Création d'une base de donnée

/usr/bin/openssl rand -base64 40 | tr -c -d '[:alnum:]' > /etc/zabbix/db.pw
chmod 600 /etc/zabbix/db.pw
mysql -e 'create database zabbixdb'
mysql -e "grant all privileges on zabbixdb.* to 'zabbixuser'@'localhost' identified by '$(cat /etc/zabbix/db.pw)'"
mysql -e 'flush privileges'

Démarrage auto

chkconfig mysqld on
chkconfig zabbix-server on
chkconfig zabbix-agent on

Configuration de Zabbix

Serveur

Sauvegarde de la configuration par défaut

cp -a /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.default
echo '' > /etc/zabbix/zabbix_server.conf
vim /etc/zabbix/zabbix_server.conf

Configuration

Placer dans le fichier les lignes suivantes:

NodeID=0
StartPollers=30
StartTrappers=5
StartPingers=20
StartDiscoverers=1
Timeout=20
ListenPort=10051
SenderFrequency=30
DebugLevel=3
PidFile=/var/run/zabbix/zabbix.pid
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=10
AlertScriptsPath=/var/lib/zabbix/bin
ExternalScripts=/var/lib/zabbix/bin
FpingLocation=/var/lib/zabbix/bin/fping
Fping6Location=/var/lib/zabbix/bin/fping6
TmpDir=/var/lib/zabbix/tmp
DBHost=localhost
DBName=zabbixdb
DBUser=zabbixuser
DBPassword=__DB_PASSWD__
DBSocket=/var/lib/mysql/mysql.sock
StartDBSyncers=1

Puis mettre le mot de passe à jour:

export PASSWD=$(cat /etc/zabbix/db.pw)
sed -i -e "s/__DB_PASSWD__/$PASSWD/" /etc/zabbix/zabbix_server.conf
unset PASSWD

Mise en place des scripts

fping (utilisé par zabbix pour les vérifications ICMP) nécessite des droit élevés. Plutôt que de mettre les binaires fping en SUID, on crée des “wrapper” qui utilisent sudo

mkdir -p /var/lib/zabbix/{tmp,bin,db}
chown zabbix:zabbix /var/lib/zabbix/db
chown zabbix:zabbix /var/lib/zabbix/tmp
chmod 750 /var/lib/zabbix/tmp
chmod 750 /var/lib/zabbix/db
cat <<EOF >> /var/lib/zabbix/bin/fping
#!/bin/sh
exec /usr/bin/sudo /usr/sbin/fping "\$@"
EOF
cat <<EOF >> /var/lib/zabbix/bin/fping6
#!/bin/sh
exec /usr/bin/sudo /usr/sbin/fping6 "\$@"
EOF
chown zabbix:zabbix /var/lib/zabbix/bin/fping*
chmod 750 /var/lib/zabbix/bin/fping*

Droits sudoers

visudo

Puis ajouter les lignes suivantes:

Cmnd_Alias ZABBIX_SERVER = /usr/sbin/fping, /usr/sbin/fping6
zabbix ALL=(root) NOPASSWD: ZABBIX_SERVER

Et commentez la ligne suivante:

Defaults requiretty

Alertes XMPP

Zabbix intègre une fonction de notification via XMPP, mais cette fonction ne supporte pas d'auth sécurisée TLS. Nous alons donc créer un nouveau media:

yum --enablerepo=fws install sendxmpp perl-IO-Socket-SSL

vim /var/lib/zabbix/bin/sendxmpp

Puis placer ce code dans ce fichier:

#!/bin/sh
echo "$3" | \
sendxmpp -r zabbix -f /var/lib/zabbix/.sendxmpprc \
-t \
-s "$2" "$1"

et ajuster les droits:

chmod 755 /var/lib/zabbix/bin/sendxmpp

Maintenant il ne reste plus qu'à créer le fichier /var/lib/zabbix/.sendxmpprc qui contiendra les informations (JID/pass) pour se connecter au serveur jabber:

vim /var/lib/zabbix/.sendxmpprc

La syntaxe est la suivante:

zabbix@domain.tld password

Il faut maintenant réduire les permissions sur ce fichier qui ne doit être accessible que pour l'utilisateur zabbix:

chown zabbix:zabbix /var/lib/zabbix/.sendxmpprc
chmod 600 /var/lib/zabbix/.sendxmpprc

On peut maintenant rajouter le nouveau media, soit via l'interface web, soit avec cette requête SQL:

mysql zabbixdb -e "INSERT IGNORE INTO media_type (
mediatypeid,
type, description,
smtp_server,
smtp_helo,
smtp_email,
exec_path,
gsm_modem,
username,
passwd)
VALUES(
4,
1,
'xmpp',
'',
'',
'',
'sendxmpp',
'',
'',
'');"

SELinux

Sous CentOS 6, la politique SELinux par défaut va empêcher Zabbix d'utiliser la commande fping. Pour régler ce problème, on va créer une plitique de sécurité personnalisée (au lieu de désactiver entièrement SELinux):

cat <<'EOF' > zabbix.te module zabbix 1.0; require { type var_lib_t; type ping_t; class file { read getattr }; } #============= ping_t ============== allow ping_t var_lib_t:file { read getattr }; EOF checkmodule -M -m -o zabbix.mod zabbix.te semodule_package -o zabbix.pp -m zabbix.mod semodule -i zabbix.pp

Agent

Sauvegarde de la config par défaut:

cp -a /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.default
echo '' > /etc/zabbix/zabbix_agentd.conf
vim /etc/zabbix/zabbix_agentd.conf

Puis y placer ces lignes:

Server=127.0.0.1
ListenIP=127.0.0.1
Hostname=monitor.firewall-services.com
DisableActive=1
DisablePassive=0
EnableRemoteCommands=0
DebugLevel=3
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Timeout=6
UserParameter=cpu.number,cat /proc/cpuinfo | grep processor | wc -l
UserParameter=vm.memory.size.used,free -b | grep 'buffers/cache' | awk '{print $3}'
UserParameter=vm.memory.size.pused,echo $(($(free -b | grep 'buffers/cache' | awk '{print $3}')*100/$(free -b | grep 'Mem' | awk '{print $2}')))
UserParameter=system.swap.size.used,free -b | grep Swap | awk '{print $3}'

Interface Web

Configuration apache

Il faut d'abord modifier la configuration de mod_ssl pour autoriser les NamedBased VirtualHost en SSL

cp -a /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.default

Les modifications à faire sont les suivantes:

Au début du fichier, juste sous le LoadModule ssl_module modules/mod_ssl.so, il faut rajouter un <IfModule mod_ssl.c>

On remplace la ligne Listen 443 par Listen 0.0.0.0:443

On remplace SSLEngine On par SSLEngine Off (sinon impossible d'activer SSL sur les vhosts)

On commente les lignes <VirtualHost _default_:443> et </VirtualHost>

On rajoute </IfModule> tout à la fin

Il faut maintenant mettre en place la configuration pour Zabbix:

cp -a /etc/httpd/conf.d/zabbix.conf /etc/httpd/conf.d/zabbix.conf.default
echo '' > /etc/httpd/conf.d/zabbix.conf
vim /etc/httpd/conf.d/zabbix.conf

Puis y coller ces lignes:

#
# Zabbix monitoring system php web frontend
#
Alias /zabbix /usr/share/zabbix
<Directory "/usr/share/zabbix">
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js text/css
AddType application/x-httpd-php .php
php_admin_value max_execution_time 350
php_admin_value memory_limit 128M
php_admin_value post_max_size 16M
php_admin_value date.timezone Europe/Paris
php_admin_value mbstring.func_overload 2
SSLRequireSSL on
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/usr/share/zabbix/include">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
<Directory "/usr/share/zabbix/include/classes">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
# Hote virtuel ZABBIX
<VirtualHost 0.0.0.0:80>
ServerName monitor.firewall-services.com
ServerAlias zabbix.firewall-services.com
DocumentRoot /usr/share/zabbix
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
RewriteRule ^/(.*|$) https://%{HTTP_HOST}/$1 [L,R]
</VirtualHost>
<VirtualHost 0.0.0.0:443>
ServerName monitor.firewall-services.com
ServerAlias zabbix.firewall-services.com
DocumentRoot /usr/share/zabbix
SSLEngine on
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</VirtualHost>

Configuration Zabbix

echo '' > /etc/zabbix/zabbix.conf.php
vim /etc/zabbix/zabbix.conf.php

Puis y placer les lignes suivantes:

<?php
/*
** ZABBIX
** Copyright (C) 2000-2005 SIA Zabbix
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**/
global $DB;
$DB["TYPE"] = "MYSQL";
$DB["SERVER"] = "localhost";
$DB["PORT"] = "0";
$DB["DATABASE"] = "zabbixdb";
$DB["USER"] = "zabbixuser";
$DB["PASSWORD"] = "__DB_PASSWD__";
$ZBX_SERVER = "localhost";
$ZBX_SERVER_PORT = "10051";
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
?>

ne surtout pas mettre de retour chariot après le ?>, sous peine de perdre plusieurs heures à vous demander pourquoi aucune images (maps, screens, graphs) ne s'affiche ;)

Et mettre le mot de passe mysql à jour:

export PASSWD=$(cat /etc/zabbix/db.pw)
sed -i -e "s/__DB_PASSWD__/$PASSWD/" /etc/zabbix/zabbix.conf.php
unset PASSWD