Agent ReportedIP pour Linux
L'agent est un unique binaire statique qui remplit deux tâches sur un serveur Linux : il maintient la Community Blacklist dans le pare-feu du noyau et il signale les attaquants qu'il trouve dans les journaux de ce serveur. En option, il bloque aussi lui-même ces découvertes locales. Il remplace le script de synchronisation écrit à la main que documente ce site, et il reprend le travail que faisait fail2ban.
linux/amd64 et linux/arm64.
Chaque serveur a besoin d'une licence, une
est incluse dans Professional et trois dans Business, voir
Licences serveur. Les licences s'ajoutent et se retirent sous
Agent Servers dans votre
compte.
Ce qu'il fait
La blacklist communautaire dans le noyau
Cinq listes, une par service exposé (ssh, mail, web, ftp, edge), plus une sixième,
group, avec ce que les autres serveurs de votre groupe de compte ont signalé, récupérées aussi souvent
que votre licence l'autorise et basculées dans un ensemble ipset ou nftables de façon
atomique. Une liste revenue vide ou plus courte que min_entries n'est jamais
appliquée : une récupération échouée laisse donc l'ensemble précédent en place. La liste de
groupe fait exception : elle n'a pas de minimum, et une liste de groupe vide vide son ensemble.
Attaques locales reconnues et signalées
Quatorze types de source, dix-huit sources d'événement, chacune avec son propre seuil. L'agent suit les journaux que le serveur écrit déjà, compte les occurrences par adresse et signale l'adresse dès que son seuil est atteint. Aucune ligne de journal, aucun nom d'utilisateur et aucune URL ne quitte la machine.
Détections locales bloquées
Activé après l'installation (ban.enabled: true). Une adresse que l'agent a
attrapée lui-même entre dans un ensemble du noyau avec un délai d'expiration, et un récidiviste est banni
plus longtemps chaque fois. Mettez-le à false pour un hôte qui ne doit que
signaler.
Où aller ensuite
- Installation : les conditions d'utilisation, les vérifications, chaque question, les options et les variables d'un déploiement, un hôte sans systemd.
- Exemples d'installation : Ansible et cloud-init, une image de référence, les panneaux de contrôle, un hôte mail ou base de données, les conteneurs LXC et les pare-feu cloud.
- Configuration : chaque clé de config.yaml, les seuils, l'escalade des bannissements, le courrier, et quand un changement prend effet.
- Détection et règles : les types de source, les scans de ports depuis le journal du noyau, l'ajout d'un journal que l'installateur a manqué, ce qui quitte la machine, et les fichiers de règles.
- Blocage : les deux sortes d'ensembles, comment un bannissement commence et finit, la chaîne dans le noyau, et la levée d'un bannissement.
- Groupes : des bannissements partagés entre vos serveurs et vos sites WordPress, les limites par formule, la liste blanche et le webhook.
- Exploitation : les commandes, les codes de sortie, les unités, la supervision, la réputation de l'adresse de l'hôte, et le tableau de dépannage.
- Licences : une licence par serveur, le budget de signalements, les groupes à partir de Professional, et ce qui tourne sans licence.
- Remplacer fail2ban : la migration en trois étapes, et le chemin du retour.
Prérequis
| Nécessaire | Pourquoi, et ce qui se passe sans |
|---|---|
Un filtre de paquets accessible en écriture : ipset avec iptables, ou nftables | apt install ipset iptables ou apt install nftables, dans la famille RHEL dnf. Sans l'un des deux, l'hôte signale et ne bloque pas, ce qui est un mode de fonctionnement pris en charge. ip6tables est utilisé quand il est là ; sans cet outil, les bannissements IPv6 sont enregistrés mais pas appliqués. |
| systemd | Le seul prérequis strict de install, car il écrit et active trois unités. Vérifié en lisant /run/systemd/system et non par la présence de systemctl. Le binaire lui-même n'en dépend pas : watch pour la détection plus un sync depuis cron donnent un hôte qui fonctionne, monté à la main. |
| Root | L'agent écrit des règles de pare-feu et lit des journaux qui ne sont pas lisibles par tous. Il n'existe pas de mode réduit pour un utilisateur normal. |
| Une clé API depuis votre compte | Utilisée deux fois pendant l'installation, une fois pour télécharger le binaire sous licence et une fois pour enregistrer l'hôte. Une clé par hôte est la recommandation ; plusieurs hôtes sur une clé sont permis et ne coûtent rien de plus, car un hôte est identifié par son identifiant d'installation. |
curl ou wget, plus sha256sum | Seulement pour install.sh, pour le téléchargement et la somme de contrôle. Il refuse d'installer quand l'outil de somme de contrôle manque. |
Rien d'autre. Le binaire est lié statiquement et construit sans cgo : il n'apporte donc aucun interpréteur, aucune bibliothèque partagée, aucun dépôt de paquets et aucun assistant cron à lui. L'agent a été développé et mesuré sur Debian 12 (bookworm) en arm64 avec ISPConfig, nginx, Postfix, pure-ftpd et bind.
ipset ou nftables, et ce que décide auto
Les deux backends font le même travail. Ce qui compte, c'est celui que l'hôte utilise déjà, car deux filtres de paquets qui écrivent la même chaîne INPUT, c'est ainsi qu'un après-midi disparaît.
backend | Ce qui se passe |
|---|---|
auto (défaut) | ipset est préféré quand ipset et iptables sont tous deux sur l'hôte, sinon nft est utilisé. Cette préférence existe parce que CSF et le guide pare-feu publié utilisent cette chaîne d'outils : un hôte avec des règles existantes les garde donc. |
ipset | Ensembles dans ipset, règles dans la chaîne rip-blacklist d'iptables et ip6tables. Échoue avec un message clair quand l'un des deux outils manque, au lieu de se replier. |
nftables | Ensembles et règles dans la table native inet reportedip. Échoue quand nft manque. |
Seul un binaire qui existe compte, jamais une chaîne de version : iptables --version sur
un hôte avec le backend nft dit quelque chose qui a l'air juste et ne veut rien dire. Dès qu'un hôte a
synchronisé, le backend choisi est enregistré, et un changement ultérieur exige
reportedip-agent sync --migrate-backend au lieu de construire en silence un second jeu de
règles.
Vérifier l'hôte d'abord
doctor est la commande à lancer avant d'installer. Elle ne change absolument
rien : aucun fichier, aucun répertoire, aucune règle, aucun ensemble. Tout ce qu'elle rapporte, elle
l'a lu.
reportedip-agent doctor
| Section | Ce qu'elle répond |
|---|---|
system | La distribution telle que son propre os-release la nomme, le noyau, la plateforme, si systemd tourne vraiment, le fuseau horaire dans lequel sont lus les journaux sans décalage, et l'espace libre là où vivra le répertoire d'état. |
ssh | Quelle unité fait tourner sshd, et le port. Avec ssh.socket, le port vient du processus en écoute, car sshd -T répond encore 22 alors que le vrai port est dans l'unité socket. doctor dit lequel des deux a servi. |
firewall | Où sont ipset, iptables, ip6tables et nft, quel backend cela donne, et si l'ensemble des bannissements locaux porte un délai d'expiration par entrée. Ce dernier point décide si le noyau fait expirer un bannissement de lui-même. |
panel | ISPConfig, Plesk, cPanel ou DirectAdmin. Seule la disposition des journaux par site d'ISPConfig est connue de cette version ; les autres sont nommés plutôt que devinés, car un mauvais glob ferait lire à l'agent des compteurs d'octets au lieu des journaux d'accès. |
sources | Chaque source configurée résolue en fichiers réels, combien il y en a et combien sont lisibles, le plus gros avec un nombre de lignes estimé, et une note sur les fichiers présents mais vides. Sur le plus gros hôte de panneau mesuré, les globs web se résolvent en 196 fichiers. Il nomme aussi un journal que cet hôte écrit et qu'aucune source ne lit. C'est à cela que ressemble un service installé après l'agent, et ce constat justifie le code de sortie 1. |
mail | Si une alerte pourrait réellement quitter cet hôte. Sur dix-huit hôtes mesurés, quatorze pouvaient livrer du courrier, deux avaient sendmail avec un MTA arrêté, et deux n'avaient aucun MTA. |
verdict | Le résumé, et il correspond au code de sortie. |
Lire le verdict
| Sortie | Verdict | Ce que cela veut dire |
|---|---|---|
0 | tout ce dont l'agent a besoin est là | Installez. |
1 | tourne sur cet hôte, avec les limites ci-dessus | Chaque limite est affichée nommément. Un backend de pare-feu absent signifie que cet hôte signale et ne bloque pas, ce qui est une installation valable. Une source qui ne pointe vers rien vaut la peine d'être corrigée avant. |
2 | ne peut pas tourner sur cet hôte | Pas un hôte Linux, ou un hôte qui ne peut ni bloquer ni lire un seul journal. Corrigez la cause avant d'installer. |
Relancez doctor après l'installation. Avec une configuration en place, il rapporte les
sources configurées au lieu des sources détectées, et il ajoute la dérive d'horloge par source que le
démon a mesurée. Une source dont le journal horodate chaque ligne à plus d'une minute de l'horloge
système a une fenêtre de comptage qui ne se remplit jamais, et c'est la seule panne qui ressemble
exactement à « le détecteur ne marche pas ».
Installation rapide
Trois commandes sur un hôte qui n'a encore rien de tout cela. Lancez-les dans cet ordre et l'agent signale, les listes communautaires sont dans le noyau, et rien n'a été rejeté sans votre accord.
# 1. Install, as root. At a terminal it shows the terms of use and
# takes a yes, then asks for your key, then three short questions;
# an Enter answers drop and local bans on.
curl -fsSL https://reportedip.com/agent/install.sh | sh
# For automation, and for fifty hosts, nothing is asked: the terms
# are accepted up front and the key comes from the environment.
curl -fsSL https://reportedip.com/agent/install.sh | REPORTEDIP_ACCEPT_TERMS=1 REPORTEDIP_KEY="YOUR_API_KEY" sh
# 2. The first sync builds the chain and the sets. The installation
# itself touches no firewall rule.
reportedip-agent sync
# 3. See that it ran, and read what would be dropped before it is.
reportedip-agent status
reportedip-agent doctor
reportedip-agent test /var/log/auth.log
Ce que chacune laisse derrière elle : la première pose le binaire dans /usr/local/bin,
écrit /etc/reportedip-agent/config.yaml à partir de ce qu'elle a trouvé sur cet hôte
et installe les trois unités systemd. La deuxième crée la chaîne de pare-feu et les ensembles, que
l'installation ne touche volontairement pas, et les remplit. La troisième est la preuve :
status affiche un nombre d'entrées par liste et l'état de licence de cet hôte,
doctor nomme ce qui manque, et test rejoue votre propre journal pour
montrer quelle adresse aurait franchi quel seuil. Les règles rejettent dès la première
synchronisation, car c'est ce que l'installation écrit : la liste blanche est donc à faire avant cette
synchronisation et pas deux jours après. Répondez plutôt log pour un hôte sur lequel vous
voulez d'abord lire un journal. La
page d'installation est la même
installation expliquée en entier, et ce détail est sa raison d'être.
La première heure, dans l'ordre
Chaque étape répond à une question dont dépend la suivante. Dans un autre ordre, une installation qui fonctionne a l'air cassée.
reportedip-agent doctor. Avant tout le reste, car c'est la seule commande qui ne change rien.reportedip-agent sync. La première exécution construit la chaîne, crée les ensembles et télécharge les listes configurées, l'une après l'autre avec une courte pause entre elles.reportedip-agent status. Vérifiez que chaque liste configurée a un nombre d'IPv4 plausible, que la chaîne ditok, que la liste blanche contient les adresses attendues, et queaccountmontre votre rôle et l'état de licence de cet hôte.- Corrigez la liste blanche. L'installateur y a mis l'adresse d'où venait votre session SSH, ce qui est une supposition. Remplacez-la par la plage depuis laquelle vous administrez vraiment, et ajoutez votre supervision, votre hôte de sauvegarde et la plage de votre bureau.
- Relisez
statusaprès un jour. Les compteurs de paquets de la chaîne disent ce que les règles ont réellement arrêté, etban listdit quelles adresses cet hôte a attrapées dans ses propres journaux. - Seulement sur un hôte pour lequel vous avez répondu
log: les règles sont entièrement construites et correspondent, elles enregistrent seulement au lieu de rejeter, le journal du noyau montre donc exactement ce quedropaurait coupé. Lisez un journal, puis passez enmode: dropet lancezsync, qui reconstruit les règles.
reportedip-agent doctor
reportedip-agent sync
reportedip-agent status
reportedip-agent whitelist add 203.0.113.0/24 "management"
reportedip-agent whitelist add 198.51.100.7 "monitoring"
reportedip-agent whitelist list
log vous laisse aussi ces deux jours, un hôte qui a pris la valeur par
défaut non.
Mises à jour et notes de version
L'agent cherche une nouvelle version toutes les six heures, pendant la synchronisation. Il vérifie le
téléchargement contre une signature Ed25519 avec la clé publique intégrée au binaire, remet en place le
binaire en cours d'exécution si le remplacement échoue et redémarre lui-même le service de surveillance.
reportedip-agent update fait la même chose à la demande, et update --check ne
rapporte que ce qui est publié.
Relancer la commande d'installation met également à jour un hôte. Un hôte sous la version minimale
prise en charge par le service se met quand même à jour lui-même ; d'ici là, l'agent le signale dans
son journal, dans status (exit 1) et dans update --check. Les retours à une version antérieure sont refusés en général, un hôte qui a
récupéré une version plus récente ne revient donc pas en arrière de lui-même.
Ce que la version actuelle a changé est public et ne demande aucune clé :
curl -s https://reportedip.com/agent/whats-new
reportedip-agent update --check
Les modifications de la REST API elle-même, donc les champs de réponse et les codes de statut qui concernent une intégration, figurent plutôt dans le Changelog de l'API.
Dernières versions
- 0.3.41 :
--admin-ipaccepte désormais vraiment une plage CIDR. Jusqu'à 0.3.40, une plage était réduite à son adresse réseau, et seule cette adresse arrivait dans la liste blanche automatique. Avecbackend: auto, l'agent préfère ipset, et les indications de l'installateur le disent maintenant. - 0.3.40 :
status --jsonpour la supervision : un document au schéma 1, avec le même verdict et le même code de sortie que le texte, sans requête vers l'API, et une configuration cassée (exit 2) produit quand même un document.statussignale désormais un démon watch arrêté par l'exit 1 : le démon laisse un signal de vie toutes les 30 secondes, et un signal de plus de deux minutes compte comme arrêté. La mise en place pour les systèmes de supervision courants se trouve sous Supervision. - 0.3.39 : la règle de scan de ports ne bannit plus les clients FTP en mode passif. Chaque connexion de données va vers un port que le serveur ouvre pour ce seul transfert, la règle ne connaissait les ports en écoute que depuis la dernière synchronisation, et l'envoi d'un dossier ressemblait donc à un scan en quelques secondes. La règle demande désormais au noyau si une socket écoute sur le port à cet instant (
-m socket --nowildcardavec iptables,socket transparentavec nftables), et la plage passive d'un pure-ftpd, proftpd ou vsftpd en cours d'exécution est lue dans sa configuration et exclue de la règle. Pour un serveur sans plage configurée, c'est la plage de ports éphémères du noyau qui est exclue. La chaîne est reconstruite une fois à la synchronisation suivante. - 0.3.38 :
installaccepte le niveau de journalisation, par--log-level debug|info|warn|errorou parREPORTEDIP_LOG_LEVEL. La valeur par défaut restewarn. Un déploiement qui veut tout suivre sur chaque hôte ditinfoune seule fois au lieu de modifier ensuite la configuration de chaque hôte, et un niveau que l'analyseur refuserait est refusé avant que quoi que ce soit ne soit écrit. - 0.3.37 : un service qui n'écoute que sur la boucle locale n'est plus considéré comme joignable. La sonde de ports comptait chaque écouteur de la table du noyau quelle que soit l'adresse à laquelle il était lié, si bien que le résolveur local qui tient
127.0.0.53:53sur un hôte Debian ordinaire ressemblait à un serveur de noms, et un serveur de messagerie qui ne prend le courrier que depuis sa propre machine ressemblait à un serveur ouvert sur Internet. Un port qui a une socket de boucle locale à côté d'une vraie compte toujours. Cela décide aussi quels ports la règle de scan de ports traite comme ouverts. - 0.3.35 :
doctornomme un journal que cet hôte écrit et que ne lit aucune source, et indique où ajouter la source. La détection ne s'exécute qu'une fois, à l'installation, et cela reste ainsi, car un service arrêté pour une maintenance ne doit jamais désactiver une source. L'autre direction n'avait personne pour la surveiller : un serveur de messagerie installé sur un hôte qui n'en avait pas jusque-là passait inaperçu, et l'hôte paraissait sain pendant que ce service restait sans surveillance. Le constat vaut un code de sortie 1. - 0.3.34 :
installlit les journaux web dans la configuration du serveur web lui-même, y compris les fichiers d'hôtes virtuels sousconf.detsites-enabled, au lieu d'une liste de noms par défaut. Un vrai hébergement nomme ses journaux d'après le site, les chemins par défaut trouvaient donc le journal par défaut et manquaient le reste : sur un hôte mesuré, deux autres journaux, dont un journal d'accès avec de vraies adresses, seraient restés non lus. Un journal dont le format masque l'adresse du client est toujours laissé de côté, et chaque journal repris ainsi est nommé sur une ligne à l'installation. - 0.3.32 :
statusne qualifie plus un hôte de degraded parce que sa liste de groupe est vide, ce qui est l'état normal d'une clé qui n'est dans aucun groupe, etdoctorn'affirme plus qu'il n'y a aucune source de journal sur un hôte dont le sshd écrit dans le journal de systemd au lieu d'un fichier. - 0.3.29 : une installation neuve écrit
log_level: warnau lieu deinfo, un nouvel hôte reste donc silencieux dans le journal de systemd jusqu'à ce que quelque chose réclame l'attention. Les lignes de routine, une liste mise à jour, un signalement mis en file, un bannissement local posé, sont inchangées et à un mot de distance. Un hôte déjà installé garde ce que dit son fichier de configuration. - 0.3.27 : la liste blanche du groupe : les adresses et préfixes qu'un groupe de votre compte nomme ne sont jamais bloqués ni signalés par aucun membre. La synchronisation la lit avec la liste de groupe, l'écrit dans
group-whitelistsous le répertoire d'état et l'applique dans le même passage à l'ensemble de liste blanche du noyau, au filtre des listes et au filtre de signalement ;whitelist listetstatusaffichent les entrées avec leurs notes. La liste blanche de cet hôte, la liste blanche automatique et les couches intégrées restent telles quelles. - 0.3.26 : un scan de ports rapide restait sous son propre seuil : la règle de scan journalisait dix SYN par minute avec la rafale par défaut du noyau de cinq, un scanner qui sonde mille ports en quelques secondes laissait donc cinq lignes, et la règle en demande dix. La règle admet désormais une rafale de vingt, les vingt premières sondes d'un scan sont journalisées d'un coup, et le débit garde ensuite le journal silencieux. La chaîne est reconstruite une fois.
- 0.3.25 : un hôte dont la clé n'est dans aucun groupe perdait sa chaîne avec 0.3.24, parce que l'ensemble de groupe n'est créé que par son premier flux et que la règle qui le nomme était refusée. Chaque ensemble de liste est désormais créé avant qu'une règle ne le nomme. 0.3.24 a été retirée.
- 0.3.24 : la liste de groupe
groupdans l'ensemblerip-groupsur tous les ports ; la réputation de l'adresse depuis laquelle cet hôte signale, comme condition de santéreputation; la détection de scans de ports depuis le journal du noyau avec la sourcescan. La chaîne est reconstruite une fois après cette mise à jour et ses compteurs de paquets repartent de zéro.
Consommation de ressources
Mesuré sur un hôte Debian 12 arm64 avec sept fichiers de journaux suivis par l'agent : 16,6 Mo de mémoire résidente. Il n'y a pas d'interpréteur à lancer, pas de base de données et pas de répertoire de cache à réchauffer, et c'est l'essentiel de l'explication de ce petit chiffre.
Ce que l'agent n'est pas
Ce n'est pas un antivirus, pas un pare-feu applicatif web et pas un remplacement d'Imunify360. Il ne lit pas vos fichiers, n'examine pas les corps de requête et ne met rien en quarantaine. Il bloque et signale des adresses, et il le fait sur une surface petite et vérifiable. Pour une protection au niveau d'une requête unique sur un site WordPress, prenez plutôt le plugin Hive. Les deux tournent sur la même machine sans se gêner.
Dernière mise à jour: · Maintenu par l’équipe ReportedIP