Quantcast
Channel: Tutoriels administration réseau | IT-Connect
Viewing all 138 articles
Browse latest View live

pfSense : Activer l’accès à l’interface web depuis WAN

$
0
0

I. Présentation

Dans ce tutoriel, nous allons créer une règle au sein de pfSense afin d’autoriser les connexions sur l’interface web d’administration, pour un poste client qui se situe dans le réseau WAN. Ainsi, il sera possible d’accéder à la GUI de pfSense aussi bien depuis le LAN que le WAN.

Attention tout de même, cette pratique n’est pas recommandé en matière de sécurité mais peut être bien pratique dans le cadre de tests. La règle que je vais créer sera tout de même restrictive puisqu’une seule adresse IP sera autorisée à se connecter depuis l’extérieur (WAN).

Pour information, j’utilise pfSense 2.1.5.

II. Création d’une règle dans le firewall

Connectez-vous à l’interface d’administration pfSense, depuis le LAN. Authentifiez-vous.

Accédez au menu Firewall puis Rules.

guiwan1

Au niveau des règles, placez-vous dans l’onglet “WAN” et cliquez sur le bouton en bas à droite pour créer une nouvelle règle.

guiwan1b

Le paramétrage de la règle, c’est là que tout se joue !

– Action : “Pass” car on souhaite créer une règle pour autoriser du trafic

– Interface : “WAN” car cela concerne l’interface extérieure

Source : Plusieurs choix sont possibles, pour ma part je sélectionne “Single host or alias” car je souhaite autoriser une seule machine. Vous pouvez également autoriser un réseau. L’adresse IP de la machine doit être indiquée dans la zone rouge.

Destination : “WAN Address” car la règle concerne le trafic à destination de l’adresse WAN.

Destination port range : Indiquez “HTTPS” et seulement HTTPS pour autoriser seulement l’accès GUI via HTTPS.

Log : Activer ou non la journalisation sur cette règle.

Description : Ajoutez une description pour cette règle (important !)

En résumé :

guiwan2bis

Cliquez sur “Save” pour valider la création de la règle. Ensuite, cliquez sur “Apply changes” pour appliquer la règle sur le firewall.

guiwan3

La règle apparaît bien dans la table de filtrage WAN :

guiwan4

Dès à présent, vous pouvez vous connecter à l’interface web pfSense depuis la machine autorisée, tout en étant dans le réseau WAN.


Manipulation avancée des fichiers PCAP avec editcap

$
0
0

I. Présentation d’editcap et mergecap

Lors de la manipulation et l’étude de paquets réseaux en tant qu’administrateur systèmes, administrateur réseaux ou même dans le domaine de la sécurité et du forensic, on peut vite être amené à manipuler des fichiers au format PCAP, par exemple pour effectuer des filtres dessus, en fusionner ou en couper en plusieurs petits fichiers. C’est ce que nous allons voir dans ce cours.

Pour rappel, un fichier PCAP est un fichier issu d’un sniffe de flux réseaux (par exemple avec Wireshark ou TCPDump), ce sniff réseaux ayant été traité avec la librairie libpcap qui produit justement un enregistrement au format PCAP (ou PCAPNG parfois). Ces fichiers peuvent alors être transportés, stockés et rouverts plus tard, on voit alors tout l’intérêt de savoir les manipuler avec précisions.

II. Installation d’editcap et de mergecap

Editcap fait partie de l’environnement des outils Wireshark, il permet de lire une grande partie des paquets capturés par Wireshark (ou d’autre application comme TCPDump) à partir d’un fichier, on pourra optionnellement les convertir et les trier selon divers critères  et écrire le résultat dans un nouveau fichier au format PCAP. L’utilisation typique est le fait d’avoir un gros fichier PCAP dont on souhaite filtrer le contenu pour l’écrire dans un nouveau fichier à part.

Mergecap est un outil complémentaire d’Editcap qui n’interviendra que pour une utilisation particulière : la fusion de plusieurs fichiers au format PCAP.

Editcap et Mergecap seront donc présents sur votre système Linux dès que vous installerez Wireshark, si vous souhaitez tout de même n’installer que editcap et mergecap, ceux-ci sont  contenus dans le paquet “Wireshark-common”, pour Debian et Ubuntu :

apt-get install wireshark-common

Pour CentOS/RHEL, il faut passer par l’installer de Wireshark directement :

yum install wireshark

Editcap est un outil très complet, bien que nous ne verrons que quelques une de ses fonctionnalités dans ce cours.

III. Couper un fichier PCAP

Nous allons tout d’abord voir comment couper un fichier PCAP. On va simplement mettre en entrée un fichier PCAP puis obtenir un second fichier PCAP à partir de celui-ci en lui appliquant une règle spécifique qui peut, par exemple, être un certain nombre de paquets ou un temps défini. Il peut parfois être pratique de savoir comment couper un très gros fichier PCAP en plusieurs fichiers plus petits pour les faire analyser par plusieurs personnes par exemple. Voici la syntaxe générale d’editcap dans ce contexte :

editcap -c <paquets-par-fichiers> <fichier-pcap-entrée> <préfixe-fichier-pcap-sortie>

Plus clairement, voici comment utiliser editcap avec un fichier PCAP si on souhaite le couper en plusieurs fichiers de 10 000 paquets :

editcap -c 10000 capture.pcap capture-partie

Je mets donc avec l’option “-c” (“count”) le nombre de paquets par fichier, ensuite le fichier à lire (“capture.pcap”) puis le préfixe des fichiers en sortie, soit “capture-partie”, la suite du nom des fichiers sera complétée automatiquement par editcap. En sortie, avec un fichier PCAP de 73 000 paquets, voici ce que j’aurai :

couper-fichier-pcap-editcap

Fichiers résultant du tri automatique d’editcap

J’ai donc bien 7 fichiers de 10 000 paquets  au format PCAP, quelle précision !

On peut aussi effectuer un découpage chronologique, c’est à dire en fonction de la durée de la capture initiale. Voici la syntaxe générale :

editcap -i <secondes-par-fichiers> <fichier-pcap-entrée> <préfixe-fichier-pcap-sortie>

Par exemple si l’on souhaite effectuer un découpage pour avoir des fichiers contenant 60 secondes de capture chacun, on utilisera la commande suivante :

editcap -i 60 capture.pcap capture-partie

Nous aurons donc en sortie un résultat similaire à celui précédent sauf que nous aurons cette fois-ci des fichiers correspondant à 60 secondes de capture chacun.

IV. Fusionner des fichiers PCAP

Nous allons maintenant voir comment fusionner des fichiers au format PCAP, on peut par exemple avoir besoin de cette manipulation si l’on dispose de plusieurs fichiers PCAP obtenus sur des écoutes procédées sur des machines différentes que l’on souhaite analyser en même temps. Supposons que l’on dispose d’un fichier capture1.pcap, d’un fichier capture2.pcap et d’un fichier capture3.pcap. On va vouloir fusionner les trois dans un fichier capture-123.pcap :

merge capture-123.pcap capture1.pcap capture2.pcap capture3.pcap

On se retrouvera donc avec le fichier capture-123.pcap contenant les paquets des trois autres.

V. Filtrer le contenu d’un fichier PCAP

Nous allons maintenant voir une utilisation un peu plus avancée de l’outil editcap. On va en effet chercher à ouvrir un fichier PCAP, filtrer son contenu, puis écrire ce qui est sorti du filtre dans un nouveau fichier.

On peut par exemple avec editcap effectuer un filtre sur une fenêtre de temps très précise. Si j’effectue un enregistrement du trafic réseau permanent que j’enregistre dans un fichier PCAP, puis que je souhaite récupérer ce qu’il s’est passé entre 21:14:00 et 21:15:00 le 3 février 2015, on pourra utiliser la ligne de commande suivante :

editcap -A '2015-03-02 21:14:00' -B '2015-03-02 21:15:00' capture-input.pcap capture-sortie.pcap

J’aurais donc dans le fichier “capture-sortie.pcap” les paquets reçus et émis dans la fenêtre de temps précisée grâce à l’option “-A” pour la date de début et “-B” pour la date de fin.

Note : Attention à bien utiliser le bon format de date, à savoir “AAAA-MM-DD HH:MM:SS”

Également, on pourra très facilement extraire un nombre précis de paquets dans une capture au format PCAP. Par exemple si l’on souhaite extraire les paquets du numéro 1500 au numéro 1700 :

editcap apture-input.pcap capture-sortie.pcap 1500-1700

Nous avons ici vu différents contextes d’utilisation des outils editcap et mergecap qui font partie de la suite Wireshark, ceux-ci peuvent être utilisés dans nombre d’autres contextes, mais la construction des syntaxes ressemblera à ce que l’on a vu ici.

 

 

Supervision : Comprendre et créer ses contrôles

$
0
0

I. Présentation

Nous allons voir comment créer des contrôles dans un système de supervision open source. Je me suis basé sur la configuration de Naemon, mais c’est parfaitement applicable sur d’autres systèmes comme Nagios, Inciga ou Shinken.

Pour commencer, il nous faut des hôtes (si ce n’est pas fait, rendez-vous sur le cours précédent : Créer des objets et des hôtes ). Par défaut en créant un hôte on créer un contrôle. Il va seulement nous indiquer si l’équipement est en vie ou non. Mais nous pouvons faire bien plus que ça 😉 Je vois que vous êtes impatient, alors sans perdre de temps on passe à la 1ere étape !

II. Définir les éléments à superviser

C’est vraiment important. Avant de se lancer, faites une liste des éléments que vous souhaitez superviser. Et surtout, demandez-vous s’ils ont une utilité. On a souvent tendance à balancer des contrôles de partout, c’est vrai c’est chouette dans l’interface. Mais au final est-ce que ça nous apporte quelque chose ? Prenons l’exemple du serveur Exchange. Les serveurs exchange utilisent par défaut 100% de la RAM et c’est le fonctionnement normal du serveur. Bien que l’on soit tenté de contrôler la RAM de toutes nos machines, sur un serveur Exchange, ceci apporte peu d’intérêts.

III. Trouver ses plugins

A. Qu’est-ce que c’est un plug-in ?

Les plug-ins, ce sont des scripts exécutés par votre système pour réaliser un contrôle. Ils retournent un code qui sera interprété comme l’état du contrôle.

Vous avez plusieurs manières de trouver vos plug-ins. Vous pouvez installer le paquet nagios-plugins qui fournit des scripts pour contrôler une grande variété de services et protocoles.

apt-get install nagios-plugins

Vous devriez retrouver vos scripts dans le répertoire suivant /usr/lib/nagios/plug-ins

Si ces plug-ins ne vous suffisent pas, vous pourrez chercher sur internet un script qui correspond à votre besoin. En général vous trouverez ce que vous cherchez. Vous pouvez visiter ces sites :

Si vous ne trouvez pas votre bonheur et que vous avez l’âme d’un développeur, vous pouvez toujours vous lancer dans le développement de votre plug-in. Ou bien vous rapprocher d’une société de développement qui le fera pour vous.

B. Tester son plug-in

Étant donné que les plug-ins sont des scripts, vous pouvez directement lancer le script « à la main » sur votre système. Bien souvent vous trouverez une aide sur l’utilisation des scripts en les lançant avec l’option –help.

root@CYSA-NAEMON:~# /usr/lib/naemon/plugins/check_ssh --help
check_ssh v1.4.16 (nagios-plugins 1.4.16)
Copyright (c) 1999 Remi Paulmier <remi@sinfomic.fr>
Copyright (c) 2000-2007 Nagios Plugin Development Team
<nagiosplug-devel@lists.sourceforge.net>

Essaye de se connecter à un serveur SSH précisé à un port précis

Utilisation:
check_ssh [-46] [-t ] [-r ] [-p ]
...

De cette manière nous pourrons tester différentes façons d’utiliser notre plug-in :

root@CYSA-NAEMON:~# /usr/lib/naemon/plugins/check_ssh -p 22 127.0.0.1
SSH OK - OpenSSH_6.0p1 Debian-4+deb7u2 (protocol 2.0) | time=0,007751s;;;0,000000;10,000000

Attention : Pensez à vérifier que le compte de votre système de supervision a les droits d’exécution sur votre script. Le mieux est de tester son script directement avec le compte de supervision.

Vous pouvez voir sur la sortie de cette commande différentes informations.

  • En premier lieu le résultat du contrôle interprété par le plug-in – OK.
  • Ensuite vous avez la version SSH utilisée par l’hôte interrogé – OpenSSH_6.0p1 Debian-4+deb7u2 (protocol 2.0).
  • Enfin juste après vous avez le temps de réponse du protocole, 0,007751s avec un timeout de 10s par défaut.

Si la réponse avait dépassé les 10 secondes, nous aurions eu le retour suivant :

CRITICAL - Le socket n'a pas répondu dans les 10 secondes

Nous avons toujours en première partie le retour du plug-in puis la sortie du plug-in, qui nous indique seulement ici qu’il n’a pas reçu de retour dans le délai du timeout.

IV. Créer une commande

Nous venons de déterminer la manière dont nous voulons utiliser notre plug-in. Nous allons pouvoir créer un objet commande qui sera utilisée par le système pour effectuer les contrôles.

define command {
   command_name check_ssh
   command_line /usr/lib/naemon/plugins/check_ssh -p 22 $HOSTADDRESS$
}

Ici nous avons créé un objet dont le nom est check_ssh. Chaque fois que le système appellera chech_ssh il exécutera la commande en paramètre command_line en remplaçant $HOSTADDRESS$ par l’adresse IP de la machine concernée. On appelle ceci une macro. C’est vraiment très utile et je vous ferais un détail sur comment utiliser les macros.

A. Les seuils de criticité

Suivant le type de votre contrôle, vous pouvez définir des seuils de criticité. Je vous invite à prendre le temps de réfléchir à ceci. Il est important qu’un changement d’état reflète la réalité de la situation. Dans énormément de cas, vous trouverez des configurations qui remontent des alertes critiques qui ne sont pas traitées. Simplement parce que l’alerte en réalité ne l’ai pas. Ce genre de situation pollue fortement l’efficacité de votre système, vos vraies alertes sont noyées avec les fausses.

C’est votre plug-in qui vous permettra de configurer vos seuils. Pour les modifier, nous interviendrons au niveau de l’objet command car c’est lui qui détermine les paramètres à utiliser. Petit exemple avec un contrôle d’espace disque. Avec le paramètre -w nous pouvons déterminer le seuil qui déclenchera l’état warning. Avec -c le seuil de l’état critique.

root@CYSA-NAEMON:~# /usr/lib/naemon/plugins/check_disk -w 20000 -c 10000 –u MB -p /
DISK WARNING - free space: / 16926 MB (92% inode=95%);| /=1382MB;-712;4288;0;19288
root@CYSA-NAEMON:~# /usr/lib/naemon/plugins/check_disk -w 20% -c 10% -p /
DISK OK - free space: / 16925 MB (92% inode=95%);| /=1383MB;15430;17359;0;19288

Je peux constater en testant mon plug-in que celui-ci me propose de définir des seuils de façons différentes. Dans mon premier test le seuil est défini par une volumétrie en MB alors que dans le second en pourcentage de la volumétrie global. J’ai choisi l’unité MB avec le paramètre -u. Vous pouvez choisir les valeurs suivantes : octets, kb, MB, GB et TB. Par défaut c’est MB.

Dans ce cas-ci, mon volume est plutôt fixe et évolue peu. J’ai décidé de fixer mon état d’avertissement à 5GB d’espace libre et mon état critique à 1GB.

define command {
   command_name check_local_disk
   command_line /usr/lib/naemon/plugins/check_disk -w 5000 -c 1000 -p /
}

Admettons que j’avais voulu contrôler un espace sur un serveur de fichier, j’aurais certainement pris une marge plus importante, car les volumes évoluent fortement. À vous d’adapter vos contrôles suivant vos capacités de réaction lorsqu’il s’agit de contrôles à but préventif.

En tout cas c’est super d’avoir créé une commande me direz-vous, mais comment je l’utilise pour contrôler mon serveur ? Hé bien pour cela, nous avons besoin de créer des services.

V. Créer un service

Les services vont définir les différents contrôles sur nos hôtes. Ce sont des objets, qui s’appliquent sur un ou plusieurs hôtes et qui s’appuient sur un objet command pour réaliser le contrôle. Comme pour les hôtes, nous aurons plusieurs états possibles pour nos services :

  • OK : c’est OK…
  • WARNING : Attention/Avertissement.
  • CRITICAL : Là c’est rouge et critique, une intervention d’urgence est nécessaire.
  • UNKNOWN : état inconnu/indéterminé.

Si vous avez bien suivi, c’est le script (plug-in) qui détermine l’état du service. Voici quelques paramètres à utiliser pour créer un service :

  • host_name : ça sera le nom de notre hôte auquel sera attaché notre service. Concrètement c’est sur cette hôte que nous réaliserons le contrôle.
  • hostgroup_name : La même chose, mais sur un groupe d’hôte.
  • service_description : petite description du service.
  • display_name : Le nom affiché pour votre service.
  • check_command : L’objet commande utilisé pour réaliser le contrôle.
  • max_check_attempts : Nombre de fois que l’hôte sera vérifié pour valider son état.
  • check_interval : Temps en minute entre chaque contrôle de l’hôte.
  • retry_interval : Temps en minute entre chaque contrôle dans un état non OK.
  • check_period : Nom de l’objet timeperiod sur laquelle sera contrôlé l’hôte.
  • notification_interval : Intervalle en minutes entre deux notifications pour l’hôte.
  • notification_period : Nom de l’objet timeperiod de temps sur laquelle sera notifié un problème sur l’hôte.
    contacts : Nom de l’objet contact à notifier lors d’un problème.
  • contact_groups : pareil, mais avec groupe de contact.

