Post

vps789461 (wgvpn.space) debian buster - Icinga (INACTIF)

vps789461 (wgvpn.space) debian buster - Icinga (INACTIF)

OVH vps789461 (1 vCore/2GoRam/20GoSSD) Debian Buster

Serveur VPS OVH

OVH

Debian 10 (Buster) (en version 64 bits)
L’adresse IPv4 du VPS est : 51.77.151.245
L’adresse IPv6 du VPS est : 2001:41d0:0404:0200::01cf

Le nom du VPS est : vps789461.ovh.net

Le compte administrateur suivant a été configuré sur le VPS : Nom d’utilisateur : root Mot de passe : kE3DeWny

Connexion SSH en “root”

1
ssh root@51.77.151.245

Mise à jour

1
apt update && apt -y upgrade

Réseau

Créer un bash pour désactiver l’initialisation réseau par le cloud sur le VPS OVH

1
nano initres.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
#
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
#
#Création du fichier **/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg** en mode su
echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
#
# Effacerle fichier /etc/network/interfaces  
rm /etc/network/interfaces
# Recréer le fichier /etc/network/interfaces
cat > /etc/network/interfaces << EOF
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
 address 2001:41d0:0404:0200:0000:0000:0000:01cf
 netmask 128
 post-up /sbin/ip -6 route add 2001:41d0:0404:0200:0000:0000:0000:0001 dev eth0
 post-up /sbin/ip -6 route add default via 2001:41d0:0404:0200:0000:0000:0000:0001 dev eth0
 pre-down /sbin/ip -6 route del default via 2001:41d0:0404:0200:0000:0000:0000:0001 dev eth0
 pre-down /sbin/ip -6 route del 2001:41d0:0404:0200:0000:0000:0000:0001 dev eth0
EOF
#
# Configuration OVH à modifier /etc/cloud/cloud.cfg 
sed -i 's/preserve_hostname: false/preserve_hostname: true/g' /etc/cloud/cloud.cfg
sed -i 's/manage_etc_hosts: true/manage_etc_hosts: false/g' /etc/cloud/cloud.cfg
#
# Redémarrage de la machine
systemctl reboot

Droits et exécution

1
chmod +x initres.sh && ./initres.sh

Patienter quelques minutes avant la reconnexion…

Se connecter en root via SSH

1
ssh root@51.77.151.245

Vérifier le réseau ip a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:95:91:65 brd ff:ff:ff:ff:ff:ff
    inet 51.77.151.245/32 brd 51.77.151.245 scope global dynamic eth0
       valid_lft 86157sec preferred_lft 86157sec
    inet6 2001:41d0:404:200::1cf/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe95:9165/64 scope link 
       valid_lft forever preferred_lft forever

Locales fr UTF8 : dpkg-reconfigure locales
Fuseau Europe/Paris : dpkg-reconfigure tzdata

domaine wgvpn.space

Zone dns OVH

1
2
3
4
5
6
$TTL 3600
@	IN SOA dns20.ovh.net. tech.ovh.net. (2020022809 86400 3600 3600000 300)
        IN NS     ns20.ovh.net.
        IN NS     dns20.ovh.net.
        IN A      51.77.151.245
        IN AAAA   2001:41d0:404:200::1cf

Création utilisateur

Utilisateur admspace

1
useradd -m -d /home/admspace/ -s /bin/bash admspace

Mot de passe admspace

1
passwd admspace 

Visudo pour les accès root via utilisateur admspace

1
2
apt install sudo  # sudo installé par défaut
echo "admspace     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Changer le mot de passe root

1
passwd root

OpenSSH, clé et script

connexion avec clé
sur l'ordinateur de bureau Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé kvm-cinay pour une liaison SSH avec le serveur KVM.

1
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/kvm-vps789461

Envoyer la clé publique sur le serveur KVM

1
scp ~/.ssh/kvm-vps789461.pub admspace@51.77.151.245:/home/admspace/

sur le serveur KVM On se connecte

1
ssh admspace@51.77.151.245

Copier le contenu de la clé publique dans /home/$USER/.ssh/authorized_keys

1
cd ~

Sur le KVM ,créer un dossier .ssh

1
2
mkdir .ssh
cat $HOME/kvm-vps789461.pub >> $HOME/.ssh/authorized_keys

et donner les droits

1
chmod 600 $HOME/.ssh/authorized_keys

effacer le fichier de la clé

1
rm $HOME/kvm-vps789461.pub

Modifier la configuration serveur SSH

1
sudo nano /etc/ssh/sshd_config

ATTENTION SUPPRIMER LES 2 DERNIERES LIGNES

1
2
PasswordAuthentication yes
PermitRootLogin yes

Modifier

1
2
sudo sed -i "s/#Port 22/Port 55039/g" /etc/ssh/sshd_config
sudo sed -i "s/#PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config

session SSH ne se termine pas correctement lors d'un "reboot" à distance
Si vous tentez de redémarrer/éteindre une machine distance par ssh, vous pourriez constater que votre session ne se termine pas correctement, vous laissant avec un terminal inactif jusqu’à l’expiration d’un long délai d’inactivité. Il existe un bogue 751636 à ce sujet. Pour l’instant, la solution de contournement à ce problème est d’installer :

1
sudo apt install libpam-systemd  # installé par défaut sur debian buster

