Détection et règles
Ce que l'agent trouve dans les journaux qu'un serveur écrit déjà : les quatorze types de source et leurs seuils, comment s'ajoute une source que l'installateur n'a pas trouvée, ce qui quitte la machine et ce qui ne la quitte jamais, et les fichiers de règles dont chaque détecteur est fait, y compris ceux que vous écrivez vous-même.
Ce que l'agent trouve dans vos journaux
Chaque source a son propre détecteur et son propre seuil, car cinq connexions SSH échouées en dix
minutes et cinquante requêtes web suspectes en deux heures sont la même affirmation sur un attaquant
et pas le même nombre. La rotation, copytruncate et un journal qui disparaît un moment
sont pris en charge, et un fichier illisible produit un avertissement et non un par lecture.
Les quatorze types de source
| Type | Chemin typique | Ce qui compte comme occurrence |
|---|---|---|
sshd | journald, sinon /var/log/auth.log ou /var/log/secure | Mots de passe faux, utilisateurs invalides, clés refusées pour un utilisateur qui n'existe pas, limites de tentatives dépassées, et les échecs avant l'authentification qui caractérisent les scanners : aucune chaîne d'identification, une mauvaise version de protocole, des données inutilisables dans l'échange de bannière. Une clé refusée pour un utilisateur valide ne compte volontairement pas, car un administrateur avec cinq clés en écrit quatre par connexion réussie. Une connexion réussie efface les échecs de cette adresse. |
web | /var/log/nginx/access.log ou un motif par site | Les POST de connexion, comptés quel que soit le code de statut, et les chemins qu'aucun client légitime ne demande. Tout le reste d'un journal d'accès est ignoré, car c'est la source qui a de vrais clients derrière elle. |
web-error | /var/log/nginx/error.log, /var/log/apache2/error.log | Les requêtes que le serveur web a lui-même refusées, les échecs d'authentification HTTP basique, et les lignes ModSecurity de gravité critique quand elles arrivent ici plutôt que dans un journal d'audit. Les lignes de limitation de débit ne comptent volontairement pas : une limite se déclenche aussi sur un vrai navigateur avec vingt onglets. Les messages de négociation TLS et de PHP disent quelque chose du serveur et rien du client. |
postfix | /var/log/mail.log, /var/log/maillog | Trois sources d'événement distinctes issues d'un seul fichier : les échecs d'authentification SASL, les rejets NOQUEUE qui sont réellement des 5xx (un 450 est du greylisting et ne compte pas), et les blocages amavis. Un courrier livré n'est jamais une occurrence. |
dovecot | le même journal de courrier | Les échecs de connexion IMAP et POP3, un par ligne, quoi que dise « N attempts ». L'adresse distante vient du champ rip=, jamais de lip=, qui est l'adresse propre du serveur. Une connexion interrompue sans tentative d'authentification n'est pas une occurrence : c'est un scan TLS, et aucun mot de passe n'a été essayé. |
exim | /var/log/exim4/mainlog, /var/log/exim/main.log | Échecs d'authentification et expéditeurs rejetés. Non vérifié face à un hôte réel : les motifs viennent du format de journal documenté. |
ftp | /var/log/syslog, /var/log/messages | Échecs d'authentification de pure-ftpd, proftpd et vsftpd. Tous trois journalisent via syslog, et chacun écrit le pair différemment, donc trois motifs sont utilisés. pure-ftpd est mesuré : 494 lignes sur 494 d'un hôte de production avaient une seule et même forme. |
named | le même syslog | Seule une requête entrante que bind a refusée. Le grand piège est le sens inverse : connection refused resolving est le résolveur de cet hôte qui n'atteint pas le serveur de noms de quelqu'un d'autre, et 90 pour cent des lignes mesurées étaient cela. Un détecteur sans cette exception signale les serveurs de noms d'autrui comme attaquants. |
panel | /var/log/ispconfig/auth.log | Connexions échouées au panneau ISPConfig. Le fichier fait 0 octet sur chaque hôte mesuré, et ce n'est pas un défaut : le panneau n'y écrit tout simplement rien. doctor le signale au bout d'une semaine. |
modsec | /var/log/apache2/modsec_audit.log | Un événement par transaction dont le verdict porte une gravité critique. C'est le seul détecteur avec état, car une transaction couvre plusieurs lignes. Rien de la requête ne voyage dans l'événement : ni l'identifiant de règle, ni la partie correspondante, ni l'URI. |
csf | /var/log/lfd.log | Ce que CSF a réellement bloqué, jamais ce qu'il a seulement détecté. Aucun second seuil par-dessus : lfd a compté avant que l'agent ne voie la ligne, un blocage est donc un signalement. |
fail2ban | le journal de l'unité, sinon /var/log/fail2ban.log | Seulement les actions de bannissement. Un Restore Ban n'est jamais signalé, car c'est ce qu'un redémarrage de fail2ban rejoue depuis sa propre base et non une nouvelle attaque. Une ligne Found d'un filtre n'est pas signalée non plus : la jail n'a pas encore décidé. |
imunify360 | interroge imunify360-agent | Des incidents issus du CLI, associés à des catégories par préfixe de nom de règle. Expérimental et non vérifié face à une installation sous licence ; le décodeur ignore ce qu'il ne peut pas lire plutôt que de transformer une réponse inattendue en source morte. |
scan | le journal du noyau (journalctl -k), sinon /var/log/kern.log ou /var/log/messages | Les lignes de la règle de scan de ports que la synchronisation installe avec cette source : un SYN vers un port sur lequel cet hôte n'écoute pas, préfixé rip-scan:. Dix sondes en dix minutes depuis une adresse font un scan. Rien dans une ligne du journal du noyau n'est écrit par le pair. Voir ci-dessous. |
web-app n'est pas un type de source et ne peut pas être écrit dans sources.
C'est un deuxième détecteur qui tourne sur les lignes qu'une source web lit déjà, et il
possède son propre seuil, c'est pourquoi il figure sous son propre nom dans le tableau des seuils
plus haut. Un agent dont la configuration le nomme refuse de démarrer : sources[0]: type "web-app" is not supported in this version.
Les scans de ports, depuis le journal du noyau
Toute autre source lit un journal qu'un service écrit. La source scan lit le noyau, et
c'est la seule source qui modifie aussi le pare-feu : quand elle figure dans la configuration, la
synchronisation ajoute derrière les listes une règle qui journalise un SYN vers un port sur lequel
cet hôte n'écoute pas, avec le préfixe rip-scan: et au plus dix lignes par minute après une première salve de 20, pour
qu'un scan des 65535 ports ne noie pas le journal. Avec le moteur ipset, c'est une chaîne à part,
rip-blacklist-scan ; avec nftables, c'est une règle dans la chaîne. Les ports en écoute
sont lus dans /proc à chaque synchronisation : un service que vous démarrez n'est plus
une cible de scan après le passage suivant, et il n'y a rien à déclarer. Seule une socket que
quelque chose venu de l'extérieur pourrait atteindre compte comme en écoute. Un port lié uniquement
à 127.0.0.1 ou à ::1 reste dans la règle, car un paquet qui y arrive
depuis le réseau est une sonde sur un port fermé et rien d'autre.
La liste de la dernière synchronisation n'est pas le seul contrôle : la règle interroge aussi le noyau à l'arrivée du paquet, et un SYN vers un port sur lequel une socket écoute à cet instant est une connexion et n'est jamais journalisé. Cela couvre un service démarré depuis la dernière synchronisation et un démon qui ouvre un port pour un seul transfert. La plage passive d'un serveur FTP en cours d'exécution (pure-ftpd, proftpd, vsftpd) est lue dans sa configuration et exclue de la règle ; si le serveur tourne sans plage configurée, c'est la plage de ports éphémères du noyau qui est exclue. Un noyau sans la correspondance socket garde la règle sans ce contrôle.
La règle se trouve derrière la liste blanche et derrière les listes. Une adresse de votre liste
blanche a quitté la chaîne avant elle et ne produit aucune ligne, et une adresse que les listes
rejettent déjà ne l'atteint pas non plus. En mode: log et mode: off, elle
fait ce que tout le reste fait dans ces modes.
La source lit le journal du noyau, journalctl -k, et se rabat sur
/var/log/kern.log ou /var/log/messages là où il n'y a pas de journal ; un
path que vous définissez l'emporte. La règle livrée scan compte dix sondes
en dix minutes depuis une adresse, les signale sous la catégorie 14 (Port Scan) comme
port probes et bannit l'adresse comme n'importe quelle autre détection. Un client qui
réessaie un port fermé envoie au plus six paquets, d'où le seuil de dix. install écrit
la source sur un hôte neuf comme dernière entrée de sources ; un hôte installé plus
tôt garde sa configuration, et l'ajout tient en une ligne, suivie d'un redémarrage du service de
surveillance et d'une synchronisation pour la règle.
# config.yaml: the source, next to the ones the installer wrote
sources:
- type: sshd
- type: scan
# /etc/reportedip-agent/rules.d/50-scan.yaml: ban a scanner on this
# host, but leave the report to hosts that see more of it. Every field
# not named here stays as shipped.
format: 1
rules:
- id: scan
action: {ban: true, report: false}
# The same file with enabled: false switches the rule off; the firewall
# rule and its log lines stay. A threshold of your own goes into
# config.yaml and wins over the file:
thresholds:
scan: {hits: 20, window_minutes: 10}
Ajouter une source que l'installateur n'a pas trouvée
Une source que l'installateur n'a pas trouvée est simplement absente de la configuration, et l'ajouter
est une entrée avec un chemin ou un motif. Comme un fichier avec une clé sources remplace
entièrement la liste par défaut, votre entrée va à côté des entrées existantes et non dans un second
bloc.
sources:
- type: sshd
- type: web
path: /var/log/nginx/access.log
# A second web server on a different path
- type: web
path: /var/log/caddy/access.log
# Every site of a panel host, rescanned every ten minutes.
# At most five wildcard segments.
- type: web
glob: /var/www/clients/*/web*/log/access.log
exclude:
# This site reports to the API on its own, through Hive or a
# honeypot. Without the exclude the host sends every address
# twice and pays twice out of the daily quota.
- /var/log/ispconfig/httpd/honeypot.example.com/*
# Exim on a host the installer saw as a Postfix machine
- type: exim
path: /var/log/exim4/mainlog
Deux chemins qui pointent sur le même fichier ne posent pas de problème et n'ont pas besoin d'exclude :
ISPConfig publie chaque journal d'accès deux fois, sous /var/www et sous
/var/log/ispconfig, et l'agent lit un tel fichier une seule fois. Avant de faire confiance
à une nouvelle entrée, pointez reportedip-agent test sur le fichier, redémarrez ensuite le
service de surveillance, puis regardez status : la section sources montre les
occurrences par source. doctor affiche un compte files= par source, et une
source avec un compte à zéro ne pointe vers rien du tout.
Ce qui quitte la machine
Un signalement contient l'adresse, les identifiants des Threat Categories et une phrase générée. Aucune ligne de journal, aucun corps de requête, aucun User-Agent, aucune URL et aucun nom d'utilisateur n'est jamais transmis : un signalement ne peut donc pas divulguer vos clients, vos chemins ou vos identifiants, même par accident.
Une précision, car une promesse absolue serait fausse ici. Deux sources placent un nom issu du
journal dans cette phrase générée : avec fail2ban le nom de la jail qui a banni, avec
imunify360 le nom de la règle qui s'est déclenchée. Les deux sont filtrés sur les
lettres, les chiffres, le point, le tiret et le tiret bas, et coupés à 32 caractères avant de quitter
la machine, car un nom de jail provient d'une ligne de journal et constitue donc une entrée proche de
l'attaquant. Aucune autre source n'envoie quoi que ce soit issu d'une ligne de journal.
Le nom d'hôte est envoyé, et pour une seule raison : que vous reconnaissiez votre propre machine dans
la liste des serveurs au lieu de comparer des identifiants aléatoires. Il est filtré côté client sur
A-Za-z0-9._-, tout le reste étant supprimé et non remplacé, coupé à 191 caractères, et il
ne part jamais sans l'identifiant d'installation à côté.
L'identité reste l'identifiant d'installation. Le nom d'hôte est une étiquette et rien de plus : renommer la machine ne change rien à la licence, rien à l'hôte qui la détient et rien à ce que le serveur décide. Vous pouvez en plus donner à un hôte une étiquette à vous dans votre compte ; elle est affichée avant le nom d'hôte et n'est jamais déduite de la machine.
Quatre choses ne sont jamais signalées et jamais bloquées, et c'est une frontière dans le code plutôt qu'un réglage : les plages privées et réservées, la boucle locale, chaque adresse des interfaces de ce serveur et sa passerelle par défaut, et tout ce qui figure dans votre liste blanche. L'adresse du client SSH relevée à l'installation se trouve dans la liste blanche automatique et appartient donc au dernier groupe.
Règles
Une règle dit quelles lignes d'une source sont des correspondances, où se trouve l'adresse dans une telle ligne, comment s'appelle une correspondance, et combien d'entre elles en combien de minutes deviennent un bannissement ou un signalement. Chaque détecteur de l'agent est une règle, et chaque règle est un fichier. Trois couches sont lues et fusionnées par identifiant de règle :
| Couche | Où elle se trouve | Ce qu'elle est |
|---|---|---|
| 1 | Dans le binaire | Les règles livrées, un fichier par type de source. Elles tournent depuis le binaire. Après la prochaine synchronisation, une copie à lire se trouve sous /var/lib/reportedip-agent/rules.d/standard/ ; une modification faite là est écrasée par la synchronisation suivante. install crée ce répertoire et packs/ à côté, vides, pour que les trois couches soient visibles avant que la première synchronisation n'en remplisse deux. |
| 2 | Un paquet de règles signé de reportedip.com | La synchronisation le récupère, vérifie sa signature contre une clé intégrée au binaire avant qu'un seul octet n'en soit lu comme règle, et le conserve dans le répertoire d'état. Un hôte qui ne joint pas le service garde le paquet qu'il a. Un paquet dont la signature n'est pas valide est refusé, et celui sur le disque reste. |
| 3 | /etc/reportedip-agent/rules.d/*.yaml | Vos fichiers : des surcharges de règles livrées, et vos propres règles. |
Le paquet l'emporte sur le binaire, vos fichiers l'emportent sur le paquet. Une surcharge nomme une
règle par son id et seulement les champs à changer ; chaque champ qu'elle ne nomme pas
garde la valeur de la couche du dessous. match et examples sont remplacés
en bloc, action champ par champ. enabled: false désactive une règle. Le
nom du fichier ne joue aucun rôle : un fichier appelé 10-sshd.yaml sous
rules.d ne masque pas le fichier livré de ce nom, il est lu comme n'importe quel autre
et fusionné par les identifiants qu'il contient, si bien qu'une version qui renomme un fichier livré
ne peut pas transformer votre surcharge en doublon.
Le format de fichier
Un fichier contient autant de règles qu'on veut. En voici une complète, tirée de la suite de tests de l'agent lui-même :
format: 1
rules:
- id: my-sshd
source: sshd
match:
regex: '(Failed password|Invalid user) .* from '
anchors: ["Failed password", "Invalid user", "Accepted "]
reset: 'Accepted (password|publickey) for .* from '
addr: {after: " from ", occurrence: last}
categories: [22, 18]
noun: failed logins
threshold: {hits: 5, window_minutes: 10}
examples:
match:
- {line: "Sep 24 14:47:38 host sshd[1]: Failed password for root from 45.33.32.156 port 51422 ssh2", addr: 45.33.32.156}
inject:
- {line: "Sep 24 14:47:38 host sshd[1]: Invalid user x from 8.8.8.8 port 22 from 45.33.32.156 port 51422", addr: 45.33.32.156}
nomatch:
- "Sep 24 14:47:38 host sshd[1]: Connection closed by 45.33.32.156 port 1"
| Champ | Signification | Ce que le chargeur vérifie |
|---|---|---|
format | La première ligne de chaque fichier de règles. Cet agent lit le format 1. | Un fichier avec un numéro plus élevé a été écrit pour un agent plus récent et il est ignoré ; un fichier sans cette ligne aussi. |
id | Le nom de la règle, tel que rules list et le journal le montrent. | a-z, 0-9 et - à partir du deuxième caractère, au plus 32 octets. Un identifiant qui existe dans une couche inférieure fait de la règle une surcharge. |
source | Le type de source dont la règle lit les lignes, l'un des quatorze : sshd, fail2ban, web, web-error, postfix, dovecot, exim, ftp, named, panel, modsec, csf, imunify360, scan. | Obligatoire pour une nouvelle règle. |
event | La source d'événement sous laquelle les correspondances comptent, le nom auquel une entrée sous thresholds dans config.yaml se réfère, et le nom que porte le commentaire d'un signalement. Par défaut, l'identifiant. | Même jeu de caractères qu'un identifiant. Les règles qui partagent un événement partagent son seuil, et une correspondance compte une fois, quelle que soit celle qui l'a attrapée. Une règle à vous ne peut pas reprendre l'événement d'une règle livrée : surchargez cette règle par son identifiant à la place. |
enabled | true ou false ; une clé absente vaut true. | enabled: false dans une surcharge désactive une règle livrée sans toucher à son fichier. |
match.regex | Le motif qui décide si une ligne est une correspondance, et rien d'autre. Syntaxe RE2, telle que Go la lit. | Au plus 512 octets. Pas d'indicateurs comme (?i), (?s) ou (?m), pas de groupes nommés : l'adresse ne vient pas du motif. |
match.anchors | Des mots littéraux que chaque correspondance porte. Le motif ne tourne que sur une ligne qui en porte un ; toute autre ligne ne l'atteint jamais. | Obligatoire. Chacun d'au moins 6 octets et partie littérale de regex ou de reset. Quand reset est défini, au moins une ancre doit s'y trouver, sinon le reset ne se déclenche jamais. |
match.ignore | Des motifs qui écartent une ligne avant que regex ne la voie. | RE2, les mêmes limites que regex. |
match.reset | Le motif d'une ligne qui remet à zéro le compteur d'une adresse, une connexion réussie. | RE2, les mêmes limites. L'adresse est lue de la même façon que pour une correspondance. |
match.builtin | À la place d'un motif, le nom d'un détecteur compilé. Les règles livrées pour web, web-app, web-error, modsec, exim, panel, named, fail2ban, csf et imunify360 sont de ce type et ne portent que la politique. | Pas avec regex, et sans anchors, ignore, reset, addr ni examples. |
addr | Où se trouve l'adresse dans une ligne qui correspond. Exactement une forme : after avec occurrence: last ou first ; between: [left, right] ; in_brackets: N, le N-ième [...] en comptant à partir de 1 ; before_byte: ":", un octet ; field: N, le N-ième champ séparé par des blancs en comptant à partir de 0. Un upto: "<" facultatif coupe la ligne à la première occurrence de ce marqueur avant que la forme ne soit appliquée, si bien qu'un champ que le pair écrit derrière ne peut pas être atteint. | Obligatoire pour une règle regex. after demande au moins 3 octets et une occurrence ; upto fait au plus 16 octets. |
categories | Les identifiants des catégories de menace qu'un signalement porte. Il y en a 63, numérotées de 1 à 63. | Obligatoire quand la règle signale. Chacun au moins 1. |
noun | Comment s'appelle une correspondance dans le commentaire d'un signalement, par exemple failed logins. | Lettres, chiffres et espaces, au plus 40. |
threshold | hits dans window_minutes, la paire qu'une jail fail2ban appelait maxretry et findtime. | hits de 1 à 10000, window_minutes de 1 à 1440. Sans le bloc, min_hits et window_minutes de config.yaml s'appliquent. Une entrée sous thresholds dans config.yaml l'emporte sur les deux. |
action | ban et report, chacun true ou false ; les deux valent true quand ils manquent. | Les deux à false est refusé : une règle qui ne fait rien se désactive avec enabled: false à la place. |
examples | Les tests de la règle. match : des lignes et l'adresse que chacune donne. inject : des lignes qui portent une deuxième adresse, un leurre, dans un champ que le pair écrit, et l'adresse que la règle doit quand même donner. nomatch : des lignes auxquelles la règle ne doit pas correspondre. | Obligatoire pour une règle regex, au moins une de chaque sorte, et au moins une ligne nomatch doit porter une adresse. Ils tournent à chaque chargement de la règle ; une règle dont les exemples ne tiennent pas ne se charge pas. |
Pourquoi l'adresse n'est pas un groupe de capture
fail2ban a connu cela deux fois, CVE-2013-2178 et CVE-2009-0362, et les deux fois c'était la même
erreur : l'adresse sortait du motif, et un attaquant avait mis une adresse de son choix dans un
champ que le motif atteignait. RE2 trouve la correspondance la plus à gauche, donc dans
Invalid user x from 8.8.8.8 port 22 from 45.33.32.156 port 51422 un groupe derrière le
premier from bannirait 8.8.8.8, qui est le nom d'utilisateur que
l'attaquant a tapé. addr: {after: " from ", occurrence: last} prend le dernier, celui
que sshd a écrit lui-même. C'est pour cela qu'une règle nomme une position et non un groupe, et que
chaque règle porte une ligne inject qui le prouve.
Ce qui vous protège de votre propre règle
Les exemples tournent à chaque chargement de la règle, donc un motif qui ne correspond plus à ses propres
lignes ne se charge pas. Une règle à motif que votre couche ajoute ou surcharge bannit et ne signale pas pendant les premières 24
heures de son contenu (une règle avec match.builtin jamais) : une entrée noyau erronée expire et apparaît dans ban list, un
signalement erroné ne se reprend pas. rules status marque une telle règle comme young.
Un redémarrage du démon fait recommencer la journée.
Deux garde-fous surveillent une règle pendant qu'elle tourne. Quand trois adresses de votre liste blanche atteignent son seuil en dix minutes, la règle lit le mauvais champ, car les vrais attaquants ne sont jamais sur la liste blanche ; elle cesse de signaler jusqu'à ce que son fichier change, et continue de bannir, ce que la liste blanche couvre. Quand une règle jeune pousse plus de 50 adresses distinctes au-dessus de son seuil en une minute, elle correspond à chaque visiteur et elle est suspendue en entier, bannissements et signalements, jusqu'à ce que son contenu change. Une règle établie n'est jamais suspendue pour une rafale : une force brute distribuée avec des centaines de sources par minute est exactement ce pour quoi une règle sshd existe. Une règle du paquet est surveillée par le garde-fou de rafale comme une règle jeune, parce qu'un paquet atteint tous les hôtes en même temps.
Une entrée sous thresholds dans config.yaml continue de l'emporter sur le fichier, donc
un hôte que vous avez réglé ne perd rien. Un fichier qui n'est pas du YAML valide, ou qui nomme un
format plus récent, est ignoré seul et les autres se chargent. Une règle qui échoue à l'une des
vérifications ci-dessus coûte toute votre couche : les règles livrées et le paquet continuent,
status et doctor le disent, et rules check nomme le fichier,
la ligne et l'identifiant.
Les commandes rules
reportedip-agent rules list # every rule: id, source, event, kind, state, threshold, action
reportedip-agent rules show sshd # one rule as merged, and whether it is overridden
reportedip-agent rules check # load rules.d the way the daemon does, and say what is wrong
reportedip-agent rules check /root/my.yaml # try a file before it is put in place
reportedip-agent rules export sshd # print the shipped file of a rule, as the template
reportedip-agent rules status # state, hits since the daemon started, young and suspended rules
reportedip-agent rules disable sshd # write enabled: false for one id; enable takes it back
reportedip-agent test --rule my-sshd /var/log/auth.log # run one rule alone over a real log
list, show, check, export et
status lisent et affichent. check sans fichier charge votre répertoire
exactement comme le démon le ferait ; avec des fichiers, il charge ceux-là par-dessus le jeu livré,
si bien qu'un fichier peut être essayé avant d'être dans rules.d. export
affiche le fichier livré dans lequel une règle se trouve, commentaires compris, comme point de
départ d'une surcharge. enable et disable sont les deux qui écrivent : un
seul fichier généré, 90-agent-toggles.yaml, root seulement, réécrit à chaque appel.
test --rule fait tourner cette seule règle et aucun détecteur compilé à côté, prend le
type de source dans la règle, et ne signale ni ne bannit rien, comme le fait toujours test.
Écrire une règle à soi
- Partir d'un fichier livré.
reportedip-agent rules export sshd > /root/60-sshd.yamlaffiche le fichier dans lequel la règle se trouve, commentaires et exemples compris. - Le réduire, ou lui donner un nouvel identifiant. Pour une surcharge, gardez
l'
idet seulement les champs à changer ; le fichier ci-dessous est complet. Pour une règle à vous, donnez-lui un nouvelidavecsource,match,addr,categoriesetexamples, commemy-sshdplus haut. Un nouvel identifiant est une nouvelle source d'événement, et la règle livrée continue de tourner à côté. - Le vérifier.
reportedip-agent rules check /root/60-sshd.yamlcharge le fichier par-dessus le jeu livré exactement comme le démon le ferait et affiche chaque problème avec fichier, ligne et identifiant, ou une ligne qui dit ok. - Le mettre en place.
install -m 644 -o root -g root /root/60-sshd.yaml /etc/reportedip-agent/rules.d/. Le répertoire et chaque fichier qu'il contient doivent appartenir à root et n'être inscriptibles par personne d'autre, et un lien symbolique qui pointe hors du répertoire est refusé ; sinon toute la couche n'est pas utilisée. - Attendre une minute. Le démon prend le changement de lui-même, sans redémarrage,
et les compteurs repartent de zéro.
reportedip-agent rules statusmontre la règle, marquée young pendant son premier jour.reportedip-agent test --rule my-sshd /var/log/auth.logmontre entre-temps ce qu'elle aurait attrapé.
# /etc/reportedip-agent/rules.d/60-sshd.yaml: the shipped sshd rule,
# stricter on this host. Everything not named here stays as shipped.
format: 1
rules:
- id: sshd
threshold: {hits: 3, window_minutes: 10}
Dernière mise à jour: · Maintenu par l’équipe ReportedIP