define service {
   host_name SRV01
   service_description État SSH
   check_command check_ssh
   max_check_attempts 5
   check_interval 5
   retry_interval 3
   check_period 24x7
   notification_interval 30
   notification_period 24x7
   notification_options w,c,r
   contact_groups administrateurs
}

À ce stade vous avez configuré sur votre système un contrôle. Votre système se chargera ensuite de planifier les exécutions suivant les paramètres que vous avez configurés. Il sera surement nécessaire de configurer vos équipements/serveurs pour qu’ils répondent à vos contrôles. Ceci dépendra de la manière dont votre plug-in va les interroger.

Voici en bonus un petit schéma pour synthétiser les relations entre les objets à travers les paramètres que nous venons de voir :

supervision-controles

Relations entre les objets au travers différents paramètres

Voir la partie précédente de ce cours : Supervision créer des objets et des hôtes

Bloquer les individus qui scannent votre machine avec Portsentry

$
0
0

I. Présentation

Nos serveurs accessibles depuis internet sont de plus en plus vulnérables aux attaques, d’où ce tutoriel où je vais vous parler de Portsentry. Cet outil permet de détecter et de bloquer tout individu scannant les ports de votre machine.

II. Installation

L’installation se fait simplement via apt :

apt-get update
apt-get install portsentry

III. Configuration

Par défaut, Portsentry ne bloque rien et nous allons devoir le configurer afin de détecter et bloquer le scan de ports. Il va falloir modifier le fichier où sont notifiées les adresses IPs à ne pas bloquer afin de ne pas se bloquer soi-même. Pour cela il existe 2 fichiers : portsentry.ignore et portsentry.ignore.static. Toutes les IPs que vous allez ajouter dans portsentry.ignore.static seront ajoutées  dans portsentry.ignore après un redémarrage du service portsentry.

  •  Je décide de modifier le fichier /etc/portsentry/portsentry.ignore et de vérifier que l’adresse 127.0.0.1 soit bien définie :

# IP déjà notifié dans le fichier :

127.0.0.1/32
0.0.0.0

# autres @ip que vous souhaitez xxx.xxx.xxx.xxx

  •  Passons à la configuration de Portsentry :

Si vous choisissez les modes atcp et audp (“a” signifie avancé) dans /etc/defaults/portsentry, inutile de préciser les ports, Portsentry va vérifier les ports utilisés et automatiquement “lier” les ports disponibles. C’est l’option la plus efficace. Donc avec cette option, portsentry établit une liste des ports d’écoute, TCP et UDP, et bloque l’hôte se connectant sur ​​ces ports sauf s’il est présent dans le fichier portsentry.ignore configuré auparavant.

  •  Modification du fichier /etc/default/portsentry :

Remplacer
TCP_MODE="tcp"
UDP_MODE="udp"

Par
TCP_MODE="atcp"
UDP_MODE="audp"

  •  À présent nous allons nous attaquer au fichier de configuration principale : portsentry.conf

# vi /etc/portsentry/portsentry.conf

  • Mettez en place le blocage en modifiant la section “Ignore options”  de la façon suivante :

##################
# Ignore Options #
##################
...
# 0 = Do not block UDP/TCP scans.
# 1 = Block UDP/TCP scans.
# 2 = Run external command only (KILL_RUN_CMD)
 
BLOCK_UDP="1"
BLOCK_TCP="1"

  • Si comme moi vous utilisez Iptables, commentez toutes les lignes commençant par “KILL_ROUTE” sauf cette dernière qui permet de bloquer les IPs des machines pirates :

KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

  • Redémarrez le service Portsentry :

sudo service portsentry restart

  • Pour vérifier que Portsentry a bien démarré, taper la commande suivante :

tail -n 5 /var/log/syslog

Cette dernière devrait vous retourner ce message :

portsentry[30088]: adminalert: PortSentry is now active and listening.

 IV. Tests

  •  Sur une autre machine (Linux pour ma part) nous allons effectuer un scan des ports de la machine précédemment configurée avec nmap :

# nmap -v 192.168.x.x