cela terminera la session ssh avant que le réseau ne tombe.
Veuillez noter qu’il est nécessaire que PAM soit activé dans sshd.

Relancer openSSH

1
sudo systemctl restart sshd

Accès depuis le poste distant avec la clé privée

1
ssh -p 55039 -i ~/.ssh/kvm-vps789461 admspace@51.77.151.245

Installer utilitaires

1
sudo apt install rsync curl tmux jq figlet git dnsutils tree -y

Scripts motd et ssh_rc_bash

Installer les utilitaires

1
sudo apt install jq figlet curl git

Motd

1
sudo rm /etc/motd && sudo nano /etc/motd
1
2
3
4
5
6
7
8
                      ____  ___  ___  _ _    __  _          
      __ __ _ __  ___|__  |( _ )/ _ \| | |  / / / |         
      \ V /| '_ \(_-<  / / / _ \\_, /|_  _|/ _ \| |         
       \_/ | .__//__/ /_/  \___/ /_/   |_| \___/|_|         
 __ __ __ _|_| __ __ _ __  _ _      ___ _ __  __ _  __  ___ 
 \ V  V // _` |\ V /| '_ \| ' \  _ (_-<| '_ \/ _` |/ _|/ -_)
  \_/\_/ \__, | \_/ | .__/|_||_|(_)/__/| .__/\__,_|\__|\___|
         |___/      |_|                |_|                  

Script ssh_rc_bash

ATTENTION!!! Les scripts sur connexion peuvent poser des problèmes pour des appels externes autres que ssh

1
nano ssh_rc_bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash

get_infos() {
    seconds="$(< /proc/uptime)"
    seconds="${seconds/.*}"
    days="$((seconds / 60 / 60 / 24)) jour(s)"
    hours="$((seconds / 60 / 60 % 24)) heure(s)"
    mins="$((seconds / 60 % 60)) minute(s)"
    
    # Remove plural if < 2.
    ((${days/ *} == 1))  && days="${days/s}"
    ((${hours/ *} == 1)) && hours="${hours/s}"
    ((${mins/ *} == 1))  && mins="${mins/s}"
    
    # Hide empty fields.
    ((${days/ *} == 0))  && unset days
    ((${hours/ *} == 0)) && unset hours
    ((${mins/ *} == 0))  && unset mins
    
    uptime="${days:+$days, }${hours:+$hours, }${mins}"
    uptime="${uptime%', '}"
    uptime="${uptime:-${seconds} seconds}"

   if [[ -f "/sys/devices/virtual/dmi/id/board_vendor" ||
                    -f "/sys/devices/virtual/dmi/id/board_name" ]]; then
	model="$(< /sys/devices/virtual/dmi/id/board_vendor)"
	model+=" $(< /sys/devices/virtual/dmi/id/board_name)"
   fi

   if [[ -f "/sys/devices/virtual/dmi/id/bios_vendor" ||
                    -f "/sys/devices/virtual/dmi/id/bios_version" ]]; then
        bios="$(< /sys/devices/virtual/dmi/id/bios_vendor)"
        bios+=" $(< /sys/devices/virtual/dmi/id/bios_version)"
        bios+=" $(< /sys/devices/virtual/dmi/id/bios_date)"
   fi
}

#clear
PROCCOUNT=`ps -Afl | wc -l`  		# nombre de lignes
PROCCOUNT=`expr $PROCCOUNT - 5`		# on ote les non concernées
GROUPZ=`users`
ipinfo=$(curl -s ipinfo.io) 		# info localisation format json
#ipinfo=$(curl -s iplocality.com) 		# info localisation format json
publicip=$(echo $ipinfo | jq -r '.ip')  # extraction des données , installer préalablement "jq"
ville=$(echo $ipinfo | jq -r '.city')
pays=$(echo $ipinfo | jq -r '.country')
cpuname=`cat /proc/cpuinfo |grep 'model name' | cut -d: -f2 | sed -n 1p`
iplink=`ip link show |grep -m 1 "2:" | awk '{print $2}' | cut -d: -f1`

if [[ $GROUPZ == *irc* ]]; then
ENDSESSION=`cat /etc/security/limits.conf | grep "@irc" | grep maxlogins | awk {'print $4'}`
PRIVLAGED="IRC Account"
else
ENDSESSION="Unlimited"
PRIVLAGED="Regular User"
fi
get_infos
logo=$(figlet "`hostname --fqdn`")
#meteo=$(curl fr.wttr.in/$ville?0)
sdx=$(df -h |grep "/dev/sd") # les montages /dev/sd
distri=$(lsb_release -sd)
distri+=" $(uname -m)"

