Sécurité Web · 8 min read · Jan 04, 2026
Présentation de Remo - Une manière simple de sécuriser une application en ligne non sécurisée avec ModSecurity
Présentation de Remo - Une manière simple de sécuriser une application en ligne non sécurisée avec ModSecurity
Disons que vous avez une application désagréable sur votre serveur web Apache qui a été installée par des idiots du département marketing et que vous ne pouvez ni la corriger ni la supprimer. Peut-être est-ce un problème de ressources, un manque de savoir-faire, un manque de code source, ou peut-être même pour des raisons politiques. Par conséquent, vous devez la protéger sans y toucher. Il y a ModSecurity, mais on dit que c’est seulement pour les experts. Une alternative simple est Remo, un éditeur de règles graphique pour ModSecurity qui adopte une approche de liste blanche. Il a tout ce dont vous avez besoin pour verrouiller l’application.
Pour les besoins de ce tutoriel, nous allons utiliser une application de test vraiment simple. Une qui est si laide que même votre département marketing ne voudrait pas l’avoir autour. Mais bon, c’est juste un tutoriel.
';
echo $_POST['command'];
echo '
';
system($_POST['command'], $retval); # nécessaire pour les commandes 'ls'
echo '';
echo 'Return value: ' . $retval; echo '
'; echo ''; ?>
ls.php: Un petit script que vous feriez mieux de retirer de votre site tant que vous le pouvez.L’exécution directe de toute commande shell postée sous forme de paramètre de commande rend ls.php un invité indésirable sur presque tous les serveurs web - ou un cas de test parfait pour essayer Remo afin de vous protéger des dangers de ce script. Alors, qu’est-ce que Remo ? Sur remo.netnea.com, vous apprendrez qu’il est conçu comme un moyen simple de configurer ModSecurity sans devenir d’abord un expert en sécurité. Le deuxième point est que Remo écrit des règles de liste blanche, tandis que la plupart des gens utilisent ModSecurity avec une approche de liste noire. La liste noire signifie que vous dites à ModSecurity tout sur toutes les attaques connues. La liste blanche fait le contraire : elle s’assure que votre application ne recevra que les entrées que vous souhaitez vraiment qu’elle reçoive. Ainsi, ls.php ne recevra que des commandes ls comme paramètre de commande et de plus, vous vous assurerez qu’aucune astuce sale n’est possible en utilisant des backticks et des points-virgules dans le paramètre. Pour faire court : Remo aide à faire la validation des entrées sur le serveur sans toucher à l’application.
Installation
Vous pouvez essayer Remo dans la démo en ligne sur la page d’accueil. Celle-ci fonctionne bien lorsque vous souhaitez essayer Remo sans l’installer d’abord. L’installation n’est pas très difficile non plus, même sans paquets de distribution prêts à jour. Assurez-vous d’avoir ruby, irb et les liaisons ruby-sqlite3 installés avant de télécharger.
J’ai fait ce qui suit sur ma boîte de test Ubuntu ; cela devrait fonctionner pour Debian aussi :
aptitude install ruby irb libsqlite3-ruby1.8En ce qui concerne Remo, vous pouvez soit télécharger une version, soit prendre un instantané du dernier arbre subversion. La page de téléchargement de Remo vous indique quels arbres ont passé tous les tests unitaires. Disons que nous téléchargeons et installons une version. Allez sur la page de téléchargement et récupérez la version bêta 0.2.0. Décompressez l’archive tar et lancez le serveur WEBrick rails. Depuis la ligne de commande, cela se résume à :
wget http://remo.netnea.com/files/remo-0.2.0.tar.gz
tar xvzf remo-0.2.0.tar.gz
cd remo-0.2.0
ruby script/server
direct browser to http://localhost:3000/main/indexVous devriez obtenir quelque chose comme ça :

Remo tel qu'il apparaît après l'installation.Nous sommes un peu pressés ici, car ce tutoriel est censé être bref. Donc, je ne vais vous montrer que les choses nécessaires pour sécuriser l’application de test. Une sorte de guide pratique. Vous aurez tout le temps d’explorer Remo par vous-même.
Sécurisation de l’application
Supprimez toutes les requêtes par défaut dans la fenêtre et créez une nouvelle requête.

Ajout d'une nouvelle requête à Remo.Cliquez sur le texte cliquable pour modifier et entrez le chemin de votre application : /ls.php, puis changez la méthode http en POST. Ouvrez les détails de la requête et ajoutez un nouveau paramètre post en utilisant le bouton p* à côté des paramètres post. Cliquez sur le nom (cliquez pour modifier) et faites-le passer à command. C’est le paramètre soumis par notre application exemple ls.php.
À droite du nom se trouve le domaine de valeur du paramètre. C’est la partie centrale de Remo. Ici, vous définissez quelles valeurs sont acceptables pour le paramètre. N’oubliez pas, il s’agit de liste blanche : nous définissons exactement ce qui est acceptable. Il y a quelques valeurs prédéfinies, mais nous devrons opter pour Personnalisé dans ce cas. Si vous ouvrez les détails du paramètre de commande, il y a un champ appelé regex personnalisé. C’est ici que Remo recherche la regex lorsque le domaine de valeur est Personnalisé. Je vais utiliser ls[0-9a-zA-Z-\x20_.]{0,64}. C’est la commande ls suivie d’un groupe optionnel de caractères consistant en chiffres, lettres, tiret, espace, caractère de soulignement et point. Pas de point-virgule, pas de barres obliques, pas de backticks, pas d’umlauts allemands, pas de spécialités unicode : c’est votre serveur et vous ne voulez pas de conneries ici.