Starting Nmap 5.00 ( http://nmap.org ) at 2015-01-05 16:08 EAT
NSE: Loaded 0 scripts for scanning.
Initiating ARP Ping Scan at 16:08
Scanning 192.168.x.x [1 port]
Completed ARP Ping Scan at 16:08, 0.06s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 16:08
Completed Parallel DNS resolution of 1 host. at 16:08, 6.50s elapsed
Initiating SYN Stealth Scan at 16:08
Scanning sidlol.zehome.org (192.168.x.x) [1000 ports]
Discovered open port 111/tcp on 192.168.x.x
Discovered open port 80/tcp on 192.168.x.x
Discovered open port 22/tcp on 192.168.x.x
Discovered open port 143/tcp on 192.168.x.x
...
Completed SYN Stealth Scan at 16:08, 0.12s elapsed (2002 total ports)
Host sidlol.zehome.org (10.9.8.2) is up (0.000047s latency).
Interesting ports on sidlol.zehome.org (192.168.x.x):
Not shown: 1988 closed ports
PORT STATE SERVICE
1/tcp open tcpmux
11/tcp open systat
15/tcp open netstat
22/tcp open ssh
79/tcp open finger
80/tcp open http
...
MAC Address: xx:xx:xx:xx:xx:xx (xxxxx)
 
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 6.95 seconds
 Raw packets sent: 2003 (88.130KB) | Rcvd: 2011 (80.594KB)

  • Si on regarde à présent sur le serveur hébergeant portsentry :

# grep attackalert /var/log/syslog

portsentry[30084]: attackalert: TCP SYN/Normal scan from host: 192.168.x.x/192.168.x.x to TCP port: 22
portsentry[30084]: attackalert: Host: 192.168.x.x/192.168.x.x is already blocked Ignoring
portsentry[18127]: attackalert: TCP SYN/Normal scan from host: 192.168.x.x/192.168.x.x to TCP port: 79
portsentry[18127]: attackalert: Host 192.168.x.x has been blocked via wrappers with string: "ALL: 192.168.x.x : DENY"
portsentry[18127]: attackalert: Host 192.168.x.x has been blocked via dropped route using command: "/sbin/iptables -I INPUT -s 192.168.x.x -j DROP"
portsentry[18127]: attackalert: External command run for host: 192.168.x.x using command: "/sbin/iptables -I INPUT -s 192.168.x.x -j DROP &amp;&amp; /sbin/iptables -I INPUT -s 1 


# cat /etc/hosts.deny :
ALL: 192.168.1.14 : DENY


# iptables -S
-À INPUT -s 192.168.1.14/32 -j DROP

# route 
192.168.1.14 - 255.255.255.255 !H 0 - 0 -

 V. Conclusion

À présent l’adresse IP de notre pirate a été détectée par Portsentry et bloquée par IPtables. Outil très sympa qui rajoute une couche de sécurité à vos serveurs. Dans la continuité de cet article, il serait intéressant de créer un script nous avertissant par e-mail qu’une intrusion a été détectée et bloquée.

Supervision : comprendre les notifications de A à Z

$
0
0

I. Présentation des notifications en supervision

Je vais vous expliquer ici comment fonctionne le processus de notification dans un système de supervision open source. Je me suis basé sur la configuration de Naemon, mais c’est parfaitement applicable sur d’autres systèmes comme Nagios, Inciga ou Shinken.

Je considère un bon système de supervision quand celui-ci donne des alertes pertinentes. C’est-à-dire déclenchés au bon moment, au bon endroit aux bonnes personnes. Une bonne supervision dépend uniquement de sa rigueur dans la configuration. Ici seront abordés 80% des paramètres permettant de configurer une notification pertinente. Les 20% restant sont la capacité à contrôler les bonnes choses et définir les bons seuils d’alerte (je dis ça comme ça, mais ce n’est pas loin de la vérité je pense 😉 ).

Alors vous êtes prêt ? Alors c’est parti !

Avant commencer à aborder le fonctionnement pur et dur des notifications, il y quelques notions importantes à comprendre.
Chaque hôte et service est défini par un état :

Services : OK, WARNING, CRITICAL, UNKNOWN
Hôtes : UP, DOWN, UNRECHABLE

Ces états peuvent être de deux types, SOFT ou HARD. Le statut SOFT indique que le contrôle vient de changer d’état. Le statut HARD lui confirme l’état du service.

Par exemple je viens de remonter un problème (état CRITICAL : c’est l’état que je constate ; statut SOFT : je ne suis pas sûr que cela soit réellement une erreur) alors, je refais mon contrôle. Mon nouveau contrôle est de nouveau une erreur (état CRITICAL : c’est l’état que je constate ; statut HARD : Je confirme l’état, je l’ai vérifié !)

Après dans la pratique c’est un peu plus compliqué, mais retenez ça c’est une très bonne base. Je rajouterais juste que pour chaque objet hôte ou service, nous pouvons définir le nombre de fois que le contrôle devra être vérifié avant de passer en statut HARD avec le paramètre max_check_attempts.
Dans un objet hôte ou service voici comment on définit ces paramètres

max_check_attempts 3

En mettant le paramètre max_check_attempts à 1, ceci aura pour effet de valider l’état constaté directement au changement d’état.

Maintenant, je peux vous dire que le processus de notification se déclenche lorsque j’ai un changement d’état « validé » (HARD). C’est-à-dire que si je change d’état, mais qu’il n’est pas confirmé, rien ne se passe.
J’attire votre attention sur les intervalles de contrôles. Pensez à calculer les délais minimum et maximum de déclenchement de notifications suivant vos intervalles. On définit en minutes l’intervalle entre deux contrôles avec le paramètre check_interval. Après la détection d’un état non OK, on peut aussi accélérer l’intervalle entre deux contrôles avec le paramètre retry_interval.

Mon délai minimum de notification sera toujours égal à (retry_interval x (max_check_attempts – 1) ) moins 1 parce que mon premier retour non OK compte. Pour avoir mon délai maximum de notification, on ajoute le check_interval au délai minimum. Exemple avec les paramètres suivant :

check_interval 5 # temps en minutes
retry_interval 2 # temps en minutes
max_check_attempts 3 # nombre de tentatives

Mon intervalle entre deux contrôles quand tout va bien est de 5 minutes. Lorsque je recevrai un contrôle non OK, il sera ré exécuté 2 fois avant de passer en statut HARD. On ne fera pas 3 tentatives parce que le premier retour non OK compte comme le 1er essai. Mes intervalles entre chaque contrôle seront alors réduits à 2 minutes. Autrement dit, il y aura au minimum 4 minutes entre le moment où je détecte l’incident et le moment où je le valide (délai minimum).

Admettons que j’exécute mon contrôle et que tout va bien. Pas de bol mon incident intervient juste après. Je ne m’en rendrais compte que lors du prochain contrôle, 5 minutes après. À ce moment-là, on est dans un état non OK mais statut SOFT. Je dois effectuer encore 2 contrôles avec 2 minutes d’intervalle pour passer mon état en statut HARD. Mon processus de notification sera donc déclenché environ 9 minutes après l’incident réel (délai maximum).

J’espère que j’ai réussi à être clair si c’est le cas vous me direz que c’est nul ! Recevoir une notification entre 4 et 9 minutes après un incident ça ne sert à rien ! Je vous répondrais que cela dépend de la situation, mais ne mettez pas tous vos contrôles avec un intervalle d’une minute. C’est inutile et vous risquez surtout de surcharger le système et les contrôles prendront du retard. C’est comme dans une gare, si vous mettez tous les trains à suivre, le temps que chacun s’arrête vous aurez un bouchon.

Ce qu’il faut savoir c’est qu’ici nous sommes sur des contrôles actifs, vous verrez qu’on peut mettre en place des contrôles qui remontent un état instantanément, mais ce n’est pas le sujet ici.

II. Contrôles avant déclenchement des notifications

Maintenant avant de déclencher une notification, le système va passer le contrôle dans plusieurs filtres pour s’assurer qu’il doit déclencher une notification. Nous allons aborder ces filtres comme des questions que pourrait se poser le système superviseur.

1. Les notifications sont-elles activées ?

Dans le fichier de configuration principal, ce paramètre affecte l’ensemble des hôtes et services. Il peut également être spécifié dans un objet hôte ou service qui aura pour effet de désactiver les notifications sur l’objet cible. Dans le fichier de configuration principal (naemon.cfg, nagios.cfg, shinken.cfg…)

enable_notification=[0/1]

Attention, dans un objet hôte ou service, la syntaxe est légèrement différente.

notifications_enabled [0/1]

  • 0 : les notifications sont désactivées
  • 1 : les notifications sont activées (par défaut)

Si oui on passe au filtre suivant. Celui-ci était plutôt simple.

2. Était-il prévu que l’hôte ou le service retourne un état non OK ?

Quand nous savons qu’un contrôle peut retourner un état non OK, parce que je sais que je vais changer un disque sur un serveur par exemple (c’est donc prévu). Je peux dire que sur cette période de temps, si le contrôle est non OK c’est normal. C’est ce qu’on appelle un scheduled downtime. Je ne détaillerais pas ici cette notion. C’est assez particulier, mais sachez que ça ne se définit pas dans les fichiers de configuration.

En tout cas si nous sommes dans une période scheduled downtime, pas de notification. Sinon on passe à la suite !

3. Le contrôle est-il en oscillation ?

L’oscillation (flapping) c’est quand un contrôle passe régulièrement d’un état OK à non OK. Il est alors considéré instable. Il est possible de surveiller ce genre de situation en activant le paramètre flap detection. À partir de ce moment, si le système considère que le contrôle est en oscillation il ne déclenchera pas de notification. Ça évite de se faire spammer quand le processeur du serveur est à la limite des seuils d’alerte. Comme pour le scheduled downtime je ne vais pas détailler ici l’algorithme qui déterminera si le service est en oscillation ou non. Retenez que c’est un calcul qui retourne un pourcentage sur les 21 derniers contrôles et que vous pouvez activer ou non cette détection avec ces paramètres :

Dans le fichier de configuration générale (active ou désactive pour tout le système)

enable_flap_detection=[0/1]

Directement dans un objet hôte ou service

flap_detection_enabled [0/1]

  • 0 : la détection est désactivée
  • 1 : la détection est activée (par défaut)

Si le contrôle n’est pas considéré comme instable, vous aurez deviné qu’on passe au prochain test.

4. Dois-je déclencher une notification pour cet état ?

Pour cela dans chaque hôte et service on aura défini pour quel état on souhaite être alerté. Je peux dire par exemple que quand mon contrôle redevient OK, je n’ai pas envie d’être alerté. On dira plutôt alors qu’on veut être notifié de tous les états sauf OK. Voici comment le paramétrer :
Pour un objet service :

notification_options [w,u,c,r,f,s]

  • w : pour l’état WARNING
  • u : pour l’état UNKNOWN
  • c : pour l’état CRITICAL
  • r : pour RECOVERY, retour à la normale, état OK.
  • f : pour FLAPPING, notifie le début et la fin d’un contrôle considéré instable.
  • s : pour SCHEDULED DOWNTIME, notifie le début et la fin d’une période de « maintenance »
  • n : NONE, aucune notification, reviens à désactiver les notifications

Pour un objet hôte :

notification_options [d,u,r,f,s]

  • d : pour l’état DOWN
  • u : pour l’état UNREACHABLE
  • r : pour RECOVERY, retour à la normale, état UP.
  • f : pour FLAPPING, notifie le début et la fin d’un contrôle considéré instable.
  • s : pour SCHEDULED DOWNTIME, notifie le début et la fin d’une période de « maintenance »
  • n : NONE, aucune notification, reviens à désactiver les notifications

Dans les deux cas, si rien n’est spécifié tous les types de notifications seront activés. Pour définir plusieurs types de notifications, séparez les arguments par une virgule.
Ça va ? Alors on passe au 5e filtre !

5. Est-ce que le changement d’état s’est fait dans une période de notification ?

Rien de compliqué, avec le paramètre notification_period on définit une période de temps sur laquelle nous voulons déclencher les notifications. Ce paramètre fait appel à un objet de type timeperiod. Ainsi on peut limiter l’exécution de notification à cette période de temps.
Dans un objet hôte ou service :

notification_period 24x7 # nom de mon objet période de temps

24×7 est un objet de type timeperiod configuré de base. Par son nom vous aurez deviné qu’il s’agit d’une période qui couvre tous les jours, 24h/24.

6. Est-ce que je renvoie une notification ?

Enfin, notre dernier filtre est un peu particulier, car il intervient sous conditions. Il faut qu’une notification ait déjà été envoyée pour un problème. Pour vous situer, j’ai vérifié (statut HARD) un état non OK sur un de mes contrôles. J’ai alors déclenché une notification. Je fais un nouveau contrôle, je suis toujours non OK. Que se passe-t-il ? Eh bien c’est le paramètre notification_interval qui va en décider. C’est lui qui donne l’intervalle (en minutes) entre chaque notification. Si au moment du contrôle cet intervalle est dépassé, je notifie de nouveau. Dans un objet hôte ou service :

notification_interval 30 # temps en minutes

La valeur par défaut de ce paramètre sera de 60 s’il n’est pas défini. La valeur par défaut peut également être modifiée dans le fichier de configuration principal.

III. Paramètres d’envois des notifications

Bon ça y est, nous sommes arrivés au moment de déclencher notre notification (enfin presque). Oui ce n’est pas vraiment terminé en réalité. Je sais que je dois déclencher une notification, mais à qui ? Comment ? C’est le paramètre contact ou contact_groups de chaque objet hôte ou service qui va nous le dire. Ce paramètre fait référence à un objet de type contact ou contactgroup. Dans un objet hôte ou service :

contacts michel, jean_pierre # nom de mon objet contact
contact_groups administrateurs # nom de mon objet groupe de contact

Vous pouvez en définir plusieurs en séparant par une virgule. Notez qu’il est « obligatoire » pour chaque objet hôte et service d’avoir au moins un contact (ou groupe) de défini. Vous aurez des erreurs warning au démarrage si ce n’est pas fait.

Vous verrez que ces objets contact sont bien plus que de simple contact (et personnellement je trouve que leurs noms sont mal choisis pour ces objets. (J’espère que j’arriverais à vous faire comprendre mon point de vue 😉 )

Donc j’ai défini dans mon objet hôte ou service, un ou plusieurs « contacts ». Je l’ai es identifié et maintenant je dois les notifier. Mais j’ai encore quelques filtres à passer ! (oui encore, mais courage c’est la fin après vous serez des as de la notif’ )

Ces filtres s’appliquent indépendamment pour chaque contact à notifier. Le premier nous l’avons déjà vu, ce sont les options de notifications. Nous pouvons sélectionner les états sur lesquelles le contact sera notifié. Ça marche exactement pareil que pour les objets hôte ou service, mais sur un contact. Dans un objet contact :

service_notification_options [w,u,c,r,f,s]
host_notification_options [d,u,r,f,s]

Vous aurez remarqué que la syntaxe est légèrement différente pour un objet contact. Le deuxième et dernier filtre (vous voyez ce n’était pas long) c’est la période de temps, nous l’avons déjà vu aussi c’est facile.
Dans un objet contact :

service_notification_period 24x7 # nom de mon objet période de temps
host_notification_period 24x7 # nom de mon objet période de temps

Là aussi vous aurez remarqué que la syntaxe est légèrement différente pour un objet contact.

On précise bien le paramètre pour les objets de type hôte ou services. Dans l’exemple j’ai mis 24h/24, mais en réalité je sais très bien que vous ne vous lèverez pas à 3h du matin pour redémarrer le serveur d’impression… (Mais le serveur de gestion des payes peut être que si ?)

Voilà maintenant je peux notifier mon contact ! Pour ça, j’utilise encore un paramètre ! La commande de notification ! Là j’appelle encore un objet, de type command cette fois ci.

host_notification_commands host-notify-by-email # nom de mon objet commande
service_notification_commands service-notify-by-email # nom de mon objet commande

Le système va tout bêtement exécuter la commande que vous avez dans votre objet commande. Du coup, sur votre machine si vous avez une commande qui permet d’envoyer un missile nucléaire. Eh bien vous pourrez envoyer un missile nucléaire lorsque vous débranchez votre accès internet ! Vous faite ce que vous voulez, vous exécutez une commande Linux, c’est no limit !

Je vous disais que l’interprétation de contact est mal choisie ici (détendez légèrement vos neurones, je vais vous expliquer). Pour moi un contact c’est une personne physique, avec un nom, une adresse, un numéro de téléphone, une adresse mail, un compte Twitter (ou pas). Bref c’est un mec avec des coordonnées pour le joindre. Coordonnées au pluriel parce que je choisis les coordonnées adaptées à la situation. On n’invite pas un copain à boire une bière par courrier hein 😉

Bien ici c’est pareil, moi M. SANTANA la journée je suis au bureau alors j’aimerais bien recevoir des notifications par mail parce que j’ai ma messagerie sous les yeux. Et j’ai un téléphone aussi au cas où il y a des gros problèmes quand je ne suis pas à mon bureau. Dans la technique si je veux faire ça, il va me falloir plusieurs contacts. Tout simplement parce que dans un objet contact je ne définis qu’un seul objet commande. Et nous sommes d’accord pour dire qu’en une seule commande je ne vais pas pouvoir choisir d’envoyer un SMS plutôt qu’un mail suivant la situation.

Le message que je voulais faire passer c’est qu’il va falloir être rigoureux et précis dans le nommage des contacts. Une petite astuce que je peux donner c’est d’utiliser les groupes de contacts. Je nomme mon groupe de contact par le nom de mon personnage (thierry_le_dsi par exemple) et dans ce groupe j’aurais les différents moyens de notifications avec plusieurs objets contact (mail_thierry, sms_thierry, …) et pour chaque contact j’aurais la commande associée à son moyen de notification.
Je vous fais un petit exemple concret pour visualiser tout ça 😉

define contactgroup {
  contactgroup_name thierry_le_DSI
  alias Thierry le directeur du système d’information
  members mail_thierry,sms_thierry
}

define contact {
  contact_name mail_thierry
  alias Contact mail de Thierry
  host_notifications_enabled 1
  service_notifications_enabled 1
  service_notification_period le_jour
  host_notification_period le_jour
  service_notification_options w,u,c,r
  host_notification_options d,u,r
  service_notification_commands service-notify-by-email
  host_notification_commands host-notify-by-email
}
define contact {
  contact_name sms_thierry
  alias Contact mail de Thierry
  host_notifications_enabled 1
  service_notifications_enabled 1
  service_notification_period le_soir
  host_notification_period le_soir
  service_notification_options w,u,c,r
  host_notification_options d,u,r
  service_notification_commands service-notify-by-sms
  host_notification_commands host-notify-by-sms
}

Ici mon contact mail_thierry ne peut être déclenché que sur la période de temps le_jour. Mais j’ai mon contact sms_thierry qui lui peut être déclenché sur la période de temps le_soir. Et donc pour chaque contact je fais appel à un objet qui exécute une commande différente. Du coup mon DSI recevra des notifications mail le jour et des notifications SMS le soir.

Et pour rappel, un groupe de contact peut en contenir un autre. Alors, n’hésitez pas à en abuser et par exemple créer un groupe directeur ou vous mettrez vos groupes thierry_le_dsi et pascal_le_pdg…

Voilà j’en ai terminé avec ce chapitre, vous avez de quoi être des AS de la notification désormais ! C’est assez général, mais le but ici était de comprendre les différents paramètres. À vous de les combiner de la bonne manière pour faire votre supervision.

Afficher la hiérarchie des protocoles dans Wireshark

$
0
0

I. Présentation

Lorsque l’on enregistre ou traite une capture de trame de taille conséquente dans Wireshark, il peut être intéressant de savoir comment sont répartis les protocoles en terme de poids ou de nombre de paquets dans cet enregistrement. Cela est faisable assez facilement dans Wireshark via une fonction prévue à cet effet.

II. Afficher la hiérarchie des protocoles

La hiérarchie des protocoles va nous permettre de savoir, pour une capture réseau donnée, la proportion des protocoles qui s’y trouvent. Dans Wireshark, cette proportion va être affichée sous forme de pourcentage. Depuis la capture réseau effectuée, il faut se rendre dans “Statistics” puis dans “Protocol Hierarchy” :

hierarchie-wireshark

Accès à la hiérarchie des protocoles

Une nouvelle fenêtre va alors apparaître, celle-ci se composera de plusieurs dizaines voir centaines de lignes en fonction de la diversité des protocoles présents dans votre capture réseau.

hierarchie-wireshark

Affichage de la hiérarchie des protocoles Wireshark

Dans cette capture que j’ai choisi en exemple, on peut voir que 28% des paquets transportaient un protocole chiffré via SSL (Secure Socket Layer) et 2.29% transportaient le protocole HTTP. On trouvera également une répartition par protocole de transport (95.16% de TCP et 4.74% d’UDP dans l’exemple ci-dessus), on pourra même descendre dans le modèle TCP/IP pour voir le pourcentage de trames en IPv4 IPv6, etc.

À droite de ces proportions, nous pourrons également avoir les données que ces pourcentages représentent en octets (Bytes), nombre de paquets, etc. Cela permet d’avoir des valeurs plus parlantes et précises.

III. Trier en fonction des protocoles

À partir de ces données et de cette fenêtre de hiérarchie, nous allons pouvoir effectuer différentes actions qui vont aller dans le sens du filtrage. Si je remarque par exemple que ma capture contient un nombre anormal de protocoles DNS et que je souhaite en savoir plus, on peut facilement faire un clic droit sur la ligne “Domain Name Service” puis appliquer un filtre à partir de cette ligne :

hierarchie-wireshark

Application d’un filtre Wireshark à partir de la hiérarchie des protocoles

On va alors voir, après avoir cliqué sur “Selected” dans la partie “Apply as Filter” que le champ “Filter” de Wireshark s’est rempli automatiquement avec un filtre qui va dans le sens de l’affichage du protocole DNS :

hierarchie-wireshark

Création d’un filtre à partir de la hiérarchie des protocoles

Cela permet d’éviter d’avoir à rédiger nous même les filtres, ce qui peut être complexe lorsque l’on ne travaille pas souvent sur Wireshark ou que les filtres sont plusieurs conditions.

Une autre possibilité que nous allons pouvoir faire est la colorisation du protocole sélectionné dans la capture réseau pour le mettre en exergue. On va pour cela faire un clic droit sur le protocole que nous souhaitons (dans mon cas, toujours DNS), puis nous sélectionnons “Colorize Procedure” puis “Colorize Protocole” :

hierarchie-wireshark-203641

Colorisation du protocole sélectionné

Ici, nous pourrons choisir, en fonction de notre choix, les couleurs à affecter. Nous pourrons au passage observer le filtre qui s’est encore une fois rempli automatiquement et que nous pouvons modifier au besoin :

hierarchie-wireshark-203642

Colorisation du protocole sélectionné

Ici par exemple, je décide de mettre les paquets relatifs au protocole DNS en UDP avec un font vert. Une fois que j’aurais validé ce paramétrage, je pourrais retourner dans ma capture réseau pour observer ma modification :

owncloud-chiffrement-205737

Vu du protocole colorisé Wireshark

Une petite note sur la différence entre “Apply as Filter” et “Prepare a Filter” . Le premier choix va directement appliquer le filtre sur le protocole que nous sélectionnons alors que le second va permettre de construire des filtrages plus complexes avec des “and” et des “or” :

hierarchie-wireshark-203617

Par exemple pour obtenir le filtre suivant, j’ai d’abord fait un “Prepare a Filter” puis “Selected” sur le protocole SSL, puis j’ai fait un “Apply a Filter” sur le protocole HTTP.hierarchie-wireshark-203631Dans un premier temps, ne vous souciez pas trop de cette différence, les deux options sont très similaires.

 

 

Bannir les IP avec Fail2ban, comment ça marche chez Cloudflare

$
0
0

I. Présentation

Pour ceux qui se servent de Cloudflare comme proxy, voici comment on peut configurer Fail2ban pour bannir automatiquement les IP attaquantes de son serveur.

– Créer un fichier d’action spécifique pour Cloudflare
– Régler ses “jails” pour envoyer les bans à Cloudflare

Le problème quand on a un site Internet qui propose des services, c’est de devoir souffrir des sollicitations de ses confrères, en plus d’un assez grand nombre d’attaques sur un petit blog WordPress en apparence inactif. Cela ne correspond évidemment pas à la réalité, le nombre de personnes qui ne demandent qu’à obtenir plus de commentaires sur leur blog ou amorcer la réaction d’autant d’internautes sur leur propre site est évidemment proche de 100%. Mais cela ne me laisse guère de temps pour enrichir le mien…

II. Créer un fichier d’action spécifique pour Cloudflare :

Fail2ban me permet désormais de monitorer en grande partie des accès, à distance sur le protocole HTTP, ce qui se révèle essentiel lorsqu’on a une activité sur le Web. De base, les “jails” en rapport avec le serveur Apache sont désactivées, ce qui ne me gêne pas personnellement, puisque j’utilise NginX. De même, les requêtes sur mon blog passent par CloudFlare, et ce n’est pas prévu dans le programme… La première étape passe donc par la mise en œuvre d’une action spécifique pour avertir Cloudflare d’une IP à bannir, et de l’activer dans une nouvelle “jail”. J’ai trouvé sur Internet un fichier d’action qui va bien et je l’ai recopié dans action.d :

# Author: Mike Rushton
# Referenced from from http://www.normyee.net/blog/2012/02/02/adding-cloudflare-support-to-fail2ban by NORM YEE
# To get your Cloudflare API key: https://www.cloudflare.com/my-account

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl https://www.cloudflare.com/api_json.html -d 'a=ban' -d 'tkn=< cftoken >' -d 'email=< cfuser >' -d 'key=< ip >'
actionunban = curl https://www.cloudflare.com/api_json.html -d 'a=nul' -d 'tkn=< cftoken >' -d 'email=< cfuser >' -d 'key=< ip >'

[Init]
# Default Cloudflare API token
cftoken = VOTRE CLÉ API CLOUDFLARE

# Default Cloudflare username
cfuser = L'ADRESSE EMAIL DE VOTRE COMPTE CLOUDFLARE

Pour voir (ou revoir) comment marche le logiciel, l’installer correctement et le configurer, n’hésitez pas à consulter, voire même ouvrir les Premiers pas avec Fail2ban dans une nouvelle fenêtre, car c’est un prérequis… Les actions supplémentaires comme celle-ci doivent ensuite être formulées au programme de Fail2ban dans jail.local (ou jail.conf si vous avez écrit vos règles par-dessus les “jails” d’origine). Comme vous l’avez remarqué, les requêtes envoyées à Cloudflare le sont par le biais de cURL, et il faut que ce programme soit installé au préalable sur votre serveur… À chaque fois qu’une IP est contrôlée positive dans le filtre, Fail2ban envoie avec cURL une requête qui prend 4 paramètres :

1. L’action à entreprendre : ban, wl (whitelist), nul (unban) ;

2. L’IP à traiter ;

3. Votre clé API Cloudflare ;

4. L’email dont vous vous servez pour vous connecter à votre compte.

III. Régler ses “jails” pour envoyer les bans à Cloudflare :

Maintenant, on va créer des “jails” spécifiques à partir du format de celles qui nous sont présentées par défaut dans jail.conf :

[apache-noscript]

enabled = false
port = http,https
filter = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6

[fail2ban-filter]
enabled = true
port = http
filter = fail2ban-filter
action = cloudflare-action[name=fail2ban-filter, port="http", protocol="tcp"]
sendmail-whois-lines[name=fail2ban-filter, dest="contact@example.com", logpath="/var/log/apache*/example.error.log"]
logpath = /var/log/apache*/example.error.log
maxretry = 3
bantime = 2419200

On voit en comparant les règles 1 et 2 que j’ai nommées fail2ban-filter que l’appel à Cloudflare nécessite une instruction spécifique pour l’action, car elle est différente de celle qui est proposée par défaut, au début du fichier. Dans l’exemple que je donne, j’ai en plus superposé plusieurs actions, qui sont exécutées les unes à la suite des autres. Dans mon cas :

1. Un appel à l’action chez Cloudflare

2. Un envoi de courrier électronique.

Les différentes actions sont libellées séparément avec un retour chariot et une tabulation (pour faire joli). L’action à faire passer chez Cloudflare est caractérisée par le nom du fichier d’action spécifique à Cloudflare, qui va référencer le nom du filtre, et éventuellement d’autres informations, telles que le port et le protocole. Rien de très différent en somme, par rapport à d’autres actions à effectuer, mais de façon différente de celles qui le sont par défaut. Ainsi, l’envoi de courrier électronique référence aussi le filtre, le destinataire et le journal (d’erreur ou d’accès) que considère le filtre en question. Chez Cloudflare, les bans sont interceptés grâce aux requêtes en cURL de votre serveur, de la façon suivante :

input: curl https://www.cloudflare.com/api_json.html \
-d 'a=wl' \
-d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' \
-d 'email=sample@example.com' \
-d 'key=0.0.0.0' \

output: {
"response": {
"result": {
"ip": "[IP]",
"action": "WL"
}
},
"result": "success",
"msg": null
}

On termine en rechargeant la configuration de Fail2ban :

service fail2ban reload

Pour conclure avec une image et abréger le discours, voici celle que vous aurez la satisfaction d’observer sur le panneau “Thread Control” de votre compte Cloudflare, avec la liste des IP attaquantes qui ont été bannies, de manière complètement automatique, et sans plus d’intervention de la part de l’administrateur du serveur…

cloudflare-banned

Aperçu des IP bannies sur l’interface Cloudflare

Quand le délai du ban arrive à terme, un autre appel sera effectué par Fail2ban à Cloudflare, pour lui demander de déréférencer l’IP concernée par le ban. Fail2ban est un logiciel réellement intéressant quand on pousse la configuration, et on peut même pousser un peu plus loin encore…

À vous d’essayer maintenant !

Simuler des problèmes réseau avec Clumsy

$
0
0

I. Présentation de Clumsy

Les pannes réseau sont parfois difficiles à prévoir et leurs effets également. Comment savoir comment réagiront vos systèmes, vos applications, vos serveurs en cas de problème ou de dysfonctionnement du réseau ? La pire des choses est bien entendu d’attendre que cela arrive pour le savoir, c’est pourquoi il est utile de connaître Clumsy, un outil qui tourne sous Windows et qui permet de simuler des dysfonctionnements réseau.

II. Télécharger et lancer Clumsy

La première chose à faire est bien entendu de récupérer cet outil sur son site officiel : http://jagt.github.io/clumsy/download.html

Selon votre système, vous pourrez récupérer Clumsy pour Windows 32 ou 64 bits. Une fois cela fait, il suffira de le lancer en cliquant sur l’exécutable. Nous aurons alors cette fenêtre :

clumsy-reseau

Interface Clumsy

III. Utilisation de Clumsy

Comme vous pourrez le voir, Clumsy propose de nombreuses possibilités. On pourra simuler :

  • du lag qui est opéré en retardant l’arrivée des paquets
  • des pertes de paquet au hasard (Drop)
  • un engorgement du réseau (Throttle) qui a pour effet de bloquer le trafic pendant une courte période pour ensuite tout envoyer d’un coup
  • une duplication de certains paquets
  • un out of order, qui a un changement dans l’ordre d’arrivée des paquets
  • un Tamper, qui consiste en l’altération du contenu de certains paquets.

Chacun de ces paramètres peut recevoir un “dosage” plus ou moins accentué une fois qu’il est sélectionné. Également, on pourra utiliser plusieurs de ces dysfonctionnements en même temps :

clumsy03

Pour lancer un dysfonctionnement du réseau, il suffit de cocher les dysfonctionnements que nous souhaitons voir actifs, arranger les valeurs chiffrées comme on le souhaite, puis cliquer sur “Start”. Voici en exemple un simple ping que j’ai effectué pendant que je simulais la perte de 50% de mes paquets avec Clumsy :

clumsy-windows

Simulation de perte de paquets avec Clumsy

Une chose dont je ne vous ai pas encore parlé, les Presets. Ceux-ci consistent en des filtres qui permettent, par exemple, de cibler une interface, un sens de flux (entrée, sortie) ou un protocole (comme IPv4 ou IPv6). Certains sont présents par défaut, vous pourrez les trouver dans le dossier où se situe l’exécutable, qui contient également un fichier “config.txt” :

# loopback packets can only be filtered using 'outbound'.
localhost ipv4 all: outbound and ip.DstAddr >= 127.0.0.1 and ip.DstAddr <= 127.255.255.255
localhost ipv4 tcp: tcp and outbound and ip.DstAddr >= 127.0.0.1 and ip.DstAddr <= 127.255.255.255
localhost ipv4 udp: udp and outbound and ip.DstAddr >= 127.0.0.1 and ip.DstAddr <= 127.255.255.255

# more general
all sending packets: outbound
all receiving packets: inbound

Tout cela est possible par l’utilisation de la librairie “WinDivert”, un système similaire à NetFilter sous Linux. Voici la documentation du projet : WinDivert

Vous pourrez trouver, au chapitre 7, des indications relatives aux filtres vus plus haut.


Supervision : Comprendre et utiliser les templates

$
0
0

I. Présentation

Après avoir étudié les notifications en supervision, nous allons voir comment utiliser des templates dans un système de supervision open source. Je me suis basé sur la configuration de Naemon, mais c’est parfaitement applicable sur d’autres systèmes comme Nagios, Inciga1 ou Shinken.

Les templates sont indispensables pour optimiser la configuration d’un système de supervision. Un template est enfaite un modèle (ou modèle/patron, prenez le terme qui vous convient) sur lequel vous vous baserez pour créer vos objets.

II. Comment ça marche ?

Le template n’a de sens que si vos objets sont créés avec des paramètres identiques. Le principe est que votre template contient les paramètres qui seront communs à vos objets. Ensuite, vous ferez référence à ces templates dans vos objets finaux pour qu’ils héritent des paramètres. Vous pourrez utiliser le système de template sur tout type d’objet.

Pour créer un template, rien de plus simple. Vous créez un objet de manière classique qui comporte les paramètres communs que vous voulez transmettre. Vous aurez ensuite besoin de jouer uniquement avec trois paramètres : name, register et use.

Sans surprise, le paramètre name servira à donner un nom à votre template. Le paramètre use lui permet d’utiliser un template en spécifiant son nom. Le paramètre register prend deux valeurs, 0 et 1. Votre système se servira de ce paramètre pour savoir s’il doit enregistrer l’objet comme objet ou non

  •  La valeur 1 indiquera qu’il faut créer l’objet, il apparait dans mon système de supervision (valeur par défaut).
  • La valeur 0 indiquera qu’il ne faut pas créer l’objet, il n’apparaitra pas dans mon système de supervision.

Dans les deux cas, vous pourrez utiliser votre objet comme modèle.

Qu’est-ce que ça change alors ?

Ça change que nous pouvons créer des objets “incomplets” que nous utiliserons comme modèle de base pour créer d’autre objet.

Je vous explique ça tout de suite, voici un exemple :

define host {
  name modele_host
  check_period 24x7
  contacts michel, pascal, beatrice
  contact_groups administrateurs
  register 0
}

Ici j’ai créé un template pour mes hôtes, son nom est défini par le paramètre name. Il s’appelle donc modele_host. Maintenant j’utilise mon template pour créer deux serveurs :

define host {
  host_name SRV1
  address 192.168.1.101
  use modele_host
}
define host {
  host_name SRV2
  address 192.168.1.102
  use modele_host
}

J’ai créé deux serveurs qui héritent des paramètres du template modele_host en utilisant le paramètre use. Voici à quoi ressemble mon objet SRV1 après héritage des paramètres :

host_name SRV1
address 192.168.1.101
check_period 24x7
contacts michel, pascal, beatrice
contact_groups administrateurs

Le paramètre register ne s’hérite pas, l’objet SRV1 est donc créé, car il sera défini à 1. J’aurais pu utiliser une autre stratégie en “dupliquant” mes objets. Exemple avec SRV1, je le crée puis je l’utilise pour créer SRV2 :

define host {
  host_name SRV1
  address 192.168.1.101
  check_period 24x7
  contacts michel, pascal, beatrice
  contact_groups administrateurs
  name modele_srv register 1 #valeur par défaut, pas obligé de le spécifier 
}

Je viens de créer SRV1, il est enregistré dans mon système comme objet (register 1, vous vous souvenez ?). Je lui ai donné un nom de modèle avec le paramètre name. Maintenant je créer SRV2 à partir de mon objet SRV1 :

define host {
  host_name SRV2
  address 192.168.1.102
  use modele_srv
}

Dans l’héritage nous avons un conflit avec deux paramètres, address et host_name. Hé oui, nous les avons définis une première fois dans l’objet SRV1. Alors comment ça se passe dans ce cas ? Si un paramètre existe déjà dans l’objet qui hérite, l’héritage du paramètre sera bloqué. Notre hôte SRV2 aura donc les paramètres suivants après héritage :

host_name SRV2
address 192.168.1.102
check_period 24x7
contacts michel, pascal, beatrice
contact_groups administrateurs

III. Les cascades

Vous pouvez aussi multiplier et mettre en cascade vos héritages. Suivez donc l’exemple à suivre, toujours pour créer notre hôte SRV1 :

define host {
  contacts michel, pascal, beatrice
  check_period holidays
  name heritage1
  register 0
}
define host {
  check_period 24x7
  use heritage1
  name heritage2
  register 0
}
define host {
  host_name SRV1
  address 192.168.1.101
  use heritage2
}

Alors que s’est-il passé ? Prenons l’objet final, celui qui sera créé avec le nom SRV1. Il hérite des paramètres du template heritage2. Heritage2 contient un paramètre et hérite des paramètres du template heritage1. Et j’aurais pu encore continuer longtemps, ça devrait être suffisant pour comprendre le principe j’espère. Quelque part on peut dire que nous faisons de l’inception d’objets :p

Mais je viens de remarquer ça, dans les deux templates on a le paramètre check_period avec deux valeurs différentes. Quelle valeur aura-t-il pour l’objet SRV1 ? C’est vrai, dans ce cas on applique le principe de l’héritage classique, c’est-à-dire que le template heritage2 va couper l’héritage du paramètre check_period. Il aura donc la valeur 24×7 pour notre hôte SRV1.

IV. Multiples sources

C’est sympa l’inception d’objet en tout cas, mais on ne s’est pas un peu compliqué la vie ? Maintenant que vous le dites, on pouvait faire plus simple en héritant les deux templates directement sur l’objet final, comme ceci :

define host {
  host_name SRV1
  address 192.168.1.101
  use heritage2, heritage1
}

Pas mal, et dans ce cas-ci nous n’avons pas d’héritage direct, il devient quoi mon paramètre check_period ? Bonne question. Ici vu que le paramètre est en conflit au même niveau entre le template heritage1 et heritage2, c’est le premier template du paramètre use qui a la priorité. Dans notre exemple l’hôte SRV1 va récupérer le paramètre check_period du template heritage2 avec la valeur holidays. Allé je sens qu’un petit schéma ne fera pas de mal :)

schema-supervision-01

Alors de quelle couleur sera chaque cercle ? Sachant que le gris indique que le cercle n’a pas de paramètre couleur définie

  • Commençons par le début avec le cercle color1. Color1 n’a aucune couleur de définie. Il aurait pris la couleur par défaut s’il y en avait un
  • Color2 et 3 sont respectivement de couleur bleu et vert.
  • Pour le cercle color4, nous avons un héritage par color1 et 2 avec une priorité sur color1. Vu que la couleur n’est pas définie sur color1 ça sera le bleu de color2 qui sera hérité.
  • Color5 est hérité de color3, mais vu qu’il a déjà sa couleur jaune il bloc l’héritage du vert de color3.
  • Color6 prend l’hérite de color4 et 5 avec une priorité sur color4. Color4 est de couleur bleue par héritage donc il aurait pu hériter la couleur bleue à color6 si il n’avait pas déjà la couleur rouge. Color6 bloque donc l’héritage de 4 et 5 et reste rouge.
  • Color7 ne bloque pas l’héritage de couleur étant donné qu’il n’en a pas de défini, il gagne donc la couleur rouge de color6.
  • Et enfin color8 est et reste violet en bloquant l’héritage.

Les templates sont indispensables pour créer ses objets de manière efficace. Étant très flexible, à vous de trouver l’organisation qui vous convient. L’avantage du template c’est aussi que si vous avez une modification d’envergure à faire sur vos objets, en modifiant vos templates vous faites votre modification d’une seule manipulation. N’hésitez pas à nous faire part de vos interrogations 😉

Installation de Forefront TMG 2010

$
0
0

I. Présentation

Forefront Threat Management Gateway (TMG) est une solution de passerelle web sécurisée. Pour faire simple, c’est une solution logicielle qui permet de configurer tout un ensemble d’éléments liés à la sécurité : firewall (pare-feu), VPN (réseau privé virtuel), filtrage URL (accès ou refus à certains types de site), inspection HTTPS (contrôle des sessions établies à l’aide du protocole encrypté HTTPS) et bien d’autres fonctionnalités que vous pouvez retrouver sur le site de Microsoft : Les détails de TMG

Nota : Forefront TMG 2010 n’est plus commercialisé mais la solution reste maintenue jusqu’en 2020.

Ayant eu l’occasion de le déployer dans le cadre d’une maquette fonctionnelle, je vous propose tout d’abord de l’installer (au choix, sur une machine physique ou virtuelle ; pour mon cas, c’était une machine physique avec deux cartes réseaux, le tout fonctionnant sous Windows Server 2008 R2). La configuration des fonctionnalités de base fera l’objet d’un autre article.

II. Pré-requis

Pour mon cas, j’ai pu disposer d’un CD (MSDN) avec le fichier ISO. Mais vous pouvez télécharger le logiciel à exécuter sur :

Télécharger Forefront TMG

Forefront TMG – Service Pack 1

Voici les pré-requis :

  • Une machine (virtuelle ou physique) sous Windows Server 2008 R2, configurée avec deux cartes réseaux
  • Les fonctionnalités .NET Framework
  • Le logiciel Forefront TMG 2010
  • Le service pack 1

Passons maintenant à l’installation.

III. Installation

Double-clic sur le fichier ISO (ou « TMG_FRA_Management_x86.exe » s’il s’agit de la version téléchargée sur le site de Microsoft) et lancer l’installation.

installer-forefront-tmg-2010-1

A. Exécuter l’outil de préparation

L’installation nécessite au préalable une préparation.

Cliquer sur « Exécuter l’outil de préparation »

installer-forefront-tmg-2010-2

Cliquer sur « Suivant »
Cocher la case « J’accepte les termes des contrats de licence » et « Suivant »

installer-forefront-tmg-2010-3

Choisir « Services et gestion de Forfront TMG » et cliquer sur « Suivant »

installer-forefront-tmg-2010-4

Une fois que la préparation est terminée, vous pouvez commencer l’installation de Forfront TMG.
Cliquer sur « Lancer l’installation de Forfront TMG » et « Terminer »

installer-forefront-tmg-2010-5

B. Exécuter l’assistant d’installation

Cliquer sur « Exécuter l’Assistant d’installation »

installer-forefront-tmg-2010-6

Cliquer sur « Suivant »

Cocher la case « J’accepte les termes des contrats de licence » et « Suivant »

installer-forefront-tmg-2010-7

Étant donné que j’ai utilisé un CD MSDN, je n’ai pas eu à saisir la clé de la licence. Sur la version à télécharger sur le site de Microsoft, c’est une version d’évaluation mais la clé est déjà insérée.

Cliquer sur « Suivant »

installer-forefront-tmg-2010-8

Choisir « Services et gestion de Forfront TMG » et cliquer sur « Suivant »

installer-forefront-tmg-2010-9

Laisser le chemin d’installation par défaut et cliquer sur « Suivant »

installer-forefront-tmg-2010-10

Cliquer sur « Ajouter… », et ensuite sur « Ajouter une carte… ». Sélectionnez la carte réseau « LAN » et validez avec « OK ».

installer-forefront-tmg-2010-11

Ici, la plage d’adresse IP est un exemple. Pour mon cas, cette plage correspondait à l’agence de Paris dans le cadre d’une infrastructure multi-sites (Bordeaux qui est le siège, Paris, Rennes et Langueux).

installer-forefront-tmg-2010-12

– Cliquer sur « Suivant » à l’apparition de la fenêtre « Avertissement relatif aux services »

– Cliquer sur « Suivant » à l’apparition de la fenêtre « Prêt à installer le programme »

A la fin de l’installation, ne pas cocher « Lancer la Gestion Forefront… » car il faut d’abord installer le service pack 1. Terminer en cliquant sur « Suivant ».

installer-forefront-tmg-2010-13

C. Installer le service pack 1

Double clic sur « TMG-KB91324-amd64-FRA.msp » et cliquer sur « Suivant »

installer-forefront-tmg-2010-14

Cocher la case « J’accepte les termes des contrats de licence » et « Suivant »

installer-forefront-tmg-2010-15

Choisir « Se connecter en utilisant les informations d’identification de l’utilisateur actuel » et cliquer sur « Suivant »

installer-forefront-tmg-2010-16

Une fenêtre « Prêt à installer le programme » apparaît, cliquer sur « Installer » et sur « Terminer » pour finir l’installation.

installer-forefront-tmg-2010-17

L’installation de Forefront TMG 2010 est désormais terminée, un tutoriel sur la configuration sera publié très prochainement.

Forefront TMG 2010 – Mise en place du pare-feu

$
0
0

I. Présentation

Ce tutoriel fait suite au premier du même nom, à quelque chose près : Forefront TMG 2010 : Installation, où se trouve la présentation et la liste des pré-requis. Ici, nous allons voir comment effectuer une configuration du pare-feu.

II. Configuration depuis Windows Server 2008 R2

Cliquer sur le menu « Démarrer », sur « Microsoft Forefront TMG » et « Gestion Forefront TMG »

forefront-pare-feu-1

A. Configurer les paramètres du réseau

Cliquer sur « Configurer les paramètres réseau »

forefront-pare-feu-2

Cliquer sur « Suivant ». Sélectionner « Pare-feu de périmètre » et « Suivant »

forefront-pare-feu-3

Sélectionner la carte « LAN » et « Suivant »
Pour rappel, nous configurons ici le pare-feu sur l’agence de Paris (cf. le tutoriel sur l’installation).

forefront-pare-feu-4

Sélectionner la carte « WAN » et « Suivant ». Attention, sur l’image qui suit, il s’agit de la carte WAN de TMGPARIS

forefront-pare-feu-5

Cliquer sur « Terminer » pour finir la configuration du réseau

B. Configurer les paramètres du système

Cliquer sur « Configurer les paramètres système »

forefront-pare-feu-6

Cliquer sur « Suivant » et ensuite laisser par défaut « Membre de Groupe de travail » et cliquer sur « Suivant »

forefront-pare-feu-7

« Terminer » pour finir l’installation du système

C. Les options de déploiement

Cliquer sur « Définir les options de déploiement »

forefront-pare-feu-8

Cliquer sur « Suivant »

Pour mon cas (préparation d’une maquette fonctionnelle), je n’ai pas « utiliser le service Microsoft Update ». En production, « l’Update » est indispensable.

Cliquer sur « Suivant »

forefront-pare-feu-11

Cliquer sur « Suivant », puis choisissez « Non, je ne souhaite pas participer » et cliquer sur « Suivant »

forefront-pare-feu-12

Choisir « Aucune. Aucune information n’est envoyée à Microsoft » et cliquer sur « Suivant »

forefront-pare-feu-13

Cliquer sur « Terminer » pour finir l’assistant déploiement et cliquer sur « Fermer »

forefront-pare-feu-14

Le pare-feu est installé. Vous pouvez maintenant définir une stratégie d’accès web à votre guise. Bonne découverte !

A la découverte de Icinga 2

$
0
0

I. Présentation

Lancé le 15 mai 2009, Icinga fait partie des projets de Supervision Open Source dérivée du coeur du célèbre outil de supervision Nagios. Il est à l’époque le premier fork dans ce domaine, née du mécontentement des développeurs et contributeurs de Nagios qui ne voient plus évoluer le projet.

L’équipe recomposée fait évoluer le fork pendant 5 ans avant de sortir une nouvelle version baptisée Icinga 2 en juin 2014. Construit à partir de zéro, Icinga 2 est une réécriture complète de l’outil de supervision basé sur le langage C++ qu’on ne pourra alors plus qualifier de fork. En effet, plutôt que de continuer de développer à partir du Nagios Core, comme c’est le cas des versions 1.x, l’équipe de développement a décidé de repartir à zéro afin de repartir sur de nouvelles bases et notamment pouvoir construire une architecture modulaire comme par exemple avec Shinken.

II. Fonctionnalités et performances

Icinga 2 gère les tâches classiques de ce que nous pouvons attendre d’un outil de supervision : exécution des contrôles, envoi de notifications d’alerte, enregistrement des événements… De ce côté-là, le système est axé sur la performance avec une conception multithread. L’équipe annonce avoir fait tourner sur une machine 1 million de contrôles actifs pour 60 000 hôtes supervisés, sans problèmes. Pour comparaison avec la version 1, il faut 100 fois plus de contrôles à lcinga 2 pour arriver au même niveau de latence.

A. Modularité

La conception modulaire permet d’éclater les rôles sur différentes machines afin de répartir les charges. Quand on voit les performances annoncées, je ne suis pas certain que ce soit la fonctionnalité la plus utilisée 😉

decouverte-icinga-2-01

Illustration du principe de modularité. Source : Icinga.org

B. Distribution

Dans les fonctionnalités les plus alléchantes à mon gout, je vous propose la surveillance distribuée. En mode distribué, vous pouvez créer plusieurs instances de serveurs satellites qui effectueront leurs surveillances sur une zone et remonter les donnés à la zone centrale. Vous pouvez également distribuer votre supervision tout en équipant vos satellites de certains rôles, grâce à la modélisation.

C. Clusterisation

Suivant les cas, la clusterisation de votre infrastructure peut être intéressante pour assurer un service haute disponibilité simplement. La encore, icinga 2 met en avant sa flexibilité en donnant la possibilité de mixer clusterisation, modélisation et distribution !

decouverte-icinga-2-02

Schéma architecture distribuée clustérisée. Source : icinga.org

D. Historisation

Au niveau base de données, Icinga prend en charge Oracle et PostgreSQL en plus de MySQL pour l’historisation des données.

E. Configuration

Icinga 2 se démarque ici de ses confrères les plus connus en proposant un nouveau format de configuration. Alors oui, on est toujours sur des fichiers de conf avec des objets etc. Mais le corps des fichiers à nettement changé. On trouve comme un langage de programmation mixé de la ” méthode nagios ” avec du SQL.

Pour les développeurs, cette nouvelle méthode rend la configuration plus logique. Il suffit de créer des templates, puis de définir des comportements conditionnels. Pour donner un exemple voici à quoi ressemble un service dans la configuration Icinga 2 :

apply service "ssh" {
   import "generic-service"
   check_command = "ssh"
   assign where host.address && host.vars.os == "Linux"
   ignore where host.vars.test == true
}

N’ayant pas testé complètement ce système, je ne ferais pas de commentaires sur cette méthode. Une chose est sûre, avec la ” méthode nagios “, il faut être très organisé pour garder compréhensible sa configuration dans le temps. Surtout avec plusieurs administrateurs, et quand il faut mettre le nez dans une configuration. Il faut d’abord comprendre la logique de celui qui l’a créé. A voir ce qu’apporte Icinga 2 sur ce point !

F. Interfaces

Au niveau de l’interface ouèbe (je vous jure j’ai vu ça dans un bouquin d’info) icinga prépare quelque chose de vraiment sexy avec Icinga web 2. Ne pas confondre Icinga 2 le sye stème de supervision et Icinga web 2 une interface proposée pour la visualisation des hôtes et de l’état de service, les rapports, les journaux, etc.

L’interface est claire et moderne, rien n’a été inventé, mais bien réalisé. On construit facilement des tableaux de bord personnalisés et on a les yeux sur les éléments importants. Quand on navigue d’un élément à un autre, la page se divise en deux pour afficher les détails en gardant la main sur la vue d’origine :

decouverte-icinga-2-03

Capture d’écran interface Icinga Web 2. Source : icinga.org

Les onglets permettent de naviguer simplement dans les différentes vues des objets. C’est agréable à utiliser et vous pourrez même exporter vos vues simplement dans plusieurs formats (PDF, CSV, JSON). Le rendu est aussi propre que l’interface. On a quelques vues sympathiques comme ci-dessous on l’on visualise sur l’ensemble d’une période de temps les jours ou le plus d’incidents ont été remontés :

decouverte-icinga-2-04

Capture d’écran interface Icinga Web 2. Source : icinga.org

Bref, la version 2 de cette interface web donne envie, mais elle reste légère en contenu. On regrette l’absence de vue type business, on l’on visualise directement l’impact des incidents à l’échelle du service global de l’entreprise.

Pas de visualisation graphique des données de performance non plus. Comment évolue l’espace de mon serveur de mon réseau de stockage? Ce n’est pas la question à poser à Icinga 2.

Côté interaction avec le système, l’interface permet quelques actions classiques comme forcer un contrôle, planifier une période de maintenance ou ajouter des commentaires. Il est possible aussi via l’interface de configurer les connexions aux bases de données. En revanche, impossible de modifier la configuration du système.

Il sera toujours possible de greffer des applications tierces selon vos gouts et besoins (Nagvis pour la carthographie, PNP4Nagios pour les graphs ou NCONF pour gérer sa configuration). Mais quand on voit le rendu d’Icinga Web 2, on regrette que ces applications ne soient pas intégrées dans l’interface.
Ceci dit, Icinga Web 2 est en développement et l’équipe travaillant dessus devraient étoffer la fiche technique de la bête rapidement.

Créer son plugin de supervision

$
0
0

I. Présentation

Nous aborderons ici les principaux éléments nécessaires pour écrire son plugin de supervision. Pour rappel, les plugins, ce sont des scripts exécutés pour réaliser un contrôle. Ils retournent des informations qui seront ensuite interprétées par le système de supervision. Les plugins sont intégrables à n’importe quel outil de supervision du moment qu’il interprète de manière identique les retours décrits dans cet article. À ma connaissance, je n’ai pas d’exemple d’outils ne respectant pas ces règles.

Ici le but est de comprendre le principe du plugin afin que vous puissiez ensuite adapter le vôtre. Vous pourrez l’écrire dans le langage de votre choix, à vous de voir ce qui est le plus adapté pour votre script. Vous trouverez souvent en cherchant un peu sur le net un script qui correspond à vos besoins. Parfois, ils ne seront pas totalement adaptés ou bien pires, vous ne trouverez pas ce que vous cherchez! Dans ce cas vous devez vous lancer dans la création de votre plugin. Ou bien vous pouvez le faire tout simplement pour le fun :). Ready ?!

