Comment surveiller les fichiers sur votre serveur linux

Vous allez voir l'une des bases de la sécurité pour la gestion de vos applications web. La surveillance de la modification de vos fichiers. En effet si vous avez un site en production les modifications des fichiers sources seront peu nombreuses. Et s'il y en a il vous sera simple de faire la distinction entre votre travail et une mise à jour de plugin que vous avez effectuée. Vous allez voir comment en 5 minutes mettre en place cette surveillance. Vous aurez une surveillance basique, mais oh combien efficace.

De quoi avez-vous besoin ?

Je vous rassure tout de suite pas besoin de savoir programmer, ni de passer des heures sur votre terminal. Vous allez avoir besoin d'un client SSH (putty sous Windows), d'une boite e-mail pour recevoir les alertes et c'est tout !

Eh oui, car cette méthode est native sur les distributions linux vous n'aurez donc pas besoin d'installer la moindre librairie supplémentaire.

Avec quoi va être mise en place la surveillance ?

Avant de vous donner les lignes à copier/coller je vais expliquer ce que vous allez faire. Sur votre serveur vous allez créer un script bash (qui est tout simplement un fichier avec l'extension .sh). Le script va contenir la commande linux qui va être utilisée pour faire la liste des fichiers modifiés.

Une fois le fichier en place il suffira de rajouter une règle sur votre serveur pour que le script soit lancé périodiquement.

Version ultra simple du script

Pour vous organiser un peu je vous conseille de créer un répertoire "scripts" à la racine de root :

mkdir /root/scripts

Dans ce répertoire nous allons créer nos fichiers qui vont être un script bash et un fichier txt. Le fichier txt va servir pour l'envoi par e-mail. Créons tout d'abord notre fichier txt :

touch /root/scripts/liste-fichiers-modifies.txt

Voilà chose faite ensuite créons notre script pour pouvoir le modifier et insérer les commandes nécessaires :

nano /root/scripts/monitoring_www.sh

L'éditeur nano va s'ouvrir si vous avez l'habitude avec un autre utilisez le, cela n'a pas la moindre importance. Vous allez donc pouvoir copier les lignes suivantes dans le fichier et le sauvegarder, je vous explique juste après leurs significations :

#!/bin/bash
#
echo -e "----------------------------------------------------------
Programme de surveillance des fichiers PHP, HTML & JS
v 2.0
contact : https://www.kanjian.fr
---------------------------------------------------------- "

Subject="[SRV-001] Rapport surveillance des fichiers : php, html, js, conf, htaccess"

find /var/www/ -name -ls -o -regex '.*.(php|htaccess|conf|html|js).*' -mtime 0 | xargs ls -lah > liste-fichiers-modifies.txt

mail -s "$Subject" "inazo@example.com" < liste-fichiers-modifies.txt

Explication des lignes principales :

#!/bin/bash :
Cette ligne sert au serveur pour savoir quel langage est utilisé dans le script, plus précisément quel shell il va utiliser. Je vous invite à lire la page wikipédia sur les shells linux.

Subject="[SRV-001] Rapport surveillance des fichiers : php, html, js, conf, htaccess" :
Cette ligne définit l'objet de l'e-mail qui sera envoyé comme rapport à la fin du script.

find /var/www/ -name -ls -o -regex '.*.(php|htaccess|conf|html|js).*' -mtime 0 | xargs ls -lah > liste-fichiers-modifies.txt :
Cette avant-dernière ligne est la plus complexe. La commande find va aller chercher tous les fichiers qui se trouvent dans le répertoire "/var/www/" ainsi que ces sous-répertoires. L'option "-regex" de la commande va préciser que nous ne souhaitons que les fichiers qui comportent dans leurs noms l'un des éléments suivants :

  • .htaccess
  • .php
  • .conf
  • .html
  • .js

On précise par la suite avec l'option "-mtime 0" que l'on veut les fichiers dont la modification remonte au plus tard il y a 24 H. L'option "-name" demande la recherche sur le nom des fichiers, "-ls" d'échapper certain caractères gênant comme les espaces.

Find va afficher une liste de fichier modifié, s'il en trouve, mais nous avons besoin de renvoyer cette liste dans notre fichier texte. Tout ce que va retourner la commande find va être envoyée à "xargs" via le "|". Xargs va exécuter la commande "ls -lah" pour chaque fichier donné et renvoyer l'affichage de "ls" vers notre fichier texte.

mail -s "$Subject" "inazo@example.com" < liste-fichiers-modifies.txt :
Et cette toute dernière va envoyer un e-mail à inazo@example.com avec pour sujet ce que l'on a défini plus haut et pour contenu celui de notre fichier texte.

N'oubliez pas de rendre le script exécutable via la commande : 

chmod +x /root/scripts/monitoring_www.sh

Vous pouvez maintenant le testé en l'exécutant via la commande : 

sh /root/scripts/monitoring_www.sh

Pour aller plus loin :

Ce que je vous conseille si vous avez des systèmes de cache sur vos sites c'est de les exclure de la recherche de find. Pour ce faire il faut ajouter des paths d'exclusions, en voici un exemple :

! -path "*/wp-content/cache/wp-rocket/*"

Ce rajout va demander de ne pas lister les fichiers dont le chemin contient "/wp-content/cache/wp-rocket/", et cela quel que soit le site en question. Ce qui donne la commande modifiée :

find /var/www/ -name -ls -o -regex '.*.(php|htaccess|conf|html|js).*' ! -path "*/wp-content/cache/wp-rocket/*" -mtime 0 | xargs ls -lah > liste-fichiers-modifies.txt

Vous pouvez bien sûr en ajouter autant que vous souhaitez. J'en ai souvent 5 ou 6 d'ailleurs en fonction des serveurs.

Voici un exemple ce que vous recevrez par e-mail :

-rw-r--r-- 1 user group 1177 21 déc. 09:52 /var/www/wp-content/plugins/wordpress-seo/admin/import/class-import-wpseo-hooks.php
-rw-r--r-- 1 user group 38 21 déc. 09:52 /var/www/wp-content/plugins/wordpress-seo/admin/index.php
-rw-r--r-- 1 user group 1544 21 déc. 09:52 /var/www/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-add-keyword-tab.php
-rw-r--r-- 1 user group 903 21 déc. 09:52 /var/www/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-addon-section.php

Planification du lancement du script 

Il ne vous reste plus cas planifier le lancement du script via crontab. L'idée est de le lancer régulièrement, mais attention selon la taille de votre serveur et des sites installés ça peut demander quelques ressources serveur. Une exécution toutes les 2/3 heures me semble un bon compromis et n'hésitez pas à mettre beaucoup moins si vous avez une application sensible.

D'ailleurs si c'est le cas il vaut mieux avoir un script dédié à la surveillance de cette application sensible. Vous pouvez reprendre le script plus haut avec une modification sur le chemin du find.

Voilà ce que vous devez rajouter dans votre crontab pour que le script se lance toutes les 2 heures : 

0 */2 * * * sh /root/scripts/monitoring_www.sh > /dev/null 2>&1

Conclusion

Voilà dorénavant vous serez avertie par e-mail de la modification de fichier sur votre serveur. Pour la petite histoire ce bout de code que j'utilise sur certain de mes serveurs m'a sauvé la mise un certain nombre de fois. Il vous permettra, comme à moi, de détecter un début d'attaque et de réagir rapidement pour l'endiguer. 

Ce n'est qu'une base, mais les évolutions restent large est intéressante, j'en ai d'ailleurs une ribambelle en tête.

Source sur gitHub : https://github.com/inaz0/simple_server_monitor
Crédit photo : Designed by Freepik