La protection pour ls.php est en route avec la définition du paramètre POST command.Une requête ne répondant pas à cette condition échouera. Le comportement par défaut d’Apache pour une requête échouée sera de renvoyer un code d’état http 501 : Méthode non implémentée. Mais soyons gentils : en tant que code d’état (échec de la correspondance de domaine), vous entrez 302 pour la redirection http et en dessous, à l’emplacement (échec de la correspondance de domaine), vous entrez l’URL de votre entreprise comme http://www.netnea.com. Ainsi, quelqu’un qui ne fournit pas le bon paramètre sera redirigé vers le site web de votre entreprise. En fait, vous pouvez rendre le paramètre obligatoire en cliquant sur optionnel et en dessous, vous pouvez également définir un comportement spécial pour une condition obligatoire échouée. Mais dans notre cas, le paramètre n’a pas besoin d’être de caractère obligatoire.
Si vous vous demandez comment ce paramètre d’expression régulière sera transformé en règle ModSecurity, alors jetez un œil à l’image suivante :

Voici comment une configuration de paramètre Remo est traduite en une règle ModSecurity.Elle décrit comment votre paramètre Remo est traduit en une règle ModSecurity et ce qui se passera lors de l’évaluation. Cela se résume à ceci : Chaque paramètre de requête http est comparé au domaine de valeur défini dans Remo et s’il ne correspond pas, alors toute la requête se voit refuser l’accès.
Mise en pratique
Cela dit, générons le jeu de règles ModSecurity. Cliquez sur le bouton générer dans la barre d’outils et enregistrez le fichier que vous obtiendrez. C’est le fichier de règles dans le langage de règles ModSecurity. Prenez ce fichier et enregistrez-le à un endroit où Apache peut le trouver. Cela vaut le coup d’œil d’ailleurs pour comprendre comment Remo utilise ModSecurity. Ensuite, vous devez vous assurer que ModSecurity est activé sur votre serveur web. Remo génère des ensembles de règles ModSecurity 2, car il y a eu une mise à jour majeure et une extension du langage de configuration entre 1.9 et 2.0 et Remo a besoin de ces nouvelles fonctionnalités. Au cas où votre distribution ne fournirait pas de paquets ModSecurity, vous pouvez en obtenir la plupart sur http://www.modsecurity.org. Sinon, vous pouvez toujours le compiler vous-même. Ce n’est pas trop compliqué.
Il est préférable d’inclure votre fichier de règles dans votre configuration apache comme suit :
Include /etc/apache2/rulefile.conf
Ensuite, rechargez votre apache et essayez (j’utilise l’outil en ligne de commande curl dans la démonstration, mais votre navigateur fonctionnera bien) :
curl --data "command=ls -l" http://localhost/ls.php-rw-r--r-- 1 sam staff 353 Feb 7 13:05 index.html
-rw-r--r-- 1 sam staff 248 Apr 23 05:35 ls.php
...Donc cela fonctionne toujours. Que diriez-vous d’un abus de ls.php ?
curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
302 Found
Found
Le document a été déplacé ici.
Apache/2.2.3 (Debian) PHP/5.2.0-8 Server at railsmachine Port 80
Attrapé l’attaquant ! Il y a un journal d’audit défini dans le fichier de configuration. Par défaut, il se trouve à /var/log/apache2/modsec_audit.log. Il se lira comme suit dans notre cas :
...
--2957a220-H--
Message : Accès refusé avec redirection vers http://www.netnea.com utilisant le statut 302 (phase 2).
Correspondance de "rx ^(ls\x20[0-9a-zA-Z-_.]{0,64})$" contre "ARGS:command" requise. [id "1"]
[msg "Le paramètre post command a échoué à la vérification de validité. Domaine de valeur : Personnalisé."] [severity "ERROR"]
Action : Intercepté (phase 2)
...Avant de passer en mode production, assurez-vous que ce journal ne devient pas trop volumineux. En fait, vous voudrez peut-être désactiver trop de journalisation lorsque vous aurez terminé la configuration. Le fichier journal est configuré par Remo pour faire une journalisation complète des requêtes à des fins de débogage par défaut. Cela inclut tout, même les mots de passe. Lorsque vous avez terminé les tests, vous devriez définir le paramètre SecAuditLogParts dans le fichier de règles à une valeur plus raisonnable. ABHZ est une option. De cette façon, il ne journalise que les en-têtes http et le résumé d’audit ModSecurity.
Ainsi, cela a été un aperçu rapide de Remo. Il y a plus à découvrir sur le site de Remo. ModSecurity.org a une excellente documentation qui vous dit tout sur le langage de configuration. De plus, il existe un ensemble de règles de base qui vous aidera dans les situations où vous n’avez pas le temps de modéliser votre application dans Remo. L’ensemble de règles de base est toujours un bon point de départ car il attrape 90 % des attaques avec très peu d’effort.
Remo est loin d’être mature, mais il est prêt à l’emploi et, avec une base d’utilisateurs utile, il pourrait se développer en un outil intéressant pour sécuriser les applications web. Votre application n’a pas besoin d’être aussi simple que celle utilisée dans ce tutoriel. Des applications plus grandes avec des dizaines d’URLs et de nombreux paramètres fonctionnent également très bien.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.