II. Les codes de retour

La première base indispensable pour votre plugin, retourner un code pour déterminer l’état de votre contrôle. Selon le « type » de votre plugin (hôte ou service) les codes retournés seront différents :

Pour un hôte :

  • 0 : UP
  • 1 : DOWN

Pour un service :

  • 0 : OK
  • 1 : WARNING
  • 2 : CRITICAL
  • 3 : UNKNOWN

En théorie vous n’aurez jamais besoin d’écrire un plugin pour un contrôle d’hôte. Le contrôle d’hôte détermine si votre équipement est en vie ou non. Par défaut (et dans la majorité des cas) c’est un ping et ça fait son job !

III. Messages de sortie

La deuxième partie à retourner dans votre script sont les messages de sorties. Ils sont de 3 types :

A. OUPUT

Il donne un descriptif rapide du contrôle. C’est le minimum obligatoire, sa taille est limitée à 255 caractères.

Cette sortie sert dans l’affichage des contrôles. Ses données :

plugins-supervision-01

Vous pourrez récupérer ces valeurs sur votre système de supervision dans la macro $SERVICEOUTPUT$.

B. LONGOUTPUT

Cette sortie donne les détails sur le contrôle effectué. Elle sert à retourner des informations complémentaires à la sortie principale. Elle n’est pas obligatoire, vous pourrez récupérer ces valeurs sur votre système de supervision dans la macro $LONGSERVICEOUTPUT$.

