Aller au contenu principal

Présentation des outils

Comme beaucoup de monde, je passe pas mal de temps à chercher la solution de monitoring idéale. Il faut dire que la liste des solutions est longue. En ce moment, je teste le combo Telegraf pour générer les données (charge, disque, mémoire, etc.) et InfluxDB, pour les stocker. C’est un choix temporaire.

Ces deux outils sont écrits par la même société, et sont distribués sous une licence libre. Leurs installations sont assez similaires : télécharger les fichiers .deb ou .rpm disponibles sur les sites, et les installer à la main.

Installation d’un serveur InfluxDB

Si vous êtes sur une distribution debian sid, vous pouvez installer directement la version sid d’InfluxDB. C’est mieux, parce qu’ainsi l’arborescence standard sera respectée :

  • utilisation par défaut du répertoire /var/lib/influxdb au lieu /var/opt/influxdb
  • fichier de configuration dans /etc/influx/ au lieu /etc/opt/influxdb

Le seul inconvénient, c’est que vous aurez une version plus ancienne d’InfluxDB (0.9.2), qui vous obligera à installer une version plus ancienne de Telegraf (0.1.4).

Concernant la configuration d’InfluxDB, il faudra prendre garde aux directives :

  • reporting-disabled à mettre à true (pas utile pour la version empaquetée par Debian ;
  • les trois bind-address à écrire sous la forme 127.0.0.1:port si vous ne souhaitez pas exposer votre serveur InfluxDB aux connexions distantes en TCP ;

Il faut ensuite créer une base et un utilisateur dédiés à Telegraf. On lance la commande influx (ou /opt/influxdb/influx si vous avez installé le paquet à la main), qui va se connecter au serveur InfluxDB. La création d’une base, et d’un utilisateur avec les permission d’accéder à cette base se déroule comme suit :

> CREATE DATABASE TelegrafDB;
> CREATE USER TelegraphUser WITH PASSWORD 'PasswordSuperDurADeviner';
> GRANT ALL ON TelegrafDB TO TelegraphUser;
> SHOW DATABASES ;
name: databases
---------------
TelegrafDB
> SHOW USERS ;
TelegraphUser   false

Les deux dernières instructions servent à vérifier que tout c’est bien passé parce que, par défaut, le client influx n’est pas très bavard. Je vous ai mâché le travail, mais tout cela est assez bien documenté.

Installation de Telegraf

Ensuite il faut installer Telegraf, cette fois-ci uniquement via un fichier dev ou rpm récupérable sur le site, et le configurer pour qu’il puisse se connecter au serveur InfluxDB. Le fichier /etc/opt/telegraf/telegraf.conf est assez explicite, je n’ai pas besoin d’entrer dans le détail, mais voici quelques points à noter:

  • vous pouvez définir précisément les interfaces réseau dont vous souhaitez récupérer les informations;
  • idem pour les disques durs;

Il est possible aussi d’y activer des plugins pour récupérer des statistiques sur certains logiciels, grâce à des plugins. Ces plugins sont fournis avec Telegraf. La documentation de chaque plugins est lisible dans leur code source, dans la variable sampleConfig. Voir un exemple pour Memcached.

Après un redémarrage de Telegraf, la base InfluxDB créée précédemment va commencer à se peupler.

Au bout de quelques minutes vous pourrez vérifier cela avec les commandes suivantes, à exécuter dans le client InfluxDB :

> USE TelegrafDB
> SHOW SERIES
> SHOW MEASUREMENTS
> SELECT value FROM mem_free
> SELECT value FROM net_bytes_sent
> SELECT mean(value) FROM mem_free WHERE time > now() - 1h GROUP BY time(1m)

Vous pouvez aussi explorer vos données en faisant pointer votre navigateur sur le port 8083 de la machine qui héberge votre serveur InfluxDB. Dans les cas deux, cela n’est que du texte. Pour afficher des jolis graphes, il va falloir utiliser un autre outil, et c’est à ce moment que Grafana entre en jeu.

Grafana

L’installation de Grafana se déroule avec un dpkg -i sur le fichier téléchargé sur le site du projet. Par défaut Grafana n’est pas lancé, et ne se lancera pas automatiquement au démarrage de l’ordinateur.

La configuration s’effectue dans le fichier /etc/grafana/grafana.ini. Pour ma part, j’ai modifié :

  • reporting_enabled = false
  • les directives admin_user et admin_password
  • les directives allow_*

Au premier lancement, Grafana va créer et remplir sa base de données de configuration (par défaut dans un fichier Sqlite dans /var/lib/grafana) et créer le premiers utilisateur (que vous avez défini dans le fichier de configuration). Conséquence rigolote : il ne sert à rien de modifier les identifiants de l’administrateur dans le fichier de configuration après le premier démarrage ; ce fichier ne sera plus utilisé pour l’authentification.

En ouvrant votre navigateur sur l’url http://127.0.0.1:3000/ vous pourrez entrer les coordonnées de l’administrateur que vous avez défini dans le fichier de configuration, et vous tomberez alors sur une magnifique page vide. C’est là que les choses deviennent intéressantes.

En cliquant sur la petite icone Grafana en haut à gauche, vous allez ouvrir un menu latéral. La deuxième ligne de ce menu s’appelle «Data Sources». En cliquant dessus, vous allez entrer dans la configuration des sources des données. De là, en cliquant sur le bouton «Add New», dans le menu horizontal du haut, vous allez pouvoir créer votre première source de données, qui sera la base Telegraf du serveur InfluxDB.

Capture du formulaire pour créer une nouvelle «datasource»

Le formulaire de création de cette source de données est assez simple lorsqu’on vient de créer sa base Telegraf quelques minutes plus tôt:

  • l’url de connexion (ne ce serait pas http://127.0.0.1:8086/ ?)
  • le nom de la base
  • l’utilisateur et le mot de passe de l’utilisateur à la base

En cas de doute, consulter le fichier /etc/opt/telegraf/telegraf.conf pour retrouver les identifiants utilisés pour se connecter à la base qui stocke vos données. Une fois la connexion ajoutée, vous pouvez la tester.

Maintenant, créons notre premier tableau de bord. Dans le menu vertical de gauche, cliquons sur Dashboard. Cela affiche la «Home», et surtout le menu Dashboard dans le haut de la page. En cliquant sur «Home» cela ouvre la liste (vide) des Dashboards. En bas de la liste, vous avez «+New» d’afficher. C’est là qu’il faut cliquer.

Le bouton caché pour créer un nouveau tableau de bord

Cela nous affiche un nouvel écran, vide, mais différemment vide. Il y a une barre assez fine, vert fluo tout à gauche.

Petite barre cliquable

C’est encore là qu’il faut cliquer. Vous pouvez aller dans «Add Panel > Graph», et…

Le menu caché

… vous avez un superbe graphe qui s’affiche !

C’est joli, pour faire joli

Ne vous réjouissez pas trop vite car les données de ce graphe n’a aucun sens. Il s’agit juste de vous montrer que vous êtes sur la bonne voie. En cliquant sur le titre «no title» du graphe, un menu apparait. Dans ce menu, il faut cliquer sur «edit».

Un autre menu caché

Courage, vous êtes déjà sur l’onglet «Metrics», vous êtes presque! En bas à droite, il faut choisir la Datasource que vous avez ajouté auparavant.

Vous tombez alors sur une requête prédéfinie. Il faut clique sur la partie «From» pour choisir la bonne données à afficher. Dans mon cas, j’ai choisi system_load1.

Votre premier graphe dans Grafana

Cette fois, vous y êtes : vous venez d’afficher dans Grafana les premières données issues d’InfluxDB !

Je vous laisse continuer tout seul. Vous pouvez faire, à partir de là:

  • afficher plusieurs données sur le même graphe (bouton «Add Query»);
  • créer d’autres panneaux, avec d’autres graphes contenant d’autres données;
  • changer le style des graphes.

En quelques minutes vous pourrez afficher un petit tableau bord avec la charge serveur, l’espace disque, l’occupation mémoire et le trafic réseau.

Premier tableau de bord

Limitations

Ceci était une première expérimentation avec le couple InfluxDB + Telegraf pour générer des statistiques, et l’outil Grafana pour afficher les statistiques récoltées.

À partir de là deux pistes restent à explorer. En premier on pourrait vouloir découvrir plus finement les options de configuration d’InfluxDB (la durée de stockage des données), et de Telegraf (utilisation de ses plugins).

Telegraf reste un projet récent, et manque encore de maturité. Par exemple, les statistiques sur les entrées sont stockées en quantité totale, et non pas en quantité par seconde, informations fournies par d’autres outils en ligne de commande comme iotop ou iostat.

Grafana, quant à lui, demande un petit temps d’adaptation. L’objectif de cet article est de faciliter sa prise en main. Mais ensuite il est assez facile à utiliser.

Il existe d’autres outils pour afficher des statistiques. Facette est l’un d’entre eux. Malheureusement Facette n’est pas encore adapté au dernier format des données InfluxDB. Donc la comparaison entre Facette et Grafana, ce sera pour une autre fois.

Soit une machine, par exemple liée à une application web de type réseau social, chargée d’envoyer des courriers électroniques. Il existe différents types de courriers dans notre application. Exemple :

  • les courriers d’inscriptions;
  • les courriers de notifications («vous avez un nouveau contact»);
  • les courriers d’invitations.

Plusieurs milliers courriers d’invitations peuvent être envoyés d’un seul coup (de nos jours, les gens ont beaucoup de contacts). Le traitement de ces milliers de courrier ne doit pas bloquer un courrier de confirmation d’inscription, qui doit être reçu quelques secondes après que l’utilisateur se soit inscrit sur le site.

C’est pour cela que chaque type de courrier va être envoyé à un serveurs SMTP dédié, chez un prestataire externe, qui est chargé de délivrer le courrier à son destinataire final. Mais en local, sur notre serveur, il est nécessaire aussi de paralléliser l’envoi des courriers.

Comme notre serveur utilise [Postfixhttp://www.postfix.org] pour relayer les courriers, nous allons utiliser la fonctionnalité [MULTI_INSTANCEhttp://www.postfix.org/MULTI_INSTAN...] de Postfix, pour pouvoir disposer en local de différentes instance de Postfix, qui fonctionneront en parallèle, chacune possédant sa propre queues.

Postfix est déjà installé et configuré sur notre serveur. Cette configuration sera dédiée à l’envoi des mails depuis la machine (via la commmande sendmail). Pour installer des nouvelles instances il faut lancer :

postmulti -e init

Cette commande ajoute deux lignes dans les fichiers main.cf :

multi_instance_wrapper = ${command_directory}/postmulti -p --
multi_instance_enable = yes

Ensuite on créé la première instance supplémentaire :

postmulti -I postfix-1 -G secondary -e create

Les arguments de la commande sont :

  • -I: nom de l’instance; c’est aussi le répertoire
  • -G: le groupe de l’instance; il sera possible d’effectuer des opérations sur toutes les instances d’un groupe.

Cette commande:

  1. crée des fichiers master.cf et main.cf dans le répertoire /etc/postfix-1;
  2. rajoute la directives multi_instance_directories dans le fichiet /etc/postfix/main.cf; cette clé contient le répertoire de configuration de la nouvelle instance (/etc/postfix-1 donc);
  3. crée sur le serveurs tous les fichiers nécessaires à Postfix pour gérer cette deuxième instance; en particulier dans le répertoires /var/lib/postfix-1 et /var/spool/postfix-1.

C’est le moment d’aller modifier les fichiers nouvellement créés, main.cf et master.cf, du répertoire de configuration de la nouvelle instance pour personnaliser les paramètres de la nouvelle instance selon vos souhaits.

Dans mon cas, je souhaite que la nouvelle instance écoute sur le port 10025 au lieu du port 25. Il faut donc ajouter la ligne suivante dans le fichier main.cf :

# À la place de 'smtp      inet  n       -       -       -        -      smtpd'
127.0.0.1:10025     inet  n       -       n       -       -       smtpd

Dans ma situation, j’ai aussi modifié le fichier main.cf pour envoyer les courriers au bon serveur SMTP.

Pour démarrer la nouvelle instance, la commande à lancer est :

postmulti -i postfix-1 -p start

Sous Debian (et Ubuntu), vous aurez un mesasge d’erreur indiquant que le fichier dynamicmaps.cf est manquant. Cela se résout simplement avec un lien symbolique :

ln -s /etc/postfix/dynamicmaps.cf /etc/postfix-1/

Pour pourrez créer autant d’instance Postfix que nécessaire à vos besoins.

Pour tester la configuration de chaque nouvelle instance, les commandes habituelles de Postfix sont disponibles. Il faut seulement leur passer en argument le répertoire de configuration de l’instance à tester, avec l’option -c ou -C en fonction de la commande :

mailq -C /etc/postfix-1
sendmail -C /etc/postfix-1
postsuper -c /etc/postfix-1
postconf -c /etc/postfix-1
postqueue -f -c /etc/postfix-1

Les dernières commandes à connaître pour manipuler une instance sont assez simple à retenir :

postmulti -i postfix-1 -p stop
postmulti -i postfix-1 -e disable
postmulti -i postfix-1 -e destroy

À noter qu’il est possible de lancer ces instructions à un groupe d’instance, en utilisant l’option -g suivi d’un nom du groupe, au lieu de l’option -i et du nom de l’isntance.

Toutes les commandes et toutes leurs options sont détaillées dans la page manuelle de la configuration Multi-instances.

Par définition, la version Sid de la distribution Debian n’est pas stable. Sa mise à jour peut provoquer quelques difficultés et nécessite d’avoir du temps devant soit.

Or de nos jours, les mises à jour sécurités sont presque quotidiennes. Heureusement il existe un outil, debsecan, qui permet de ne mettre à jour que les paquets qui corrigent des failles de sécurité.

Une fois ce paquet installée, la ligne de commande magique est la suivante :

aptitude install $(debsecan --suite sid --only-fixed --format packages)

Pour les personnes sous Ubuntu et Debian, même avec un shell bash encore vulnérable, c’est le shell dash qui est utilisé par défaut pour les appels systèmes. Ceci permet de réduire grandement le périmètre des attaques potentielles.

Pour vérifier que dash est bien le shell par défaut, la commande ls -l /bin/sh devrait afficher /bin/sh -> dash. Si c’est /bin/sh -> bash qui s’affiche, il faut alors installer dash et répondre positivement à la question «Use dash as the default system shell (/bin/sh)?».

Si dash est déjà installé mais qu’il n’est pas le shell par défaut, alors lancer dpkg-reconfigure dash pour effectuer le changement de shell par défaut.

You are using emacs and you want to write text or code with nice little characters like: «♥∫♬‡☮✭∏ψ♻ℵ»? So this post is for you. The other 99.999% of the population can pass their way with no regret.

First learn a little bit about Abbrev in the emacs manual. Then download this file. At least edit the abbrev-table with M-x edit-abbrevs and insert the downloaded file, under the (global-abbrev-table) line.

That’s it! Now you can type in all the symbols presents on the following pages (thanks to their respective authors):

Each symbol is accessible with its name, following by an 0. So you can easily write alpha and α in the same phrase.

PS: Some characters are useless for me, because I can get them directly with my keyboard, configured as an international layout. I keep them because the file is generated automatically.

PermitRootLogin no PasswordAuthentication no AllowUsers admin etc…

En gros:

  • je désactive l’envoi de session X11;
  • je désactive l’authentification par mot de passe - seul la connexion par clé reste possible;
  • j’explicite précisément les utilisateurs autorisés à se connecter.

6. Désactiver l’affichage des versions des logiciels

Bon, je sais, la sécurité par l’obscurité c’est pas bien. Mais mon côté parano me dit que cela ne peut pas faire de mal non plus. Ce n’est pas la peine de tendre le bâton pour être battu, même si une personne motivée trouvera un bâton de toute façon.

Apache

Dans le fichier conf.d/security j’active les balises suivantes:

ServerTokens Prod
ServerSignature Off

Sshd: deuxième partie de la configuration du démon ssh

Les dernières version de ssh permettent d’éviter l’affichage de la version de debian par le démon ssh. Il suffit pour cela d’ajouter la directive suivante:

DebianBanner no

7. En vrac: configuration des logiciels

Ensuite je configure un certains nombres de logiciels dont la configuration par défaut ne me convient pas.

Par exemple screen:

$ cat /etc/screenrc
escape ^Oo

Je choisis aussi emacs comme éditeur par défaut: update-alternatives --config editor.

8. Desinstaller portmap

Qui utilise encore NFS? Pas moi.

9. S’inscrire à la liste de debian sécurité

Si cela n’est pas encore fait, c’est le moment de s’inscrire à la liste debian security announce.

S’inscrire aussi sur les listes de chaque logiciel installé manuellement, spécialement les logiciels web.

10. Vérification nmap

Dans le doute, on vérifie une nouvelle fois que la maison est bien fermée à clé:

nmap -sT my-server
nmap -sU my-server

Foaf est une spécification XML permettant de décrire une personne (nom, prénom, email, etc.), et ses connaissances. C’est en quelque sort le web social 2.0 standardisé - comprendre utilisé uniquement par les geeks rêvant d’un monde ouvert, interopérable et conforme que personnes d’autres n’utilisent. J’en fais partie. Il me fallait donc un fichier foaf.

Après avoir parcouru les outils disponibles pour générer un fichier Foaf, j’ai jeté mon dévolu sur Morla, aux fonctionnalité attrayantes. Hélas, à cause de l’éternel problème de licence SSL non compatible avec la licence GPL, Morla n’est pas dans Debian. Et j’ai passé l’âge, mes machines surtout, de compiler moi même des logiciels.

Je me résigne à installer java pour utiliser foafme. Hélas, encore une fois, le fichier généré est ridiculement maigre d’informations. Finalement j’utilise deux outils en ligne, foafdrive et foaf-a-matic, à base de javascript, dont je compile les résultats pour obtenir la première mouture d’un fichier acceptable.

Ensuite je m’inspire d’autres fichiers trouvé sur le web pour ajouter des informations supplémentaires:

  • des dc:title un peu partout;
  • un élément vCard:ADR
  • des foaf:pastProject
  • et des foaf:currentProject

Pour finir je vérifie que mon fichier foaf est bien valide.

Prochaine étape: ajouter des contacts, en utilisant l’export foaf de Facebook.

public function __construct($options = array(), $messages = array()) { parent::__construct(array_merge($options, array('trim' => true)), $messages); } public function doClean($value) { $i = 0; $emails = explode(" ", $value); $validator = new sfValidatorEmail($this->options, $this->messages); $cleaned_emails = array(); try { foreach ($emails as $email) { ++$i; $cleaned_emails[] = $validator->clean($email); } } catch (Exception $e) { throw new sfValidatorError($this, 'invalid', array('line' => $i, 'bad_email' => $email)); } return implode(" ",$cleaned_emails); } }

Les premiers fichiers du projet Libre Entreprise Mediawiki Skin viennent d’être mis en ligne. Ce modeste projet fournit un thème, une apparence, pour les sites réalisés avec le célèbre Mediawiki. Le thème fourni est celui des trois sites du réseau Libre Entreprise.

Les objectifs de ce thème étaient :

  • Être totalement différent du thème par défaut de Mediawiki, pour que l’utilisation du logiciel mediawiki ne soit pas manifeste ;
  • Simplifier, voire supprimer, la boîte à outil, trop complexe, contenant des liens inutiles pour la plupart des sites ;
  • Simplifier et alléger de la même façon le contenu du pied de page ;
  • Être lisible sur un eeepc 701, sans défilement horizontal, ou presque.

La documentation pour utiliser et configurer le thème est disponible en ligne.

Il est courant qu’un formulaire web nécessite des validateurs dynamiques, c’est à dire dépendant de certaines valeurs du formulaire lui même. Dans une des applications que j’ai écrite récemment une case à côcher permet à l’utilisateur de tester le formulaire et de ne pas enclencher l’action normale. Ainsi lorsque cette case à côcher est validée, un champs du formulaires n’est plus obligatoire, et un autre le devient.

Pour résoudre ce problème, une des solutions connue consiste à surcharger la méthode bind de la classe du formulaire, dérivée de sfForm, et de changer à la volée les validateurs.

Pour ma part je préfère exécuter ce changement dynamique de validateur dans le preValidator. Voici ce que cela donne:

 public function configure()
 {
   [...]
   $this->validatorSchema->setPreValidator(
     new sfValidatorCallback (
       array('callback' => array($this, 'isTest'))));
 }
 public function isTest($validator, $values)
 {
   if (isset($values'is_test')) {
     $this->validatorSchema['email_recipients']->addOption('required', false);
     $this->validatorSchema['test_recipient']->addOption('required', true);
   } else {
     $this->validatorSchema['email_recipients']->addOption('required', true);
     $this->validatorSchema['test_recipient']->addOption('required', false);
   }
   return $values;
 }

Le code est plus facile à maintenir: tout ce qui concerne la validation s’exécute uniquement dans des validateurs, sans passer par une méthode, bind qui n’a rien à voir avec ce processus.