echo -e "
\e[1;31m$logo
\e[1;35m   \e[1;37mHostname \e[1;35m= \e[1;32m`hostname`
\e[1;35m \e[1;37mWired IpV4 \e[1;35m= \e[1;32m`ip addr show $iplink | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\e[1;35m \e[1;37mWired IpV6 \e[1;35m= \e[1;32m`ip addr show $iplink | grep -E 'inet6' |grep -E 'scope link' | awk '{print $2}' | cut -d/ -f1`
\e[1;35m     \e[1;37mKernel \e[1;35m= \e[1;32m`uname -r`
\e[1;35m    \e[1;37mDistrib \e[1;35m= \e[1;32m$distri
\e[1;35m     \e[1;37mUptime \e[1;35m= \e[1;32m`echo $uptime`
\e[1;35m       \e[1;37mBios \e[1;35m= \e[1;32m`echo $bios`
\e[1;35m      \e[1;37mBoard \e[1;35m= \e[1;32m`echo $model`
\e[1;35m        \e[1;37mCPU \e[1;35m= \e[1;32m`echo $cpuname`
\e[1;35m \e[1;37mMemory Use \e[1;35m= \e[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\e[1;35m   \e[1;37mUsername \e[1;35m= \e[1;32m`whoami`
\e[1;35m   \e[1;37mSessions \e[1;35m= \e[1;32m`who | grep $USER | wc -l`
\e[1;35m\e[1;37mPublic IpV4 \e[1;35m= \e[1;32m`echo $publicip`
\e[1;35m\e[1;37mPublic IpV6 \e[1;35m= \e[1;32m`ip addr show $iplink | grep -m 1 'inet6\b'  | awk '{print $2}' | cut -d/ -f1`
\e[1;35m\e[1;33m$sdx
\e[1;0m
"
1
2
chmod +x ssh_rc_bash # rendre le bash exécutable
./ssh_rc_bash        # exécution

Parefeu - UFW

en mode su

Les serveurs Debian peuvent utiliser des pare-feu pour s’assurer que seules certaines connexions à des services spécifiques sont autorisées.
Nous allons installer et utiliser le pare-feu UFW pour aider à définir les règles du pare-feu et à gérer les exceptions.

Installation

1
apt install ufw

Les profils de pare-feu permettent à l’UFW de gérer des ensembles de règles de pare-feu nommés pour les applications installées. Les profils de certains logiciels courants sont fournis par défaut avec UFW et les paquets peuvent enregistrer des profils supplémentaires avec UFW pendant le processus d’installation. OpenSSH, le service qui nous permet de nous connecter à notre serveur maintenant, dispose d’un profil de pare-feu que nous pouvons utiliser.

Vous pouvez lister tous les profils d’application disponibles en tapant :

1
ufw app list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Available applications:
  AIM
  Bonjour
  CIFS
  DNS
  Deluge
  IMAP
  IMAPS
  IPP
  KTorrent
  Kerberos Admin
  Kerberos Full
  Kerberos KDC
  Kerberos Password
  LDAP
  LDAPS
  LPD
  MSN
  MSN SSL
  Mail submission
  NFS
  OpenSSH
  POP3
  POP3S
  PeopleNearby
  SMTP
  SSH
  Socks
  Telnet
  Transmission
  Transparent Proxy
  VNC
  WWW
  WWW Cache
  WWW Full
  WWW Secure
  XMPP
  Yahoo
  qBittorrent
  svnserve

Nous devons nous assurer que le pare-feu autorise les connexions SSH afin de pouvoir nous reconnecter la prochaine fois.
ATTENTION SI PORT DIFFERENT !!!

1
2
ufw allow OpenSSH    # SSH port 22 par défaut
ufw allow 55039/tcp  # SSH port 55039  PORT DIFFERENT !!!

Ensuite, nous pouvons activer le pare-feu

1
ufw enable         # Tapez y et appuyez sur ENTER pour continuer.
1
2
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Vous pouvez voir que les connexions SSH sont toujours autorisées

1
ufw status    # SSH port 22 par défaut
1
2
3
4
5
6
Status: active

To             Action   From
--             ------   ----
OpenSSH          ALLOW    Anywhere
OpenSSH (v6)     ALLOW    Anywhere (v6)
1
ufw status    # SSH port 55039  PORT DIFFERENT !!!
1
2
3
4
5
6
Status: active

To                         Action      From
--                         ------      ----
55039/tcp                  ALLOW       Anywhere                  
55039/tcp (v6)             ALLOW       Anywhere (v6)             

Comme le pare-feu bloque actuellement toutes les connexions, à l’exception de la connexion SSH, si vous installez et configurez des services supplémentaires, vous devrez ajuster les paramètres du pare-feu pour permettre un trafic d’entrée acceptable. Vous pouvez apprendre quelques opérations UFW courantes dans notre guide UFW Essentials: Common Firewall Rules and Commands

Ouvrir des accès complémentaires

http https dns

1
2
ufw allow proto tcp from any to any port 80,443
ufw allow DNS

Status

1
ufw status verbose
1
2
3
4
5
6
7
8
9
10
11
12
13
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
55039/tcp                  ALLOW IN    Anywhere                  
80,443/tcp                 ALLOW IN    Anywhere                  
53 (DNS)                   ALLOW IN    Anywhere                  
55039/tcp (v6)             ALLOW IN    Anywhere (v6)             
80,443/tcp (v6)            ALLOW IN    Anywhere (v6)             
53 (DNS (v6))              ALLOW IN    Anywhere (v6)             

msmtp (client SMTP)

Dans son mode de fonctionnement par défaut, il lit un courrier à partir d’une entrée standard et l’envoie à un serveur SMTP prédéfini qui s’occupe de sa bonne distribution. Les options de la ligne de commande et les codes de sortie sont compatibles avec sendmail.

Le mot de passe à chiffrer + validation par phrase secrète

1
gpg --encrypt -o .msmtp-wgvpn-space.gpg -r wgvpn-space@wgvpn.space - 

Saisir , entrée puis Ctrl D
Déchiffrer une première fois avec la phrase secrète

1
gpg --no-tty -q -d .msmtp-wgvpn-space.gpg

Certificats SSL letsencrypt (acme)

SSL Letsencrypt

Prérequis

1
sudo apt install socat # prérequis

Installation gestionnaire des certificats Let’s Encrypt

1
2
3
4
cd ~
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install 

Se déconnecter puis se reconnecter pou la prise en compte

Se connecter sur l’api OVH pour les paramètres (clé et secret)

1
2
export OVH_AK="votre application key"
export OVH_AS="votre application secret"

Domaine wgvpn.space

1
acme.sh --dns dns_ovh --issue --keylength ec-384 -d 'wgvpn.space' -d 'moni.wgvpn.space'

Les certificats

1
2
3
4
[mardi 31 mars 2020, 20:04:10 (UTC+0200)] Your cert is in  /home/admspace//.acme.sh/wgvpn.space_ecc/wgvpn.space.cer 
[mardi 31 mars 2020, 20:04:10 (UTC+0200)] Your cert key is in  /home/admspace//.acme.sh/wgvpn.space_ecc/wgvpn.space.key 
[mardi 31 mars 2020, 20:04:10 (UTC+0200)] The intermediate CA cert is in  /home/admspace//.acme.sh/wgvpn.space_ecc/ca.cer 
[mardi 31 mars 2020, 20:04:10 (UTC+0200)] And the full chain certs is there:  /home/admspace//.acme.sh/wgvpn.space_ecc/fullchain.cer 

Les liens pour les certificats

SSL

1
2
3
4
sudo ln -s/home/admspace/.acme.sh/wgvpn.space_ecc/wgvpn.space.cer /etc/ssl/private/wgvpn.space-chain.pem   # cert domain
sudo ln -s /home/admspace/.acme.sh/wgvpn.space_ecc/wgvpn.space.key /etc/ssl/private/wgvpn.space-key.pem     # cert key
sudo ln -s /home/admspace/.acme.sh/wgvpn.space_ecc/ca.cer /etc/ssl/private/wgvpn.space-ca.pem                 # intermediate CA cert
sudo ln -s /home/admspace/.acme.sh/wgvpn.space_ecc/fullchain.cer /etc/ssl/private/wgvpn.space-fullchain.pem   # full chain certs

Compilation Nginx + OpenSSL (TLS v1.3) + PHP7.2 + MariaDB

Si tout est OK

1
2
3
4
5
6
7
8
nginx version: nginx/1.16.1
OpenSSL 1.1.1d  10 Sep 2019
mysql  Ver 15.1 Distrib 10.3.22-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Mot de passe MySql/MariaDB : /etc/mysql/mdp
PHP 7.2.29-1+0~20200320.39+debian10~1.gbp513c2e (cli) (built: Mar 20 2020 14:37:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.29-1+0~20200320.39+debian10~1.gbp513c2e, Copyright (c) 1999-2018, by Zend Technologies

Supprimer des dossiers

1
2
sudo rm /etc/nginx/conf.d/default.conf 
sudo rm -r /etc/nginx/conf.d/ouestline.xyz.d/

ssl diffie hellmann headers

  • Les certificats Let’s Encrypt du domaine dans /etc/ssl/private/
  • Remplacer le domaine wgvpn.space par le votre
  • Diffie-Hellman : openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048

fichier /etc/nginx/ssl_dh_headers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    ssl_certificate /etc/ssl/private/wgvpn.space-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/wgvpn.space-key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_dhparam /etc/ssl/private/dh2048.pem;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # Add headers to serve security related headers
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN"; 
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
    add_header Referrer-Policy "no-referrer" always;

Le fichier est à inclure dans tous les fichiers de configuration des VHOST

Icinga 2

Liens

Installer dépôts APT Icinga Web 2

en mode sudo

Nettoyage de toute trace apache

1
sudo apt -y remove --purge apache*

installer les repos en exécutant les commandes ci-dessous

1
2
3
4
5
apt install -y apt-transport-https wget gnupg
wget -O - https://packages.icinga.com/icinga.key | apt-key add -
echo "deb https://packages.icinga.com/debian icinga-buster main" > /etc/apt/sources.list.d/icinga.list
echo "deb-src https://packages.icinga.com/debian icinga-buster main" >> /etc/apt/sources.list.d/icinga.list
apt update

Installer Icinga 2 Web

Installez les progiciels de gestion Icinga 2 web et CLI.

1
apt install icinga2 monitoring-plugins

Icinga doit être lancé

1
systemctl status icinga2
1
2
3
4
5
● icinga2.service - Icinga host/service/network monitoring system
   Loaded: loaded (/lib/systemd/system/icinga2.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/icinga2.service.d
           └─limits.conf
   Active: active (running) since Tue 2020-03-31 20:27:38 CEST; 1min 2s ago

base de données

1
2
apt install mariadb-server mariadb-client
apt install icinga2-ido-mysql

Si besoin les details d’accès à la BDD (user,password,database) seront dans /etc/icinga2/features-{en,dis}abled/ido-mysql.conf



base : icingaweb2 mot de passe : spree _frays _bankable _embargo _gander _astronomy

mysql -uroot -p$(cat /etc/mysql/mdp) -e “CREATE DATABASE icingaweb2;GRANT ALL PRIVILEGES ON icingaweb2.* TO ‘icingaweb2’@’localhost’ IDENTIFIED BY ‘spree _frays _bankable _embargo _gander _astronomy’;FLUSH PRIVILEGES;”

Activation des fonctions utiles :

1
2
icinga2 feature enable ido-mysql
icinga2 feature enable command

Redémarrage pour la prise en compte :

1
systemctl restart icinga2

Interface web icinga nginx

L’interface web d’Icinga2 est fort séparée du cœur d’exécution (qui sera commun aux maîtres et esclaves). On parle d’Icingaweb2. Celui-ci échange avec Icinga2 via la base de données et via une possibilité de commande locale. On installera également icingacli qui aide sur la gestion des modules d’Icingaweb2.

1
2
3
4
5
apt install icingacli icingaweb2 icingaweb2-module-monitoring php7.2-mysql php7.2-intl
usermod -a -G icingaweb2 www-data

apt remove --purge apache2*  # des résidus polluants
apt autoremove

Configuration moni.wgvpn.space

1
nano /etc/nginx/conf.d/moni.wgvpn.space.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name moni.wgvpn.space;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    access_log /var/log/nginx/moni.wgvpn.space-access.log;
    error_log /var/log/nginx/moni.wgvpn.space-error.log;

    server_name moni.wgvpn.space;

    include ssl_dh_headers;

    # if folder moni.wgvpn.space.d , uncomment the following directive
    include conf.d/wgvpn.space.d/icingaweb2.conf;

}

Créer les dossiers

1
mkdir -p /etc/nginx/conf.d/wgvpn.space.d

Puis on génére la conf à l’aide de icingacli :

1
icingacli setup config webserver nginx --document-root /usr/share/icingaweb2/public >> /etc/nginx/conf.d/wgvpn.space.d/icingaweb2.conf

On va la modifier pour l’adapter (définir fastcgi_pass)

1
nano /etc/nginx/conf.d/wgvpn.space.d/icingaweb2.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
location ~ ^/icingaweb2/index\.php(.*)$ {
  fastcgi_pass unix:/run/php/php7.2-fpm.sock;
  fastcgi_index index.php;
  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME /usr/share/icingaweb2/public/index.php;
  fastcgi_param ICINGAWEB_CONFIGDIR /etc/icingaweb2;
  fastcgi_param REMOTE_USER $remote_user;
}

location ~ ^/icingaweb2(.+)? {
  alias /usr/share/icingaweb2/public;
  index index.php;
  try_files $1 $uri $uri/ /icingaweb2/index.php$is_args$args;
}

Paramètre date php date.timezone = Europe/Paris dans /etc/php/7.2/fpm/php.ini
Rechargement

1
systemctl reload php7.2-fpm nginx

Finaliser l’installation

Le setup d’icinga va exiger un jeton d’authentification, qu’on génère ainsi :

1
icingacli setup token create

The newly generated setup token is: 0b17237d99235d46

Il suffit ensuite d’ouvrir https://moni.ouestline.xyz/icingaweb2/setup dans un butineur, et de placer le jeton

Si vous avez oubliez le jeton :

1
icingacli setup token show

Ensuite laissez vous faire. Il faudra configurer l’accès à la base de données d’Icinga2 pour lire l’état du monitoring, et configurer une base propre à Icingaweb2 pour son fonctionnement propre.


Fournissez le jeton de configuration Icinga web 2 que vous avez généré précédemment et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Sélectionnez maintenant le module souhaité et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Assurez-vous que tous les modules PHP requis sont installés. Ensuite, cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Sélectionnez le type d’authentification comme base de données et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Fournissez les détails de votre base de données comme le nom de la base de données, le nom d’utilisateur de la base de données, le mot de passe et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Indiquez votre nom de backend et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Créez votre utilisateur d’administration Icingaweb2 et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Passez en revue toutes les modifications que vous avez apportées et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Cliquez sur le bouton Suivant pour configurer le module de surveillance. Vous devriez voir la page suivante :


Indiquez votre nom et votre type de backend, puis cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Fournissez les détails de votre base de données que vous avez créée lors de l’installation de l’OID et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Indiquez votre nom de transport, sélectionnez une ligne de commande locale et cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Cliquez sur le bouton Suivant. Vous devriez voir la page suivante :


Maintenant, passez en revue toutes les modifications que vous avez apportées et cliquez sur le bouton Terminer. Une fois l’installation terminée avec succès, vous devriez voir la page suivante :


Cliquez sur le bouton “Login to Icinga Web 2”, vous serez redirigé vers la page suivante :


Indiquez votre nom d’utilisateur et votre mot de passe Icinga2 admin et cliquez sur le bouton Login. Vous devriez voir le tableau de bord d’Icinga2 sur la page suivante :

Vous avez réussi à installer et à configurer Icinga2 et Icinga web 2 sur le serveur Debian 10. Vous pouvez maintenant facilement ajouter des hôtes de surveillance à votre serveur et démarrer la surveillance.

Comment surveiller les hôtes et les services avec Icinga

How To Monitor Hosts and Services with Icinga

1 - Configuration de la surveillance simple de l’hôte

Une façon simple de surveiller un serveur avec Icinga est de mettre en place une vérification régulière de ses services disponibles en externe. Donc, pour un hébergeur, nous testons régulièrement l’adresse IP du serveur et essayons également d’accéder à une page Web. Cela nous dira si l’hôte est en place et si le serveur Web fonctionne correctement.

Remarque: Icinga utilise toujours par défaut le nom de domaine complet (FQDN) de tout hôte avec lequel il traite. Un nom de domaine complet est un nom d’hôte plus son nom de domaine, donc web-1.example.com , par exemple. Si vous n’avez pas de domaine approprié configuré pour un hôte, le nom de domaine complet sera quelque chose comme web-1.localdomain
si vous n’avez pas de «vrai» FQDN, utilisez toujours l’adresse IP du serveur dans n’importe quel champ d’ address Icinga que vous configurez.

Connectez-vous au nœud maître. Pour ajouter un nouvel hôte, nous devons modifier le fichier hosts.conf

1
  sudo nano /etc/icinga2/conf.d/hosts.conf

Cela ouvrira un fichier avec quelques commentaires explicatifs et un seul bloc hôte défini. Le bloc de configuration object Host NodeName existant définit l’ hôte icinga-master , qui est l’hôte sur lequel nous avons installé Icinga et Icinga Web. Positionnez votre curseur au bas du fichier et ajoutez un nouvel hôte:

1
/etc/icinga2/conf.d/hosts.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * Host definitions with object attributes
 * used for apply rules for Service, Notification,
 * Dependency and ScheduledDowntime objects.
 *
 * Tip: Use `icinga2 object list --type Host` to
 * list all host objects after running
 * configuration validation (`icinga2 daemon -C`).
 */

/*
 * This is an example host based on your
 * local host's FQDN. Specify the NodeName
 * constant in `constants.conf` or use your
 * own description, e.g. "db-host-1".
 */

object Host NodeName {
  /* Import the default host template defined in `templates.conf`. */
  import "generic-host"

  /* Specify the address attributes for checks e.g. `ssh` or `http`. */
  address = "127.0.0.1"
  address6 = "::1"

  /* Set custom variable `os` for hostgroup assignment in `groups.conf`. */
  vars.os = "Linux"

  /* Define http vhost attributes for service apply rules in `services.conf`. */
  vars.http_vhosts["http"] = {
    http_uri = "/"
  }
  /* Uncomment if you've sucessfully installed Icinga Web 2. */
  //vars.http_vhosts["Icinga Web 2"] = {
  //  http_uri = "/icingaweb2"
  //}

  /* Define disks and attributes for service apply rules in `services.conf`. */
  vars.disks["disk"] = {
    /* No parameters. */
  }
  vars.disks["disk /"] = {
    disk_partitions = "/"
  }

  /* Define notification mail attributes for notification apply rules in `notifications.conf`. */
  vars.notification["mail"] = {
    /* The UserGroup `icingaadmins` is defined in `users.conf`. */
    groups = [ "icingaadmins" ]
  }
}

object Host "cinay.eu" {
  import "generic-host"
  address = "51.77.151.245"
  vars.http_vhosts["http"] = {
    http_uri = "/"
  }
  vars.notification["mail"] = {
    groups = [ "icingaadmins" ]
  }
}

Cela définit un hôte appelé cinay.eu , à partir d’un hôte par défaut et d’un modèle appelé generic-host , pointe Icinga vers la bonne adresse IP, puis définit quelques variables qui indiquent à Icinga de vérifier une réponse HTTPS à l’URL racine ( / ) et avertir le groupe icingaadmins par e-mail en cas de problème.

Enregistrez et fermez le fichier, puis redémarrez Icinga:

1
  sudo systemctl restart icinga2

Revenez à l’interface Web Icinga dans votre navigateur. L’interface se met à jour assez rapidement, vous n’avez donc pas besoin de rafraîchir la page. Les nouvelles informations sur l’hôte devraient être remplies rapidement et les “health checks” passeront de Pending (En attente) à Ok une fois qu’Icinga aura rassemblé suffisamment d’informations.

Ensuite, nous allons configurer la surveillance via un agent Icinga, afin que nous puissions garder un œil sur des informations système plus détaillées.

2 - Configuration de la surveillance basée sur l’agent

Icinga fournit un mécanisme de communication sécurisée entre un nœud maître et client afin d’exécuter des contrôles d’intégrité à distance plus étendus.
Au lieu de seulement savoir que notre serveur Web sert des pages avec succès, nous pourrions également surveiller la charge du processeur, le nombre de processus, l’espace disque, etc.

Nous allons mettre en place un deuxième serveur à surveiller. Nous l’appellerons web-2.example.com . Nous devons installer le logiciel Icinga sur la machine distante, exécuter des assistants de configuration pour établir la connexion, puis mettre à jour certains fichiers de configuration sur le nœud maître Icinga.

Remarque: Il existe de nombreuses façons d’architecturer une installation Icinga, avec plusieurs niveaux de nœuds maître / satellite / client , un basculement haute disponibilité et plusieurs façons de partager les détails de configuration entre les nœuds. Nous mettons en place une structure simple à deux niveaux avec un nœud maître et plusieurs nœuds clients . De plus, toute la configuration sera effectuée sur le nœud maître , et nos commandes de vérification de l’état seront planifiées sur le nœud maître et transmises aux clients. Le projet Icinga appelle ce mode de configuration de point de terminaison de commande descendante .

Configurer le nœud maître wgvpn.space

Tout d’abord, nous devons configurer le nœud maître pour établir des connexions client. Nous le faisons en exécutant l’ assistant de configuration de nœud sur notre nœud maître:

1
  sudo icinga2 node wizard

Cela lancera un script qui nous posera quelques questions et mettra les choses en place pour nous. Dans ce qui suit, nous avons ENTER sur ENTER pour accepter la plupart des valeurs par défaut. Les réponses non par défaut sont mises en évidence. Certaines sorties d’informations ont été supprimées pour plus de clarté:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Welcome to the Icinga 2 Setup Wizard!

We will guide you through all required configuration details.

Please specify if this is an agent/satellite setup ('n' installs a master setup) [Y/n]: n

Starting the Master setup routine...

Please specify the common name (CN) [wgvpn.space]: 
Reconfiguring Icinga...
Checking for existing certificates for common name 'wgvpn.space'...
Certificate '/var/lib/icinga2/certs//wgvpn.space.crt' for CN 'wgvpn.space' already existing. Skipping certificate generation.
Generating master configuration for Icinga 2.
'api' feature already enabled.

Master zone name [master]:wgvpn.space 

Default global zones: global-templates director-global
Do you want to specify additional global zones? [y/N]:n 
Please specify the API bind host/port (optional):
Bind Host []: 
Bind Port []: 

Do you want to disable the inclusion of the conf.d directory [Y/n]:n 
Disabling the inclusion of the conf.d directory...
Checking if the api-users.conf file exists...

Done.

Now restart your Icinga 2 daemon to finish the installation!

Redémarrez Icinga pour terminer la mise à jour de la configuration:

1
  sudo systemctl restart icinga2

Ouvrez un port pare-feu pour autoriser les connexions externes à Icinga:

1
  sudo ufw allow 5665

Nous allons maintenant passer au nœud client, installer Icinga et exécuter le même assistant.

Configurer le nœud client wgvpn.ovh

Connectez-vous au serveur wgvpn.ovh
Nous devons réinstaller le référentiel Icinga, puis installer Icinga lui-même. Il s’agit de la même procédure que nous avons utilisée sur le nœud maître.
Installer les repos en exécutant les commandes ci-dessous

1
2
3
4
5
6
sudo -s
apt install -y apt-transport-https wget gnupg
wget -O - https://packages.icinga.com/icinga.key | apt-key add -
echo "deb https://packages.icinga.com/debian icinga-buster main" > /etc/apt/sources.list.d/icinga.list
echo "deb-src https://packages.icinga.com/debian icinga-buster main" >> /etc/apt/sources.list.d/icinga.list
apt update

Ensuite, installez icinga2 . Notez que nous n’avons pas besoin du icinga2-ido-mysql que nous avons installé sur le nœud maître:

1
  sudo apt install icinga2

Maintenant, nous exécutons l’assistant de nœud sur ce serveur, mais nous faisons une configuration satellite au lieu de maître :

1
  sudo icinga2 node wizard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Welcome to the Icinga 2 Setup Wizard!

We will guide you through all required configuration details.

Please specify if this is an agent/satellite setup ('n' installs a master setup) [Y/n]: y

Starting the Agent/Satellite setup routine...

Please specify the common name (CN) [wgvpn.ovh]: 

Please specify the parent endpoint(s) (master or satellite) where this node should connect to:
Master/Satellite Common Name (CN from your master/satellite node): wgvpn.space

Do you want to establish a connection to the parent node from this node? [Y/n]: y
Please specify the master/satellite connection information:
Master/Satellite endpoint host (IP address or FQDN): wgvpn.space
Master/Satellite endpoint port [5665]: 

Add more master/satellite endpoints? [y/N]:n 
Parent certificate information:

 Subject:     CN = wgvpn.space
 Issuer:      CN = Icinga CA
 Valid From:  Apr  9 18:19:11 2020 GMT
 Valid Until: Apr  6 18:19:11 2035 GMT
 Fingerprint: 6C 27 81 36 E3 DE EE 05 59 29 83 E5 93 0F EE C4 36 CE 20 2F 

L’assistant va maintenant récupérer le certificat public de notre nœud maître et nous afficher ses détails. Confirmez les informations, puis continuez:

1
2
3
4
5
Is this information correct? [y/N]: y

Please specify the request ticket generated on your Icinga 2 master (optional).
 (Hint: # icinga2 pki ticket --cn 'wgvpn.ovh'): 

À ce stade, revenez à votre serveur master wgvpn.space et exécutez la commande à laquelle l’assistant vous a invité. N’oubliez pas sudo devant:

1
  sudo icinga2 pki ticket --cn 'wgvpn.ovh'

La commande produira une clé fa84ecb7c0f516bc58cdaaf8cccf82eb3ddb88d9
Copiez-le dans votre presse-papiers, puis revenez au nœud client, collez-le et ENTER sur ENTER pour continuer avec l’assistant.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Please specify the request ticket generated on your Icinga 2 master (optional).
 (Hint: # icinga2 pki ticket --cn 'wgvpn.ovh'): fa84ecb7c0f516bc58cdaaf8cccf82eb3ddb88d9
Please specify the API bind host/port (optional):
Bind Host []: 
Bind Port []: 

Accept config from parent node? [y/N]: n
Accept commands from parent node? [y/N]: y

Reconfiguring Icinga...

Local zone name [wgvpn.ovh]: wgvpn.ovh
Parent zone name [master]: wgvpn.space

Default global zones: global-templates director-global
Do you want to specify additional global zones? [y/N]: n

Do you want to disable the inclusion of the conf.d directory [Y/n]:n 
Disabling the inclusion of the conf.d directory...

Done.

Now restart your Icinga 2 daemon to finish the installation!

Ouvrez maintenant le port Icinga sur votre pare-feu:

1
  sudo ufw allow 5665

Et redémarrez Icinga pour mettre à jour complètement la configuration:

1
  sudo systemctl restart icinga2

Vous pouvez vérifier qu’il existe une connexion entre les deux serveurs avec netstat :

1
  netstat | grep :5665

La connexion peut prendre un moment. Finalement, netstat affichera une ligne montrant une connexion ESTABLISHED sur le bon port.

1
tcp        0      0 wgvpn.ovh:33422         wgvpn.space:5665        ESTABLISHED

Cela montre que nos serveurs se sont connectés et nous sommes prêts à configurer les vérifications client.

Configurer la surveillance des agents

Même si le maître et le client sont maintenant connectés, il reste encore une configuration à faire sur le maître pour activer la surveillance. Nous devons configurer un nouveau fichier hôte.

Revenir sur le maître wgvpn.space

Un niveau d’organisation important dans une installation Icinga est le concept de zone
Tous les nœuds clients doivent créer leur propre zone et faire rapport à une zone parent, dans ce cas notre nœud maître.
Par défaut, la zone de notre nœud maître est nommée d’après son nom de domaine complet.
Nous allons créer un répertoire nommé d’après notre zone maître dans le répertoire zones.d
Cela contiendra les informations de tous les clients de la zone maître.

Créez le répertoire de zone:

1
  sudo mkdir /etc/icinga2/zones.d/wgvpn.space

Nous allons créer un fichier de configuration des services. Cela définira certaines vérifications de service que nous effectuerons sur n’importe quel nœud client distant.

1
  sudo nano /etc/icinga2/zones.d/wgvpn.space/services.conf

Collez ce qui suit, puis enregistrez et fermez:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apply Service "load" {
  import "generic-service"
  check_command = "load"
  command_endpoint = host.vars.client_endpoint
  assign where host.vars.client_endpoint
}

apply Service "procs" {
  import "generic-service"
  check_command = "procs"
  command_endpoint = host.vars.client_endpoint
  assign where host.vars.client_endpoint
}

Cela définit deux contrôles de service.

  • Le premier rendra compte de la charge du processeur
  • le second vérifiera le nombre de processus sur le serveur.

Les deux dernières lignes de chaque définition de service sont importantes. command_endpoint indique à Icinga que cette vérification de service doit être envoyée à un point de terminaison de commande distant.
La ligne assign where attribue automatiquement la vérification de service à tout hôte sur lequel une variable client_endpoint est définie.

Créons un tel hôte maintenant. Ouvrez un nouveau fichier dans le répertoire de zone que nous avons créé précédemment. Ici, nous avons nommé le fichier d’après l’hôte distant:

1
  sudo nano /etc/icinga2/zones.d/wgvpn.space/wgvpn.ovh.conf

Collez dans la configuration suivante, puis enregistrez et fermez le fichier:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
object Zone "wgvpn.ovh" {
  endpoints = [ "wgvpn.ovh" ]
  parent = "wgvpn.space"
}

object Endpoint "wgvpn.ovh" {
  host = "51.91.249.57"
}

object Host "wgvpn.ovh" {
  import "generic-host"
  address = "51.91.249.57"
  vars.http_vhosts["http"] = {
    http_uri = "/"
  }
  vars.notification["mail"] = {
    groups = [ "icingaadmins" ]
  }
  vars.client_endpoint = name
}

Ce fichier définit une zone pour notre hôte distant et la lie à la zone parent. Il définit également l’hôte comme un point de terminaison, puis définit l’hôte lui-même, en important certaines règles par défaut à partir du modèle generic-host . Il définit également des vars pour créer une vérification HTTP et activer les notifications par e-mail. Notez que parce que cet hôte a vars.client_endpoint = name , il sera également affecté aux vérifications de service que nous venons de définir dans services.conf .

Redémarrez Icinga pour mettre à jour la configuration:

1
  sudo systemctl restart icinga2

Revenez à l’interface Web Icinga
le nouvel hôte s’affichera avec des contrôles en attente . Après quelques instants, ces contrôles devraient devenir OK .
Cela signifie que notre nœud client exécute correctement les vérifications du nœud maître.

Conclusion

Dans ce didacticiel, nous avons configuré deux types différents de surveillance avec Icinga, les vérifications de service externes et les vérifications d’hôtes basées sur des agents. Il y a beaucoup plus à apprendre sur la configuration et le travail avec Icinga, donc vous voudrez probablement approfondir la documentation complète d’Icya .

Notez que si vous arrivez à un point où vous avez besoin de commandes de vérification personnalisées, vous devrez les synchroniser du maître aux nœuds clients à l’aide d’une zone de configuration globale . Vous pouvez en savoir plus sur cette fonctionnalité spécifique ici .

Enfin, si vous avez un grand nombre de serveurs à surveiller, vous pourriez envisager d’utiliser un logiciel de gestion de configuration pour automatiser vos mises à jour de configuration Icinga. Notre série de didacticiels Prise en main de la gestion de la configuration donne un aperçu complet des concepts et des logiciels impliqués.

Cet article est sous licence CC BY 4.0 par l'auteur.