C. PERFDATA

Ou données de performances. Optionnels également, elles sont utilisées pour générer des graphiques. La sortie des données de performance est « normalisée » afin d’élargir les compatibilités entre les outils.

Voici une sortie complète de type perfdata : ‘label’=value[UOM];[warn] ;[crit];[min];[max]

plugins-supervision-02

Seuls le label et la valeur mesurée sont obligatoires. Si le label contient des espaces, il faut l’entourer de simples quottes. Concernant les unités, vous avez le choix parmi les suivantes.

  • Secondes : us, s et ms
  • Bytes : B, KB, MB, GB, TB
  • Pourcentage : %
  • Nombre entier : c

Ces données stockées précieusement permettront de créer des graphs. Vous pourrez retourner plusieurs séries de données de performances, sur vos graphs apparaitrons alors une courbe pour chaque série. Pour différencier deux séries, entre chacune d’entre elles nous mettrons un espace.

Exemple :

/=1300MB;15329;17244;0;19159 /home=1300MB;15329;17244;0;19159

IV. Mettre en forme la sortie

Comme précisé juste avant, tout plugin doit retourner au moins une ligne de texte sur la sortie standard et renvoyer un code de retour compris entre 0 et 3. On appelle la sortie standard STDOUT.

Prenons le script, ou plutôt les lignes de code suivantes en bash :

#!/bin/bash
echo "Attention j'ai un code 2!"
exit 2

Avec ce code vous retournez le strict minimum, vous avez une sortie texte, et un code 2. Si vous voulez intégrer les données de performances, il faudra les séparer de votre sortie texte avec le pipe (|) comme ceci :

#!/bin/bash
echo "Attention j'ai un code 2! | graph1=5000MB;15000;17000;0;19000"
exit 2

Pour rajouter encore une nouvelle sortie texte contenant des informations complémentaires vous pouvez le faire sur la ligne du dessous :

#!/bin/bash
echo "Attention j'ai un code 2! | graph1=5000MB;15000;17000;0;19000"
echo "Pour rappel 2 = critique!"
exit 2

Si vous souhaitez ajouter de nouvelles données de performances, vous pouvez le faire sur la 2eme ligne. Mais toujours avec le pipe pour séparer. Après le pipe, vous pourrez ne mettre que les perfdata. N’oubliez pas qu’il est possible de mettre plusieurs séries de donnés à suivre séparés par un espace, ci-dessous un exemple sur la ligne 2.

#!/bin/bash
echo "Attention j'ai un code 2! | graph1=5000MB;15000;17500;0;20000"
echo "Pour rappel 2 = critique! | ‘graph 2’=16000MB;15000;17500;0;20000 graph_3=18000MB;15000;17500;0;20000"
exit 2

À savoir que votre système se fiche complètement de ce que contient votre script entre la 1ere ligne et la sortie. Il interprète le retour qu’il reçoit, point final. Ceci veut dire qu’en passant ces 3 bouts de code comme un plugins et qu’on simule un contrôle, on obtient ça :

plugins-supervision-03

Le code 2 remonte bien une erreur critique et on repère bien la sortie OUTPUT. En cliquant sur les détails nous pourrons avoir la sortie complémentaire LONGOUTPUT et les PERFDATA.

plugins-supervision-04V. Conclusion

Vous avez tous les éléments pour renvoyer une sortie propre et interprétable à votre système de supervision. À vous d’écrire le contenu du script. Je ne suis pas le mieux placé pour donner des conseils en développement, mais essayez d’optimiser au maximum votre code. C’est aussi avec des scripts de qualité qu’on assure la performance d’un système de supervision.

Installation Icinga2 & Icingaweb2 sur Debian 8

$
0
0

I. Présentation

Dans ce tutoriel nous verrons étape par étape l’installation du système de supervision Icinga2 et son interface web Icingaweb2 sur une machine Debian. A vos claviers !

II. Installation des dépôts

Tout d’abord nous allons installer les dépôts afin de pouvoir installer les paquets nécessaires pour icinga2.

wget -O - http://packages.icinga.org/icinga.key | apt-key add -
echo 'deb http://packages.icinga.org/debian icinga-jessie main' >>/etc/apt/sources.list
echo 'deb-src http://packages.icinga.org/debian icinga-jessie main' >>/etc/apt/sources.listapt-get update

III. Installation Icinga

Ensuite nous allons pouvoir installer le paquet icinga2 et démarrer le service icinga2.

apt-get install icinga2
/etc/init.d/icinga2 start

IV. Installation de la base de données

Si ce n’est pas fait, installez une base de données et son client. Elle servira pour stocker les données générées par le système de supervision. Ici j’ai choisi d’utiliser MySQL sur le même hôte, vous pouvez également utiliser PostgreSQL ou Oracle.

apt-get install mysql-server mysql-client

Vous devrez ensuite configurer le super mot de passe administrateur de la base de données.

installation-icinga-2-debian-01

V. Préparation de la base MySQL

Pour configurer l’enregistrement des données Icinga dans la base MySQL nous allons nous installer le paquet icinga2-ido-mysql, qui correspond à la base de données que j’ai choisie.

apt-get install icinga2-ido-mysql

On vous demandera alors s’il faut activer la fonctionnalité ido-mysql. Vous pouvez décliner la proposition, nous l’activerons juste après.

installation-icinga-2-debian-02

Ensuite nous allons laisser l’installateur se charger de la configuration de la base de données dans MySQL.

installation-icinga-2-debian-03

Suite à cela vous devrez entrer le mot de passe que vous avez défini pour l’administrateur MySQL.

installation-icinga-2-debian-04

Ensuite renseignez un nouveau mot de passe qui sera utilisé par Icinga afin d’accéder à la base et d’enregistrer les données.

installation-icinga-2-debian-05

Une fois la configuration terminée vous pourrez la vérifier dans le fichier ido-mysql.conf. Notez les différents paramètres, ils nous serviront pour la configuration de l’interface web.

cat /etc/icinga2/features-available/ido-mysql.conf

VI. Vérifier et activer les fonctionnalités

Avec la commande icinga2 vous pouvez faire tout un tas de choses, notamment  activer et désactiver des fonctionnalités. Vous pourrez vérifier les fonctionnalités activées avec la commande suivante :

icinga2 feature list

Vous devrez activer les fonctionnalités ido-mysql, pour l’enregistrement des données dans MySQL. Et la fonctionnalité command, qui permettra notamment à l’interface web d’envoyer des commandes à Icinga. Si vous avez besoin d’autres fonctionnalités vous pourrez les activer/désactiver quand vous voulez.

icinga2 feature enable ido-mysql command

Après activation ou désactivation des fonctionnalités, n’oubliez pas de redémarrer le service Icinga2.

/etc/init.d/icinga2 restart

Félicitations, votre système de supervision est opérationnel ! Maintenant on va lui installer une sympathique petite interface web histoire d’avoir un petit aperçu de ce qu’il se passe là-dedans.

VII. Installation et configuration de l’interface Icingaweb2

Avant d’installer l’interface web, assurez-vous d’avoir un serveur web en marche. Si ce n’est pas fait, vous pouvez installer apache2.

apt-get install apache2

Une fois le serveur web prêt, vous pouvez installer le paquet icingaweb2.

apt-get install icingaweb2

Pour pouvoir commencer l’installation, vous devrez générer un token sur le serveur icinga.

icingacli setup token create

Notez bien le token qui viens d’être généré et rendez-vous sur la page http://X.X.X.X/icingaweb2/setup

Vous devriez alors tomber sur cette page, rentrez votre token et cliquez sur suivant.

installation-icinga-2-debian-06

Sur la fenêtre qui suit coché Monitoring et cliquez sur Next.

installation-icinga-2-debian-07

Le système vérifiera avant de lancer l’installation quelques dépendances pour le bon fonctionnement de l’interface.

installation-icinga-2-debian-08

Vous devriez avoir quelques dépendances non satisfaites. Si vous avez :

