SuricateWeb : surveiller ses sites web et être alerté sur Telegram en cas de piratage

« Créer, former, transmettre. »

SuricateWeb : surveiller ses sites web et être alerté sur Telegram en cas de piratage

Quand on gère les sites de plusieurs clients, une question revient toujours : et si l'un d'eux avait été piraté sans que je m'en aperçoive ? Un site défiguré, un domaine détourné ou un script malveillant injecté peuvent passer inaperçus pendant des jours, puisque personne n'ouvre tous ses sites chaque matin.

C'est pour répondre à ce besoin que j'ai développé SuricateWeb, une application de surveillance de sites web pensée pour les webmasters. Elle détecte un piratage, une défiguration, un remplacement ou un transfert de domaine sans que vous ayez à ouvrir le site, et vous alerte directement sur Telegram. Elle s'inspire de changedetection.io, mais elle est orientée sécurité plutôt que suivi de prix : en plus du contenu, elle surveille ce qui change quand un site est compromis.

Tableau de bord SuricateWeb : sites regroupés par client, état, disponibilité et temps de réponse

Le code source

SuricateWeb est open source et disponible sur GitHub : github.com/burotica49/SuricateWEB. Vous y trouverez le README complet, illustré de captures d'écran réalisées à partir de données fictives.

Les principes de conception

• Zéro dépendance npm : c'est du Node.js pur. Le serveur HTTP, fetch, dns, tls et SQLite sont natifs, et il n'y a pas de Python.
• Orientée sécurité : on ne surveille pas seulement le texte d'une page, mais aussi les scripts, les redirections, le certificat, le DNS et le registre du nom de domaine.
• Auto-hébergée : vos données restent chez vous, sur votre serveur.
• Toujours protégée : l'application refuse de démarrer si l'identifiant et le mot de passe ne sont pas définis dans l'environnement.

Ce que fait SuricateWeb

Surveiller le contenu et détecter une défiguration