The PHP config `date.timezone' is not defined.

Changez la timezone d’apache dans le fichier /etc/php5/apache2/php.ini

date.timezone = europe/paris

Vous devriez également avoir quelques dépendances de modules PHP non satisfaites (Imagick et INTL). Installez-les :

apt-get install php5-intl php5-imagick

N’oubliez pas de redémarrer le service apache !

/etc/init.d/apache2 restart

Vous pouvez actualiser la page des dépendances avec le bouton refresh en bas de page, il vous restera normalement deux dépendances en avertissement :

The PHP module PDO-PostgreSQL is missing & The PHP module PDO-PostgreSQL is missing.

Ces modules servent pour l’utilisation de la base de données PostgreSQL. Elles ne sont pas indispensables, nous pouvons les ignorer vu que nous utilisons la base de données MySQL.
Vous pouvez donc passer à la suite. Choisissez votre mode d’authentification.installation-icinga-2-debian-09

Ensuite, configurez l’endroit où seront stockées les préférences des utilisateurs de l’interface.

installation-icinga-2-debian-10

Ici vous devrez paramétrer l’accès à votre base de données MySQL pour que le système y créer une base contenant les paramètres utilisateurs. Utilisez un compte ayant les droits de création de la base. Ici j’ai utilisé l’administrateur de la base de données (root) pour une question pratique. Il est toutefois plus prudent d’utiliser un autre compte, cette connexion sera utilisée pour vérifier les logins des utilisateurs de l’interface :

installation-icinga-2-debian-11

Vous devrez ensuite donner un nom à ces paramètres de connexion.installation-icinga-2-debian-12

Maintenant, créez votre premier utilisateur pour vous connecter à l’interface.installation-icinga-2-debian-13

Ici vous allez paramétrer les différents paramètres de logs. Vous pouvez tout laisser par défaut et modifier les paramètres plus tard via l’interface web.installation-icinga-2-debian-14

Maintenant nous allons configurer la source de données.  installation-icinga-2-debian-15

C’est ici que vous allez renseigner les paramètres du fichier /etc/icinga2/features-available/ido-mysql.conf créé précédemment.installation-icinga-2-debian-16

Si vous avez le message suivant, c’est que vous avez oublié d’activer la fonctionnalité ido-mysql ou que vous avez oublié de redémarrer le service icinga2 suite à son activation.

installation-icinga-2-debian-17

A cette étape, vous définirez l’instance de supervision. Sauf configuration spécifique vous pouvez conserver les paramètres par défaut.installation-icinga-2-debian-18

Enfin, pour la dernière étape on vous propose de protéger vos variables sensibles au travers d’une expression régulière. Toutes les variables correspondantes seront protégées.installation-icinga-2-debian-19 installation-icinga-2-debian-20

Et voilà, si tout s’est bien passé votre interface Icingaweb2 est prête, vous n’avez plus qu’à vous connecter et découvrir ce qu’elle vous propose. Enjoy ! :)

Configurer SNMP sous Windows Server 2012 R2

$
0
0

I. Présentation

Pour donner suite au tutoriel publié il y a quelque temps par Mickaël quant à l’installation et la configuration du SNMP sous Windows Server 2008, ce tutoriel concerne Windows Server 2012 R2.

Nous verrons comment installer le SNMP en PowerShell, et ensuite on regardera la configuration de l’outil.

Pour rappel, le SNMP est un protocole qui permet de superviser (monitoring) un équipement (commutateurs, routeurs, serveurs, imprimantes…), basé sur un système de MIB et de communauté. À ce jour, il existe trois versions du SNMP et elles sont toutes les trois supportées par Windows.

II. Installer SNMP en PowerShell

Je trouve plus rapide de lancer une installation en PowerShell qu’en passant par le Gestionnaire de serveur (qu’il faut bien souvent commencer par démarrer), c’est pourquoi je vous propose cette solution.

Ouvrez une console PowerShell en tant qu’administrateur, et saisissez la commande suivante :

Get-WindowsFeature -Name *snmp* | Install-WindowsFeature

Cette commande a pour effet d’installer toutes les fonctionnalités qui contiennent SNMP dans leurs noms, à savoir :

  • Outils SNMP (“RSAT-SNMP”) : Permets l’administration de la fonctionnalité SNMP
  • Service SNMP (“SNMP-Service”) : Le service SNMP en lui-même
  • Fournisseur WMI SNMP (“SNMP-WMI-Provider”) : Utiliser les requêtes WMI par SNMP avec cette extension

Pour vérifier l’état de l’installation si vous le souhaitez, exécutez simplement cette commande :

Get-WindowsFeature -Name *snmp*

Vous obtiendrez ceci :

Vérifier si le SNMP est bien installé

Vérifier si le SNMP est bien installé

Passons maintenant à la configuration.

III. Configuration du service SNMP

Il n’y a pas de console MMC propose à la gestion du service SNMP, la configuration s’effectue par les propriétés du service SNMP.

Par conséquent, accédez à la console des services (services.msc) et recherchez le service nommé “Service SNMP“. Effectuez un clic droit dessus et “Propriétés“.

Accéder aux propriétés du service SNMP

Accéder aux propriétés du service SNMP

Par rapport à un service classique, vous devez observer la présence d’onglets supplémentaires : Interruptions, Sécurité et Agents, sachant que l’on utilise principalement les deux derniers cités.

Si vous ne voyez pas ces onglets, pas de panique ! Il suffit de redémarrer le service par un clic droit sur “Service SNMP” puis “Redémarrer“, sinon par PowerShell :

Restart-Service SNMP

Retournez dans les propriétés et les onglets doivent apparaître.

A. Onglet “Sécurité”

Dans cet onglet, on déclare les communautés que l’on accepte ainsi que les droits attribués. Bien souvent, on attribut une autorisation de lecture seule sur une communauté, mais reste que plusieurs choix sont proposés.

  • Ajouter une communauté

Pour ajouter une communauté, on cliquera sur “Ajouter” et on saisit les informations correspondantes. Il est possible d’ajouter plusieurs communautés, avec un niveau différent de droits à chaque fois si besoin.

Pour le nom des communautés, il est préférable d’utiliser des noms complexes.

  • Filtrage des hôtes

Par sécurité, il vaut mieux cocher l’option “Accepter les paquets SNMP provenant de ces hôtes” et ajoutez à la liste votre serveur de supervision. Ceci évite d’accepter les paquets SNMP provenant de n’importe qui…

SNMP - Onglet Sécurité

SNMP – Onglet Sécurité

Passons à l’onglet “Agent“.

B. Onglet “Agent”

Cet onglet sert à indiquer des informations relatives à votre serveur pour les intégrer dans l’agent SNMP. La zone “Contact” permet d’indiquer les infos sur la personne qui administre ce serveur (un nom prénom, ou une adresse e-mail), alors que le champ “Emplacement” sert à indiquer où se trouve ce serveur (exemple : Salle blanche).

ws-2012-snmp-4

Enfin, différentes options sont proposées au niveau “Service” :

Physique : Le serveur gère-t-il des périphériques physiques ? Exemple : un disque dur.

Applications : Des applications envoient-elles des données par le biais de TCP/IP ?

Liaison de données et sous-réseau : Le serveur gère-t-il un pont ?

Internet : Le serveur est-il un routeur ?

Bout en bout : Le serveur est-il connecté au réseau en TCP/IP ?

N’hésitez pas à tester votre configuration avec un logiciel de test SNMP, ou sinon testez directement avec votre serveur de supervision. Si vous doutez que la configuration soit bien prise en compte, redémarrez le service SNMP sans hésiter.


Auto-hébergement et synchronisation : Problème d’URL

$
0
0

I. Présentation

L’auto-hébergement, notamment pour les solutions de stockage de fichiers de type “Cloud” est aujourd’hui assez répandue. Nous sommes nombreux à mettre en place, sur des Raspeberry Pi ou des NAS des solutions telles qu’Owncloud, CozyCloud ou Pydio pour se passer des services de géants tels que Microsoft ou Google, trop regardant sur nos données personnelles.

Si c’est votre cas et que votre solution est hébergée chez vous, vous avez sûrement rencontré le même problème que moi :

Lorsque vous êtes à l’extérieur de votre LAN, vous ciblez avec votre client de synchronisation une IP publique fixe, ou un système DynDNS, ou encore des systèmes DNS fournis par les constructeurs de NAS de type MyQNAPCloud.com ou Synology.me. Ceux-ci permettent, via la création d’un compte, d’avoir un système proche de celui du DynDNS afin de joindre son NAS a travers une IP publique dynamique

Cependant lorsque vous rentrez chez vous, vous souhaitez alors joindre votre NAS/ RaspberryPi avec son IP interne et non plus le système DynDNS ou le système DNS de votre NAS, c’est là qu’un problème se pose car il est difficile de changer dynamiquement la configuration du client de synchronisation à chaque fois

Nous allons donc voir ici ensemble une solution de contournement à ce problème basée sur un petit (vraiment petit) script.

Ce tutoriel a été réalisé avec l’environnement suivant :

  • un PC portable qui est parfois dans le LAN, parfois non
  • un NAS QNAP utilisant le système DNS 123123123.myqnapcloud.fr
  • Un service Owncloud présent sur ce NAS avec un client de synchronisation sur le PC portable

Le but est alors le suivant :

  • Lorsque je suis à l’extérieur, j’utilise de façon standard le système DNS fournis par MyQNAPCloud qui permet de joindre mon NAS, plus précisément l’Owncloud qui s’y situe avec mon client de synchronisation qui pointe vers 123123123.myqnapcloud.com
  • Lorsque je suis dans mon LAN, je sais le détecter et je change ma configuration DNS automatiquement afin de bypasser (passer outre) le système de résolution de QNAP qui indiquerait à mon client de synchronisation mon IP publique (alors que mon NAS est en local).

Pour plaire à tout le monde, je vais bien entendu vous proposer le même système à la fois sous Linux et sous Windows. Il est à noter que selon votre contexte, il sera à adapter. Si vous utilisez le système Synology plutôt que QNAP par exemple.

Il faut savoir que pour savoir si je suis dans mon LAN ou non, je me base sur la présence d’une page web, celle-ci doit donc être unique à votre LAN. Ce n’est en soit pas très difficile à faire. Positionnez par exemple une page http://IPserveur/32542354254287425772.html sur votre serveur afin d’être certains que vous ne la trouverez dans aucun autre environnement. Pour ma part, je vise simplement la page d’accueil de mon NAS QNAP (son IP est 192.168.1.2 en local). Voici le déroulement du script :

auto-hebergement-probleme-url-01
Ce script sera donc exécuté à chaque démarrage, par exemple 2 minutes après le boot pour nous laisser le temps de trouver une IP et un accès au réseau. Ainsi, on pourra dynamiquement changer l’enregistrement DNS pour que notre client de synchronisation, utilisant toujours le même nom DNS, arrive sur l’IP privée ou publique de notre NAS ou autre solution d’hébergement.

II. Script Sous Windows : Powershell

Voici le script en question en Powershell :

$web = [net.webRequest]::Create("http://192.168.1.2:8080/cgi-bin")
$web.GetResponse()

if ( $? -eq "True")
    {Add-Content C:\Windows\System32\drivers\etc\hosts "192.168.1.2 123123123.myqnapcloud.com"}
else
    {(Get-Content C:\Windows\System32\drivers\etc\hosts) -notmatch "123123123" | Out-File C:\Windows\System32\drivers\etc\hosts}

Ici, on récupère donc une page qui ne pourra se trouver que sur notre LAN, cela peut être une page créée pour l’occasion. Pour ma part, je vise simplement l’IP de mon NAS. On utilise “Get.Response()” pour effectuer notre requête. Si la commande aboutie, la variable d’environnement “$?” (qui fonctionne de façon similaire sous Windows et sous Linux) retournera “True“, sinon cela causera une erreur et la “$?” vaudra “False“. On pose donc notre condition en conséquence.

Si je suis dans mon LAN ($? = True), j’ajoute dans le fichier “hosts” l’enregistrement de l’IP locale pour le domaine visé par mon client de synchronisation.

Sinon, je supprime les enregistrement dans mon fichier “hosts” concernant cet enregistrement. On peut naturellement modifier ce script pour switcher entre IP publique fixe et une IP locale par exemple.

Vous pourrez donc stocker ces lignes dans un fichier au format .ps1 puis l’exécuter au besoin. Il est important d’exécuter ce script en tant qu’administrateur car il est le seul habilité à modifier le fichier hosts.

C:\Windows\System32\drivers\etc\hosts

III. Script Sous Linux : Bash et Cron

Pour les personnes comme moi disposant d’un environnement Linux, voici le script que j’utilise :

#!/bin/bash
# Vérifier si l'on se situe dans notre LAN.
# Je récupère le code HTTP d'une page située sur un élément de mon LAN (mon NAS)
command=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' http://192.168.1.2:8080/cgi-bin/)

# Si l'élément répond, je suis dans mon LAN donc je bypass la résolution DNS par l'IP interne
if [[ $command -eq "200" ]];then
    echo "192.168.1.2 123123123.myqnapcloud.com"  >> /etc/hosts
# Sinon, je laisse le système de résolution de QNAP faire le travail DNS
else
    sed -i '/123123123/d' /etc/hosts
fi

Ici, on utilise la commande “curl‘” pour récupérer le code HTTP retourné par la page spécifique à notre LAN. Si le code retourné est “200“, cela signifie que l’on est dans le LAN, on peut donc utiliser notre fichier hosts local pour résoudre le domaine de notre NAS ou DynDNS. Sinon, on supprime tout enregistrement concernant ce domaine présent dans notre fichier hosts. Il est important que ce soit “root” qui fasse tourne ce script car il est le seul habilité à modifier le fichier /etc/hosts

Je l’ai stocké dans /root/Documents/scripts/ et l’ai noblement nommé Owncloudconnect.sh. En tant que root, on utilisera ensuite la commande “crontab -l” pour y ajouter la ligne suivante :

@reboot sleep 120 && /root/Documents/scripts/Owncloudcorrect.sh

Celle-ci permettra, 2 minutes après chaque reboot, l’exécution automatique du script. Vous n’aurez alors plus rien à faire ! :)

Centreon Enterprise Server : Cartographie avec NagVis

$
0
0

I. Présentation

La solution de supervision Centreon Enterprise Server (CES) n’intègre pas nativement la possibilité de réaliser une cartographie de votre infrastructure. Pour répondre à ce besoin il y a plusieurs solutions, notamment d’utiliser “Centreon Map” mais vous devez disposer au minimum de la version Essentials de CES et celle-ci est payante. Si vous souhaitez utiliser la version Standard logo-centreon1(gratuite), vous pouvez vous tourner vers la solution NagVis qui est gratuite et complète. J’ajoute même que NagVis est un produit réputé.

L’objectif est de disposer d’un outil permettant de créer différentes cartes du réseau, avec dessus des points d’états quant aux hôtes et services.

Attention, ce tutoriel s’applique à la configuration de NagVis pour Centreon Enterprise Server (fonctionnel sur l’édition gratuite), si vous êtes sur une installation manuelle sous Debian il y a des différences (chemins, utilisateurs, etc.). On utilisera Nagvis 1.7.10 car la dernière version n’est pas officiellement supportée sur CES.

II. Installation de Nagvis

Avant de se lancer dans l’installation de Nagvis, installez Graphviz qui est un prérequis.

yum install graphviz

centreon-nagvis-1

Pour débuter l’installation, connectez-vous en shell sur le serveur CES et exécutez la suite de commandes suivante :

# Dossier d'installation de nagvis
cd /usr/local/
# Récupérer les sources de Nagvis
wget http://sourceforge.net/projects/nagvis/files/NagVis%201.7/nagvis-1.7.10.tar.gz/download
# Décompresser les sources de Nagvis
tar -xzvf nagvis-1.7.10.tar.gz
# Renommer le répertoire en "nagvis"
mv nagvis-1.7.10 nagvis
# Accès au répertoire de nagvis
cd nagvis/
# Exécuter le script d'installation de Nagvis
./install.sh

Maintenant, une suite d’étape va s’enchaîner pour parvenir à l’installation de Nagvis. Ci-dessous, une configuration fonctionnelle pour que ça fonctionne avec CES.

Note : Sous CES, l’utilisateur du service web est “apache” mais sous Debian il s’agira de “www-data” que vous connaissez certainement.

Lorsque aucune valeur n’est indiquée, c’est que la valeur par défaut est conservée.

+------------------------------------------------------------------------------+
| Welcome to NagVis Installer 1.7.10                                           |
+------------------------------------------------------------------------------+
| This script is built to facilitate the NagVis installation and update        |
| procedure for you. The installer has been tested on the following systems:   |
| - Debian, since Etch (4.0)                                                   |
| - Ubuntu, since Hardy (8.04)                                                 |
| - SuSE Linux Enterprise Server 10 and 11                                     |
|                                                                              |
| Similar distributions to the ones mentioned above should work as well.       |
| That (hopefully) includes RedHat, Fedora, CentOS, OpenSuSE                   |
|                                                                              |
| If you experience any problems using these or other distributions, please    |
| report that to the NagVis team.                                              |
+------------------------------------------------------------------------------+
| Do you want to proceed? [y]: y
+------------------------------------------------------------------------------+
| Starting installation of NagVis 1.7.10                                       |
+------------------------------------------------------------------------------+
| OS  : Centreon Enterprise Server                                             |
|                                                                              |
+--- Checking for tools -------------------------------------------------------+
| Using packet manager /bin/rpm                                          found |
|                                                                              |
+--- Checking paths -----------------------------------------------------------+
| Please enter the path to the nagios base directory [/usr/local/nagios]: /usr/share/centreon/
|   nagios path /usr/share/centreon/                                     found |
| Please enter the path to NagVis base [/usr/local/nagvis]:
|                                                                              |
+--- Checking prerequisites ---------------------------------------------------+
| PHP 5.3                                                                found |
|   PHP Module: gd php                                                   found |
|   PHP Module: mbstring php                                             found |
|   PHP Module: gettext compiled_in                                      found |
|   PHP Module: session compiled_in                                      found |
|   PHP Module: xml php                                                  found |
|   PHP Module: pdo php                                                  found |
|   Apache mod_php                                                       found |
| Do you want to update the backend configuration? [n]:
| Graphviz 2.26                                                          found |
|   Graphviz Module dot 2.26.0                                           found |
|   Graphviz Module neato 2.26.0                                         found |
|   Graphviz Module twopi 2.26.0                                         found |
|   Graphviz Module circo 2.26.0                                         found |
|   Graphviz Module fdp 2.26.0                                           found |
| SQLite 3.6                                                             found |
|                                                                              |
+--- Trying to detect Apache settings -----------------------------------------+
| Please enter the web path to NagVis [/nagvis]:
| Please enter the name of the web-server user [apache]:
| Please enter the name of the web-server group [apache]:
| create Apache config file [y]:
|                                                                              |
+--- Checking for existing NagVis ---------------------------------------------+
| NagVis 1.7.10                                                          found |
| Do you want the installer to update your config files when possible? [y]:
| Remove backup directory after successful installation? [n]:
|                                                                              |
+------------------------------------------------------------------------------+
| Summary                                                                      |
+------------------------------------------------------------------------------+
| NagVis home will be:           /usr/local/nagvis                             |
| Owner of NagVis files will be: apache                                        |
| Group of NagVis files will be: apache                                        |
| Path to Apache config dir is:  /etc/httpd/conf.d                             |
| Apache config will be created: yes                                           |
|                                                                              |
| Installation mode:             update                                        |
| Old version:                   1.7.10                                        |
| New version:                   1.7.10                                        |
| Backup directory:              /usr/local/nagvis.old-2015-07-30_08:58:15     |
|                                                                              |
| Note: The current NagVis directory will be moved to the backup directory.    |
|       The backup directory will be NOT removed after successful installation |
|       Your configuration files will be copied.                               |
|       The configuration files will be updated if possible.                   |
|                                                                              |
| Do you really want to continue? [y]: y
+------------------------------------------------------------------------------+
| Starting installation                                                        |
+------------------------------------------------------------------------------+
| Moving old NagVis to /usr/local/nagvis.old-2015-07-30_08:58:15..       done  |
| Creating directory /usr/local/nagvis...                                done  |
| Creating directory /usr/local/nagvis/var...                            done  |
| Creating directory /usr/local/nagvis/var/tmpl/cache...                 done  |
| Creating directory /usr/local/nagvis/var/tmpl/compile...               done  |
| Creating directory /usr/local/nagvis/share/var...                      done  |
| Copying files to /usr/local/nagvis...                                  done  |
| Creating directory /usr/local/nagvis/etc/profiles...                   done  |
| Creating main configuration file...                                    done  |
|   Adding webserver group to file_group...                              done  |
| Creating web configuration file...                                     done  |
| Setting permissions for web configuration file...                      done  |
|                                                                              |
| Restoring custom map configuration files...                            done  |
| Restoring custom geomap source files...                                done  |
| Restoring conf.d/ configuration files...                               done  |
| Restoring custom map images...                                         done  |
| Restoring custom gadget images...                                      done  |
| Restoring custom iconsets...                                           done  |
| Restoring custom shapes...                                             done  |
| Restoring custom templates...                                          done  |
| Restoring custom template images...                                    done  |
| Restoring custom gadgets...                                            done  |
| Restoring custom scripts...                                            done  |
| Restoring custom stylesheets...                                        done  |
|                                                                              |
+------------------------------------------------------------------------------+
| Handling changed/removed options                                             |
+------------------------------------------------------------------------------+
| Removing allowedforconfig option from main config...                   done  |
| Removing autoupdatefreq option from main config...                     done  |
| Removing htmlwuijs option from main config...                          done  |
| Removing wuijs option from main config...                              done  |
| Removing showautomaps option from main config...                       done  |
| Removing usegdlibs option from main config...                          done  |
| Removing displayheader option from main config...                      done  |
| Removing hovertimeout option from main config...                       done  |
| Removing allowed_for_config option from map configs...                 done  |
| Removing allowed_user from map configs...                              done  |
| Removing hover_timeout from map configs...                             done  |
| Removing usegdlibs from map configs...                                 done  |
+------------------------------------------------------------------------------+
| HINT: Please check the changelog or the documentation for changes which      |
|       affect your configuration files                                        |
|                                                                              |
+--- Setting permissions... ---------------------------------------------------+
| /usr/local/nagvis/etc/nagvis.ini.php-sample                            done  |
| /usr/local/nagvis/etc                                                  done  |
| /usr/local/nagvis/etc/maps                                             done  |
| /usr/local/nagvis/etc/maps/*                                           done  |
| /usr/local/nagvis/etc/geomap                                           done  |
| /usr/local/nagvis/etc/geomap/*                                         done  |
| /usr/local/nagvis/etc/profiles                                         done  |
| /usr/local/nagvis/share/userfiles/images/maps                          done  |
| /usr/local/nagvis/share/userfiles/images/maps/*                        done  |
| /usr/local/nagvis/share/userfiles/images/shapes                        done  |
| /usr/local/nagvis/share/userfiles/images/shapes/*                      done  |
| /usr/local/nagvis/var                                                  done  |
| /usr/local/nagvis/var/*                                                done  |
| /usr/local/nagvis/var/tmpl                                             done  |
| /usr/local/nagvis/var/tmpl/cache                                       done  |
| /usr/local/nagvis/var/tmpl/compile                                     done  |
| /usr/local/nagvis/share/var                                            done  |
|                                                                              |
+------------------------------------------------------------------------------+
| Installation complete                                                        |
|                                                                              |
| You can safely remove this source directory.                                 |
|                                                                              |
| For later update/upgrade you may use this command to have a faster update:   |
| ./install.sh -n /usr/share/centreon -p /usr/local/nagvis -u apache -g apache -w /etc/httpd/conf.d -a y
|                                                                              |
| What to do next?                                                             |
| - Read the documentation                                                     |
| - Maybe you want to edit the main configuration file?                        |
|   Its location is: /usr/local/nagvis/etc/nagvis.ini.php                      |
| - Configure NagVis via browser                                               |
|   <http://localhost/nagvis/config.php>                                       |
| - Initial admin credentials:                                                 |
|     Username: admin                                                          |
|     Password: admin                                                          |
+------------------------------------------------------------------------------+

Enfin, on redémarre le service web pour terminer l’installation de nagvis :

service httpd restart

Nagvis est installé, il fonctionne en tant qu’application indépendante pour le moment. Vous pouvez vous connecter sur l’interface web (/nagvis) pour vérifier cela, il contient par défaut des cartes de démo.

Pour faire le nettoyage et supprimer ces cartes de démo, exécutez cette commande :

rm /usr/local/nagvis/etc/maps/*.cfg

III. Configurer Nagvis

Maintenant pour la configuration de Nagvis on va commencer par compléter deux étapes :

  • Installer le connecteur pour Centreon-Broker
  • Configurer Nagvis pour Centreon

A. Connecteur Centreon-Broker

Commencez par installer Git si vous ne l’avez pas :

yum install git-core

On se positionne dans le répertoire src et on récupère une copie du connecteur sur GitHub :

cd /usr/local/src
git clone https://github.com/centreon/centreon-nagvis-backend.git

Ensuite, on copie le fichier PHP du connecteur dans le répertoire de Nagvis en lui donnant les bonnes autorisations pour l’utilisateur apache :

mv /usr/local/src/centreon-nagvis-backend/GlobalBackendcentreonbroker.php /usr/local/nagvis/share/server/core/classes/
chown apache: /usr/local/nagvis/share/server/core/classes/GlobalBackendcentreonbroker.php
chmod 664 /usr/local/nagvis/share/server/core/classes/GlobalBackendcentreonbroker.php

Passons à la suite.

B. Configurer Nagvis

Effectuez une sauvegarde du fichier de configuration de Nagvis avant modification (pensez à déplacer ce fichier de backup) :

cd /usr/local/nagvis/etc/
cp nagvis.ini.php nagvis.ini.php.bak

Editez le fichier de configuration :

vi nagvis.ini.php

Dans le fichier, indiquez cette configuration (adaptée de la configuration fournie sur le site Centreon : Nagvis conf) :

; <?php return 1; ?>
; the line above is to prevent
; viewing this file from web.
; DON'T REMOVE IT!

; ----------------------------
; Default NagVis Configuration File
; At delivery everything here is commented out. The default values are set in the NagVis code.
; You can make your changes here, they'll overwrite the default settings.
; ----------------------------

; ----------------------------
; !!! The sections/variables with a leading ";" won't be recognised by NagVis (commented out) !!!
; ----------------------------

[global]
authmodule="CoreAuthModSQLite"
authorisationmodule="CoreAuthorisationModSQLite"
dateformat="Y-m-d H:i:s"
file_group="apache"
file_mode=660
language_detection="user,session,browser,config"
language="en_US"
refreshtime=60
sesscookiedomain="auto-detect"
sesscookiepath="/"
sesscookieduration=86400
startmodule="Overview"
startaction="view"

[paths]
base="/usr/local/nagvis/"
htmlbase="/nagvis"
htmlcgi="/centreon"

[defaults]
backend="centreonbroker"
backgroundcolor="#ffffff"
contextmenu=1
contexttemplate="default"
event_on_load=0
event_repeat_interval=0
event_repeat_duration=-1
eventbackground=0
eventhighlight=1
eventhighlightduration=30000
eventhighlightinterval=500
eventlog=0
eventloghidden=1
eventscroll=1
headermenu=1
headertemplate="default"
headerfade=1
hovermenu=1
hovertemplate="default"
hoverdelay=0
hoverchildsshow=1
hoverchildslimit=10
hoverchildsorder="asc"
hoverchildssort="s"
icons="std_medium"
onlyhardstates=0
recognizeservices=1
showinlists=1
showinmultisite=1
urltarget="_parent"
hosturl="[htmlcgi]/main.php?p=20201&o=svc&host_search=[host_name]&search=&poller=&hostgroup=&output_search="
hostgroupurl="[htmlcgi]/main.php?p=20209&o=svcOVHG"
serviceurl="[htmlcgi]/main.php?p=20201&o=svcd&host_name=[host_name]&service_description=[service_description]"
servicegroupurl="[htmlcgi]/main.php?p=20212&o=svcOVSG"
mapurl="[htmlcgi]/main.php?p=403&map=[map_name]"
view_template="default"
label_show=1

[index]
backgroundcolor="#ffffff"
cellsperrow=4
headermenu=1
headertemplate="default"
showmaps=1
showgeomap=0
showrotations=1
showmapthumbs=0

[automap]

[wui]
maplocktime=5
grid_show=0
grid_color="#D5DCEF"
grid_steps=32

[worker]
interval=10
requestmaxparams=0
requestmaxlength=1900
updateobjectstates=30

[backend_centreonbroker]
backendtype="centreonbroker"
statushost=""
dbhost="localhost"
dbport=3306
dbname="centreon_storage"
dbuser="centreon"
dbpass="votre-mot-de-passe"
dbinstancename="default"
htmlcgi="/centreon"

[states]

; -------------------------
; EOF
; -------------------------

La configuration ci-dessus est fonctionnelle, seul le paramètre “dbpass” doit être modifié pour indiquer le mot de passe de votre base de données Centreon. Pour le reste, les directives sont classiques mais l’essentiel est surtout situées au niveau de quatre directives qui permettent d’indiquer vers quelle URL il faut rediriger dans l’interface de Centreon lorsque l’on clic sur un objet (hôte, service).

  • hosturl : URL pour un hôte
  • hostgroupurl : URL pour un groupe d’hôtes
  • serviceurl : URL pour un service
  • servicegroupurl : URL pour un groupe de services

Vous pouvez adapter ces liens, il suffit d’aller dans l’interface de Centreon et de regarder l’URL qui apparaît lorsque l’on choisit un affichage particulier, de copier ce lien et de l’adapter avec les variables dans Nagvis [host_name] – [service_description].

On a également définit le Centreon-Brocker come backend par défaut dans Nagvis avec la directive “backend“.

IV. Installer l’extension centreon-nagvis

Dans cette quatrième étape, nous allons intégrer Nagvis à Centreon par l’intermédiaire d’une extension gratuite. Comme nous sommes sous CES, on peut directement installer l’extension “centreon-nagvis” depuis les dépôts par l’intermédiaire de yum :

yum install centreon-nagvis

Note : Sous Debian, les sources de l”extension doivent être téléchargées manuellement.

centreon-nagvis-3

L’installation est téléchargée mais elle n’est pas pour autant installée. Pour réaliser l’installation, connectez-vous sur l’interface de Centreon, allez dans “Administration” puis “Extensions“. Une extension nommée “centreon-nagvis” doit apparaître, cliquez tout à droite sur le bouton pour installer le module.

centreon-nagvis-5

Tout simplement, cliquez sur le bouton “Installer le module“.

centreon-nagvis-6

Le message “Module installé et enregistré” doit apparaître.

centreon-nagvis-7

Dans “Administration” vous avez désormais un nouvel onglet nommé “Nagvis” disponible. Accédez à cet onglet.

centreon-nagvis-10

La configuration doit être éventuellement modifiée uniquement au niveau “Nagvis authentication” car il y a deux modes disponibles :

  • Single user

Tout simplement on utilise un compte créé directement dans l’application Nagvis, à savoir “admin” par défaut mais on va plutôt définir un utilisateur spécifique avec uniquement un accès en lecture seule.

  • Centreon User

Ce mode permet de gérer le multi-utilisateurs en associant un utilisateur Centreon à un utilisateur Nagvis, ceci permet de gérer différents niveaux de droits.

Dans le cadre de ce tutoriel, indiquez “centreon_nagvis” dans l’interface Centreon et laissez le mode “Single User“. Il faut par contre qu’on le crée dans l’interface de Nagvis.

Connectez-vous sur l’interface (http://serveur/nagvis) et dans le menu cliquez sur “Menu personnel” et “Gérer les utilisateurs“. Dans la zone “Créer un utilisateur”, indiquez “centreon_nagvis” et choisissez un mot de passe. Cliquez sur “Créer un utilisateur“.

centreon-nagvis-11

Ensuite, dans la zone “Modifier un utilisateur“, choisissez celui que l’on vient de créer. Sur la gauche cliquez sur “Users (read-only)” et cliquer sur la flèche pour le déplacer vers les rôles sélectionnés. Cliquez sur “Modifier un utilisateur“.

centreon-nagvis-12

La configuration de Nagvis est terminée, l’intégration à CES également. Il ne reste plus qu’à créer votre carte, pour cela il faut apprendre à manipuler l’interface de Nagvis et quelques paramètres de base mais ce n’est pas l’objet de ce tutoriel.

Dans l’interface de Centreon, dans “Vues” et “Nagvis” vous pourrez visualiser vos cartes.

V. Erreur accès onglet “Nagvis”

Lorsque vous accéderez pour la première fois à l’onglet “Vues” et “Nagvis” pour visualiser votre carte, vous pourrez obtenir le message d’erreur comme ci-dessous. Il s’agit d’une erreur de configuration, que nous allons corriger.

Error: (0) strftime(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Berlin’ for ‘CEST/2,0/DST’ instead (/usr/share/centreon/GPL_LIB/Smarty/libs/Smarty_Compiler.class.php:400)

centreon-nagvis-8

L’objectif est d’ajouter un fuseau horaire dans la configuration de PHP, pour cela éditez le fichier “/etc/php.ini” et décommentez la ligne 946 (supprimer le point-virgule). Ajoutez ensuite la timezone que vous souhaitez, pour l’Europe indiquez “Europe/Paris” comme ceci :

centreon-nagvis-9

Il ne reste plus qu’à redémarrer le service httpd :

service httpd restart

VI.  Créer une carte Nagvis

Avant de vous laisser dans le grand bain avec Nagvis entre les mains, voici rapidement comment créer une carte.

Connectez-vous sur Nagvis, et dans le menu cliquez sur “Options” et “Gérer les cartes“.

Remplissez la zone “Créer une carte” et cliquez sur “Créer“, votre carte est créée et prête à être construite !

centreon-nagvis-13

Il est à noter que pour le moment Nagvis ne supporte pas l’automap avec Centreon, c’est à dire le fait de générer automatiquement la carte selon votre configuration de Centreon. En espérant que cette fonctionnalité finisse par arriver.

Pour le fond de carte, il est astucieux d’utiliser un schéma de votre réseau (réalisé avec un outil comme Visio) et ensuite placez les icônes d’état sur ce schéma.

Monitoring : supervision et métrologie

$
0
0

Aujourd’hui un petit article pour revenir sur les notions de bases concernant le monitoring qui sont souvent mal comprises voir méconnues : monitoring, supervision et métrologie

La supervision est un sujet présent dans toutes les systèmes d’information à partir d’un certaines tailles. Alors que certains préfèrent des outils libres tels que Nagios, Nagvis, Shinken ou Icinga, d’autres utilisent des solutions propriétaires, souvent plus simple d’accès et d’administration tel que PRTG. On oublie cependant parfois que la “supervision” n’est qu’un des éléments qui composent le monitoring.

Le monitoring (ou monitorage en français, mais on gardera monitoring 😉 ), désigne le fait de “surveiller“, ou “garder un oeil sur“. Cependant, le fait de surveiller quelque chose revient à connaître sont état actuel mais aussi l’historique de ses états passés, par l’intermédiaire de valeurs (UP/DOWN) et de données chiffrées (des pourcentages par exemple). C’est ici que l’on retrouve une distinction entre deux notions que sont la supervision et la métrologie

La métrologie, dans laquelle on retrouve la notion de mètre/métrique, et le fait d’obtenir, de garder et de tracer la valeur numérique d’une charge. Par exemple le pourcentage de CPU utilisé sur un serveur, le nombre de personnes connectées sur une site web, le trafic sortant et entrant sur un switch. Bien souvent, la métrologie permet tout simplement de tracer des graphiques, bien connus dans le domaine du monitoring :

cacti-exemple-monitoring-01

Exemple de graphiques produits par Cacti/Munin (RDDTOOL). ici, aucune indication concernant l’état à l’instant T mais un historique de valeur numériques retraçant l’évolution d’une charge.

La métrologie est donc le fait de récupérer la charge (chiffrée), permettant de tracer son évolution dans le temps. Elle est donc caractérisée non pas par le fait de récupérer une valeur à l’instant T, mais de pouvoir afficher et tracer l’évolution d’une charge, construite par une ensemble de métrique récupérées dans le temps.

La supervision, en revanche, est le fait de récupérer l’état d’un service à l’instant T. la supervision vise à répondre à la question “Le service est-il joignable ?“. Au sens strict du terme, aucune valeur numérique n’entre en compte, et l’aspect historique de charge ne fait donc pas partie de la supervision. L’exemple le plus frappant est Nagios qui, par défaut, ne possède aucune fonctionnalité permettant de tracer des graphiques ou obtenir l’historique de la charge d’un service/serveur. Une “extension” de la supervision porte sur le faite de récupérer une valeur chiffrée comme une charge mémoire et de lui appliquer un seuil d’alerte. Dans ce cas, aucun historique n’est gardé mais l’on est capable d’obtenir et de surveiller non plus des états, mais des valeurs numérique.

nagios-exemple-monitoring-01

Ici, on voit une exemple de la page Nagios rapportant les états de différents services (OK, CRITICAL, etc.)

La supervision se caractérise d’ailleurs aussi par son système d’alerte, conséquence directe de la vision “à l’instant T”. On peut alors avertir l’administrateur si un système passe de UP à DOWN et inversement. Au contraire, dans le concept pure de la métrologie, le système d’alerte n’est pas pris en compte car la récupération des valeurs/charges n’est pas forcément faite à l’instant T.

A l’inverse de Nagios, des solutions comme Munin ou Cacti ne possèdent aucune fonctionnalité permettant de connaître l’état (UP/DOWN) d’un service à l’instant T, mais sont capables de tracer un ensemble de graphiques afin de retracer la charge de différents services/serveurs et de leur ressources.

Et oui ! Munin et Cacti ne sont pas des outils de supervision mais des outils de métrologie ! Cacti permet seulement, grâce à une extension, d’émettre des alertes sur les valeurs numériques récupérées, c’est là toute la différence entre métrologie et supervision !

Avec le temps, supervision et métrologie tendent à complètement se confondre dans les solutions proposées. Ainsi, lorsque l’on cherche à récupérer une information, on parle alors de monitoring. On est maintenant capable d’appliquer de la supervision sur la métrologie, pour faire plus claire, on va appliquer des alertes sur des seuils de charge. Certains produits permettent d’ailleurs de fusionner totalement métrologie et supervision dans le sens ou, si la charge (par exemple CPU) est très différentes de l’historique habituel des 7 derniers jours, alors on envoie une alerte.

D’autres solutions permettent même d’établir une prévision de charge en utilisant les données métriques récupérées (l’historique de charge), puis d’y appliquer un processus de supervision permettant de vérifier si la charge en cours est cohérente avec la charge prévue, alertant l’administrateur en cas de forte différence.

Bref ! Le sujet est vaste et les notions de supervision et métrologie tendent de plus en plus à se confondre. Le terme monitoring quant à lui englobe les deux concepts.

Sélection_005Nombreux sont les informaticiens, même expérimentées, ne faisant pas la distinction, certains croyaient même que je faisait une mauvaise blague lorsque je leur expliquant la différence entre monitoring, supervision et métrologie. Et vous, faites vous la différence entre les concepts de métrologie/supervision ?

GNS3 : port mirroring avec un routeur

$
0
0

I. Présentation

GNS3 est un outil formidable et très efficace pour mettre en place des maquettes systèmes et réseaux dans le cadre de test ou de travaux pratiques. Cependant, il manque une fonctionnalité qui pourrait lui être très utile : les switchs administrables.

Dans le cadre d’une maquette que j’ai voulu mettre en place, j’avais besoin de configurer un port mirroring sur un switch Cisco. Le fait de ne pas pouvoir mettre en place un Switch administrable pour effectuer cela est alors devenu problématique. Il existe néanmoins une astuce pour mettre en place une architecture intégrant du port mirroring avec GNS3, c’est ce que nous allons voir aujourd’hui.

Pour effectuer cela, nous allons ajouter un module de ports FastEthernet sur un routeur afin de lui “greffer” les fonctionnalités de switching recherchés. Voici à quoi ressemblera le schéma final :

gns3-port-mirroring-01Nous avons donc tout en haut une sortie internet représentée par le nuage “C3” qui dans mon contexte me servait à accéder à mon réseau extérieur (mon vrai LAN). Je dispose ensuite de deux machines hôtes que sont “w“, une machine Windows et “Kali“, une machine sous KaliLinux disposant de Wireshark. Enfin, je dispose d’un routeur “R3” qui possède le rôle de passerelle à Internet pour mon LAN et également de Switch pour la liaison entre les postes et le port mirroring.

Concernant les interfaces :

  • R3 – C3 : Interface FastEthernet 0/0 de R3
  • R3 – w : Interface FastEthernet 1/2 de R3
  • R3 – Kali : Interface FastEthernet 1/3 de R3

Concernant l’adresse IP :

  • R3 (WAN) : 192.168.1.101/24
  • R3 (VLAN 2 – LAN) : 192.168.2.250/24
  • w : 192.168.2.70/24
  • Kali : 192.168.2.60/24

Voila, maintenant que les bases sont posées, il est temps de tout expliquer. Je part du principe que votre réseau est relié (câblage fait).

Note : Afin de suivre ce tutoriel correctement, soyez attentifs aux ports dans mon schéma et mes commandes (“f0/0”, “f1/2”, etc) afin de les remplacer par ceux de votre contexte, pas de copier/coller trop hâtifs !

II. Module Switch du routeur

Avant de commencer une quelconque configuration, il faut commencer par ajouter le module “Switch” à notre routeur. En effet, par défaut un routeur ne possède que 2 à 4 ports, ce qui ne nous permet pas forcément de le faire passer pour un switch dans le cadre d’un port mirroring. Nous allons donc faire un clic droit sur notre routeur pour aller dans le menu “Configuration” :

gns3-port-mirroring-02

Ensuite, nous allons dans “R3” qui est le nom de mon routeur dans mon schéma, puis dans “Slots“. Dans “slot1“, nous irons sélectionner “NM-16ESW” pour ensuite cliquer sur “Appliquer“. Ce que nous venons de faire ici, c’est tout simplement insérer un module de ports dans notre routeur, voici à quoi ressemble ce module si nous avions effectué cette opération dans un cadre réel :

gns3-port-mirroring-03

Maintenant que notre routeur dispose d’assez de ports et du module de switch, nous pourrons utiliser une bonne partie des fonctionnalités de switching. Il nous faut maintenant démarrer notre routeur pour passer à la configuration de tout cela !

III. Configuration du routeur

Nous passons maintenant à la configuration de notre routeur. Dans ma maquette, ce routeur effectue donc une mission de passerelle entre mon LAN (192.168.2.0/24) et mon WAN (192.168.1.0/24), il devra également effectuer un NAT en sortie du LAN et enfin, mirrorer (répliquer) tout le trafic entrant ET sortant vers et depuis “w” (ma machine Windows) vers ma machine Kali, ce dernier point étant une fonctionnalité de Switch plus que de routeur.

A. Interface WAN

On commence par le moins important, la configuration du WAN sur l’interface fa0/0, je me contente de configurer une adresse IP puis de paramétrer ma route par défaut :

R3# conf t
R3(config)# interface FastEthernet 0/0
R3(config-if)# ip address 192.168.1.101 255.255.255.0
R3(config-if)# no sh 
R3(config-if)# exit
R3(config)# ip route 0.0.0.0 0.0.0.0 192.168.1.254

Ici, 192.168.1.254 est ma passerelle WAN (ma livebox).

B. VLAN et interfaces LAN

Nous allons maintenant passer à la partie LAN, celle-ci est donc gérée par le module de Switch qui collecte donc ma machine Windows et ma machine KaliLinux. Ici, on doit donc configurer un VLAN et lui affecter une IP, cette IP sera la passerelle du réseau LAN.

Une petite note, dans GNS3, la création d’une VLAN se fait “à l’ancienne”, et non via la méthode que vous avez comme moi apprise en cours. C’est une spécificité du module Switch de GNS3 avec laquelle il faut travailler.

R3# vlan database
R3(vlan)# vlan 5
R2(vlan)# exit

Résultat attendu :

gns3-port-mirroring-04

Notre VLAN est maintenant créée, nous allons pouvoir lui affecter une IP ainsi qu’y mettre les ports voulus. Dans mon cas Fa1/2 et Fa1/3

Note : Étant donné que les ports dédiés au switching se situent sur un module additionnel et ne sont pas intégrés directement au routeur, il faut, pour les configurer préciser “Fa1/XX” et non plus “Fa0/XX”. Le “1” après “Fa” indiquant le numéro de module et les “/XX” le numéro de port dans le module précisé.

On poursuit donc en configurant nos interfaces et notre VLAN :

R3# conf t
R3(config)# interface vlan 5
R3(config-int)# ip address 192.168.2.250 255.255.255.0
R3(config-int)# interface FastEthernet 1/2
R3(config-int)# interface switchport mode access
R3(config-int)# interface switchport access vlan 5
R3(config-int)# interface FastEthernet 1/3
R3(config-int)# interface switchport mode access
R3(config-int)# interface switchport access vlan 5

Voila qui est fait, nos interfaces LAN sont maintenant dans notre VLAN 5 et peuvent à présent pinguer 192.168.2.250 et également se pinguer entre elles. Cela revient à avoir le schéma suivant :

gns3-port-mirroring-05Sauf que dans notre cas, le module Switch est intégré au routeur et nous pouvons le manager, ce qui n’aurait pas été le cas dans le schéma ci-dessus car les switchs dans GNS3 ne sont pas manageables.

IV. Configuration du port mirroring

Passons à la partie la plus intéressante : le port mirroring. Il existe déjà un tutoriel sur cette fonctionnalité sur IT-Connect.fr mais l’intégrer dans un schéma GNS3 est une autre paire de manche étant donné la petite gymnastique à faire due au faite que les switchs ne soient pas manageables. Bref, on enchaîne !

Ici, je veux donc mirrorer ce qui entre et sort du port FastEthernet Fa1/2 vers le port FastEthernet Fa1/3 :

R3(config)# monitor session 1 source interface fa 1/2 both
R3(config)# monitor session 1 destination interface fa1/3

Voila qui est fait, à présent, nous pourrons effectuer par exemple un ping vers l’extérieur et ouvrir un outil d’analyse du trafic sur notre machine KaliLinux pour voir le trafic passer !

Pour plus de précision sur le port mirroring ou pour effectuer cette configuration dans un environnement réel (hors GNS3), je vous oriente vers ce tutoriel sur IT-Connect : Port Mirroring Cisco

Pour pinguer vers l’extérieur, encore faudrait il avoir le routage pour ! Dans le cadre de ma maquette, j’avais à effectuer un NAT de mon LAN sur mon routeur, je vous le met en bonus à la suite. Pour arrêter tout port mirroring, on ajoute “no” devant nos commandes, ce qui est classique sous Cisco :

R3(config)# no monitor session 1 source interface fa 1/2 both
R3(config)# no monitor session 1 destination interface fa1/3

V. Configuration du NAT

Pour effectuer un NAT de mon LAN sur mon routeur qui possède notre petite astuce du module Switch, voici la marche à suivre (rien de très différent par rapport à un contexte normal) :

R3(config)# interface vlan 5
R3(config-int)# ip nat inside
R3(config-int)# interface fa0/0
R3(cofing-int)# ip nat outside
R3(config-int)# exit
R3(config)# access-list 1 permit 192.168.2.0 0.0.0.255
R3(config)# ip nat outside source list 1 interface FastEthernet0/0 overload

La seule spécificité ici est que notre “ip nat inside” est mise directement sur notre vlan 5 qui contient les ports de mon LAN. A nouveau, ce sujet a déjà été traité sur IT-Connect et je vous oriente vers ce tutoriel afin d’effectuer une configuration NAT sous Cisco sur une infrastructure plus standard : Configuration d’un NAT dynamique sur un routeur Cisco

Soyez attentifs ici, pour la commande “access-list…” c’est le wildcard-mask qui est utilisé et le pool IP de mon LAN. pour la commande suivante, on précise l’interface WAN (FastEthernet0/0 dans mon cas).

J’ai eu beaucoup de mal à trouver des informations sur ce type d’infrastructure pour le port mirroring sous GNS3, j’espère donc que ce petit tutoriel vous aura été utile !

Port forwarding sur Fortigate

$
0
0

I. Présentation

Comme ceci est un premier article sur la gamme de produits Fortigate, je vais vous parler un peu du produit. Le Fortigate (de la compagnie Fortinet) est un UTM (Unified Threat Management) ou en français, Gestion unifiée des menaces.

Mais c’est quoi ça? Ok, alors je vais être plus précis, un UTM rassemble dans un boitier (Appliance) ou une machine virtuelle plusieurs fonctions reliées à la sécurité. Avec en général les fonctions suivantes :

– Pare-feu (Firewall)
– Filtrage antipourriel (antispam)
– Antivirus
– Système de détection ou de prévention d’intrusion (IDS ou IPS)
– Filtrage de contenu applicatif (filtrage URL)
– VPN (SSL ou IPSEC)

fortigate-redirction-img

Il existe plusieurs compagnies qui fabriquent des UTM et c’est très populaire, surtout auprès des petites et moyennes entreprises.

La compagne Fortinet est classée parmi les leaders de l’industrie depuis plusieurs années consécutives par Gartner dans la catégorie UTM.

fortigate-redirction-1

II. Autres produits

Hormis les Fortigate que la compagnie construit, Fortinet possède aussi d’autres produits. Les plus populaires sont bien le Fortigate, mais aussi le FortiMail qui est l’antispam et le Fortimanager qui permet de gérer nos équipements. À noter aussi qu’il existe un client gratuit, le Forticlient qui nous sert de client VPN, firewall et antivirus.

Il est à noter que tous les Fortigate utilisent le même système d’exploitation (FortiOS) mais seul le CPU, la mémoire ou l’espace disque changent.

Le prix du produit commence à environ 338 $ US pour un Fortigate 30 D à plus de 100 000 $US pour les modèles très haut de gamme (Fortigate 5101C). Le prix varie aussi selon le temps de support, etc.

L’achat d’un Fortigate se fait à travers un revendeur que l’on peut trouver sur cette page : ici

III. Infrastructure

Aujourd’hui je voudrais vous présenter la façon de faire une redirection de port (ou port following) afin de permet la publication d’un serveur (WEB, d’email, FTP, etc..) derrière un Fortigate.
Dans cette présentation, je vais faire la publication d’un serveur d’email (port 25) afin de recevoir des emails de l’extérieur.

fortigate-redirction-2

Attention l’adresse IP 175.20.20.15 est fictive.

IV. Configuration du serveur

Pour faire ceci, il bien sûr se connecter sur notre Fortigate via l’interface web de gestion.

fortigate-redirction-3

La première étape va être de déclarer l’adresse IP de notre serveur interne (serveur d’email)

Sur le Fortigate, aller dans l’onglet Firewall objets et création d’une IP virtuelle :

fortigate-redirction-4

Cliquez sur “Create new”

fortigate-redirction-8

Puis nous donnons l’adresse IP publique redirigée vers le serveur d’email avec le port externe et le port vers l’interne (dans ce cas, le port 25 externe vers le port 25 vers l’interne)

Le nom de notre nouvelle adresse IP virtuelle va nous servir à la création de la règle de pare-feu.

fortigate-redirction-5

Ce qui nous donne ceci comme résultat :

fortigate-redirction-6

Une fois l’adresse IP virtuelle créée, la seconde étape va être de créer une règle de pare-feu (firewall) pour autoriser le trafic.

Pour ceci, allez dans la partie de droite, policy – règles et création d’une nouvelle règle.

fortigate-redirction-7

Comme la règle ne concerne pas les VPN, nous choisissons Pare-feu

C’est une règle d’adresse IP seulement, il n’y a pas d’identification, nous choisissons “Adresse”. La règle permet la communication de l’extérieur, donc nous choisissons le port relié à Internet (port WAN1 dans notre cas)

Vers le port ou est relier notre serveur d’email (dans notre cas le port 2) avec comme adresse de destination, le nom de notre adresse IP virtuelle

– Le service concerné (SMTP pour les emails entrant).

– Et bien sûr autoriser le trafic (accept) puisque c’est l’action désirée.

– Surtout ne pas activer le NAT.

fortigate-redirction-9

Le reste de la configuration est l’activation des Logs (si désiré) et l’activation de l’antivirus et de l’antispam. Mais ses options seront vu dans un prochain article.

V. Conclusion

Voilà notre serveur d’email est publié sur Internet et prêt à recevoir ses premiers courriels. Il ne vous reste plus qu’à tester le tout par l’envoi d’un email de l’extérieur vers notre serveur interne. En cas d’erreur, il faudra aller voir les logs, mais cela fera partie d’un autre tutoriel.

Viewing all 138 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>