Chaque version d'une page est conservée et comparée à la précédente. Un remplacement total du contenu (similarité inférieure à 25 %) est classé critique, et l'onglet Modifications montre les lignes retirées et ajoutées. SuricateWeb repère aussi les mots-clés suspects (« hacked by », page par défaut de nginx ou d'Apache, « domaine à vendre », spam…) avec une liste que vous pouvez modifier, les changements de titre, les nouveaux scripts (surtout externes), le JavaScript obfusqué, les iframes injectées, les formulaires détournés vers un autre domaine et les redirections.

Onglet Modifications de SuricateWeb : différences d'une page défigurée

Des captures d'écran pour comparer avant et après

Toutes les heures par défaut, SuricateWeb photographie chaque site avec Chrome. L'onglet Captures garde l'historique et propose une comparaison côte à côte avant / après pour constater une défiguration d'un coup d'œil. Avant de capturer, l'application se comporte comme un visiteur (défilement, interaction) afin que les sites qui retardent leurs scripts s'affichent correctement.

Comparaison avant / après d'une capture d'écran dans SuricateWeb

Disponibilité, certificat et nom de domaine

• Disponibilité, à la manière d'UptimeRobot : calcul en temps sur 24 h, 7, 30 et 90 jours, frise des 90 derniers jours, historique des pannes et temps de réponse. Une panne n'est confirmée qu'après plusieurs échecs consécutifs, pour éviter les fausses alertes.
• Certificat TLS : invalide, expiré, expiration proche, changement d'émetteur.
• Domaine et DNS : serveurs de noms, délégation au registre, changement de registrar, statuts de transfert, DNSSEC, verrou anti-transfert, MX, SPF, DMARC, CNAME, CAA et échéance du domaine.

Des alertes Telegram utiles

SuricateWeb envoie un seul message par contrôle, avec la sévérité, le détail, un extrait des lignes modifiées et deux boutons : « Marquer comme lu » et « Ouvrir dans SuricateWeb ». Pour les alertes critiques visibles sur la page, une photo de la page au moment de l'alerte est jointe : depuis votre téléphone, vous voyez ce que voient vos visiteurs. La configuration est rapide : créer un bot avec @BotFather, coller son jeton dans les réglages, envoyer /start au bot, puis cliquer sur Détecter et sur Tester.

Message Telegram d'alerte critique avec photo de la page défigurée

WordPress et PrestaShop : mises à jour et sécurité du CMS

SuricateWeb voit le HTML d'un site, pas ses fichiers. Pour combler ce manque, un petit plugin WordPress ou PrestaShop, installé sur le site et qui ne répond qu'à SuricateWeb grâce à un jeton, remonte la version de PHP et les mises à jour disponibles du noyau, des extensions (ou modules) et des thèmes. Une mise à jour qui tarde, ou une version de PHP qui n'est plus maintenue, déclenche une alerte. L'onglet Sécurité va plus loin :

Onglet Mises à jour de SuricateWeb : PHP, noyau, extensions et thèmes

• comparaison des fichiers du noyau et des extensions du dépôt officiel avec les sommes de contrôle de wordpress.org
• détection d'un fichier PHP ajouté (porte dérobée) ou d'un fichier PHP dans le dossier des téléversements
• recherche de code suspect (code obfusqué, exécution de ce qu'envoie le visiteur) dans les thèmes, extensions et modules
• alerte critique quand un nouvel administrateur apparaît
Sous PrestaShop, la couverture est partielle : PrestaShop ne publie pas de sommes de contrôle exploitables.

Onglet Sécurité de SuricateWeb : intégrité des fichiers et comptes administrateurs

Organiser, rendre compte, réduire le bruit

• Groupes de sites par client ou par projet, réorganisables par glisser-déposer ou au clavier.
• Plusieurs pages par site : panier, paiement, connexion, contact… sont surveillés pour les scripts, iframes, formulaires détournés et textes suspects (10 pages au plus).
• Rapport mensuel client (disponibilité, incidents, mises à jour, échéances), à imprimer ou enregistrer en PDF.
• Page de statut publique en lecture seule, sans aucune information de sécurité.
• Fenêtres de maintenance : les alertes sont retenues pendant une intervention, puis un seul récapitulatif est envoyé à la reprise.
• Moins de bruit : sélecteur CSS pour ne comparer qu'une zone, exclusions, expressions régulières, seuil de modification et niveau minimal de notification.
• Thème sombre et interface adaptée au mobile.

Sous le capot

• Node.js 22.13 ou plus, sans aucune dépendance npm.
• Base SQLite, avec les versions de contenu compressées (les 300 dernières par site).
• Chrome ou Chromium piloté directement par le protocole DevTools, sans bibliothèque.
• Interface en JavaScript et CSS natifs, sans étape de build.
• Tests avec node --test, dont des tests de bout en bout dans un vrai Chrome : un faux site que les tests « piratent » en direct et un faux serveur Telegram.
• Des points d'extension (comptes multiples, droits, forfaits, autre moteur de base de données) pour construire une version hébergée au-dessus du cœur.

Installer et lancer SuricateWeb

En local

Il faut Node.js 22.13 ou plus, et Chrome ou Chromium si vous voulez les captures d'écran (facultatif). Copiez le fichier d'exemple d'environnement, renseignez votre identifiant et votre mot de passe, puis lancez l'application :

cp .env.example .env
npm start

Dans le fichier .env, les variables SURICATE_USER et SURICATE_PASSWORD définissent la connexion. Le mot de passe est obligatoire (8 caractères minimum) et l'identifiant vaut admin s'il est absent. Ouvrez ensuite http://localhost:3000, connectez-vous, cliquez sur Ajouter un site, puis configurez Telegram dans les Réglages. Si vous l'exposez hors de votre machine, placez-le derrière HTTPS.

Essayer sans rien configurer : le mode démo

La commande npm run demo démarre SuricateWeb avec des sites, des alertes, des pannes et des captures entièrement fictifs, dans un dossier temporaire supprimé à l'arrêt. Aucune donnée réelle n'est touchée et aucune requête ne part vers l'extérieur. Les identifiants de connexion de la démo sont indiqués dans le README.

Sur un serveur : Docker et Dokploy

Le Dockerfile du dépôt produit une image d'environ 1,3 Go (Node 24 Alpine avec Chromium et ses polices), qui fait tourner l'application sans droits root. Sur Dokploy : créez l'application depuis le dépôt Git avec le type de build Dockerfile, définissez les variables SURICATE_USER et SURICATE_PASSWORD, ajoutez un volume persistant monté sur /data (sans lui, la base et les captures sont perdues à chaque redéploiement), puis associez votre domaine sur le port 3000 avec HTTPS. Ne lancez qu'une seule instance : la base SQLite et le planificateur ne sont pas conçus pour tourner en double.

Limites à connaître

• La comparaison lit le HTML tel que le serveur le renvoie, sans l'exécuter : un contenu généré uniquement par JavaScript n'est pas comparé (la capture d'écran, elle, l'affiche).
• Un site piraté qui montre une page saine aux robots (cloaking) peut passer entre les mailles.
• La disponibilité est mesurée depuis votre serveur SuricateWeb : hébergez-le ailleurs que les sites surveillés.
• Le plugin du CMS tourne sur le site lui-même : un attaquant qui en prend le contrôle peut fausser sa réponse, et un plugin devenu injoignable n'est pas signalé. Ce n'est ni un scanner de vulnérabilités, ni un remplaçant de sauvegardes saines.
• Les captures exécutent réellement la page : dans Docker, l'isolation est celle du conteneur.
• Un utilisateur connecté peut faire requêter des adresses arbitraires par le serveur : ne partagez pas l'accès.

Licence et code source

SuricateWeb est publié sous licence Apache-2.0. Le code, la documentation et le suivi des demandes sont sur GitHub : n'hésitez pas à l'essayer, à le tester sur vos propres sites et à me faire part de vos retours.