Messages : 1 862
Sujets : 90
Inscription : Oct 2017
Sur son site,
Bruno F nous propose un script qui scanne les journaux pour de possibles attaques sur le service ssh et place les IP sur liste noire :
addbrute.sh.
J'ai modifié son travail légèrement pour le simplifier d'une certaine façon et permettre de gérer d'autres services si besoin.
Voici ce que ça donne, libre à vous de commenter
Code :
#!/bin/sh
# evils.sh : scan logs for bruteforcers and add ip to pf table
#
# stolen here : https://www.bsdhowto.ch/addbrute.html
#
# modifications by prx <prx@ybad.name>:
# - remove "uniq", use "sort -u" instead
# - no /tmp/ipdump.txt temporary file anymore
# - allow multiple log files passed as argument
# - $exclude variable is no longer an array : grep filter ip.
# - Do not rely on ksh
# How to use:
# 1. add a table in /etc/pf.conf:
# table <evils> persist
# ...
# block quick from <evils>
#
# 2. add a new cron entry to run this script every 5 min
# # crontab -e
# */5 * * * * /root/bin/evils.sh /var/log/authlog /var/log/maillog
#
# 3. Clean this table everyday in /etc/daily.local
# pfctl -t evils -T expire 86400
usage() {
echo "usage: ${0##*/} /path/to/log1 /path/to/log2 ..."
exit 1
}
test $# -gt 0 || usage
tmp=$(mktemp) || (echo "can't create tmp file"; exit 1)
# ip to ignore. regex allowed
exclude="127\.0\.0\.1|\
192\.168\.1\.*|\
93\.6\.177\.187|\
46\.23\.93\.119"
# pf table
pftable="evils"
# Add you own filter
# /pattern to select line/{
# s/regex to remove before ip//
# s/regex to remove after ip//p
# }
sed -nE "/sshd.*Invalid user/{
s/.* from //
s/ port .*//p
}
/sshd.*Failed password/{
s/.* from //
s/ port .*//p
}
/sshd.*Unable to negotiate with/{
s/.* with //
s/ port .*//p
}
/sshd.*Bad protocol version identification/{
s/.* from //
s/ port .*//p
}
/sshd.*Disconnected from authenticating user root/{
s/.* root //
s/ port .*//p
}" $@ |\
sort -u |\
grep -Ev "$exclude" > $tmp
pfctl -q -f $tmp -t $pftable -T add $ip
# kill all states for ip in $pftable
pfctl -t $pftable -T show | while read -r ip; do
pfctl -q -k $ip
done
rm $tmp
(Modification du message : 26-08-2020, 07:46:28 par
prx.)
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
Intéressant. Merci.
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
Messages : 761
Sujets : 20
Inscription : Jan 2019
En fait c'est ce que fait sshlockout, il regarde ce type d'erreur et possède un compteur interne du nombre d'erreur pour chaque IP. L'intérêt c'est de pouvoir utiliser pledge sur le programme et de ne pas avoir à parcourir l'ensemble du log à chaque lancement.
Mais c'est intéressant comme script bien évidemment.
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
J'allais le dire, à-propos de sshlockout. sshguard a la même fonctionnalité et semble gérer plus de choses, aussi.
Donc, de fait, sur mon serveur DNS/Web, j'ai installé sshlockout car il me semble être plus pertinent qu'un propre script :p
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
(Modification du message : 25-08-2020, 20:42:23 par
PengouinBSD.)
Messages : 285
Sujets : 11
Inscription : Oct 2017
Souvent ces intrus essaient beaucoup de fois en peu de temps.
Code :
man -O tag=max-src-conn-rate pf.conf
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
@eol : Ce que tu décris est en effet important, mais n'a d'intérêt que pour les attaques "rapides". Cependant, le script proposé est là pour pallier aux attaques "lentes" indétectables avec pf :
https://en.wikipedia.org/wiki/Hail_Mary_Cloud
@solene : en effet, c'est comme sshguard ou sshlockout, à ceci près que le script peut fonctionner pour d'autres logs que /var/log/authlog. Il manque toutefois un compteur, et gagnerait à être plus efficace.
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
@prx: à moins que je ne me trompe, mais de ce que j'ai lu sur le site de sshguard, c'est le cas, il semble être prévu pour fonctionner avec plusieurs services !
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
C'est ce qui est mis sur leur site, mais je n'ai pas trouvé mention de cette fonctionnalité dans la configuration.
Mais j'aime bien sshguard que j'utilise depuis des années
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
peut-être que sous OpenBSD, il est "bridé" - ce ne serait pas le premier à être "sacrifié sur l'autel" de la sécurité.
Il faudrait chercher un peu plus, qui sait !?
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
Messages : 285
Sujets : 11
Inscription : Oct 2017
(25-08-2020, 16:09:26)prx a écrit : J'ai modifié son travail légèrement pour le simplifier d'une certaine façon et permettre de gérer d'autres services si besoin.
Voici ce que ça donne, libre à vous de commenter 
Comme je suis des fois un peu taquin, j'aimerais laisser savoir
qu'il est possible de faire à peu près équivalent sans scanner
les journaux après coup, sans cron et sans règle sed compliquée
en utilisant la possibilité de piper vers un script externe
directement depuis syslogd et en utilisant un simple case
dans le script.
voir la ligne avec "logsurfer" pour la syntaxe.
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
@eol : je t'ai déjà dit que je t'aime ?
Si non : je t'aime !
J'adore l'idée, je vais m'amuser avec
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
@eol, stp, sois plus explicite.
Parce que perso, sur le manpage de syslog.conf, je ne trouve QUE :
Citation :# Feed everything to logsurfer.
*.* |/usr/local/sbin/logsurfer
Donc, j'en déduis que c'est un programme tiers… sauf qu'un pkg_info ne restitue rien, ni apropos !
???
Une recherche donne ce lien :
https://crypt.gen.nz/logsurfer/
voire :
https://crypt.gen.nz/logsurfer/
Bizarre que ce ne soit dans les packages ! ???
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
(Modification du message : 27-08-2020, 02:53:02 par
PengouinBSD.)
Messages : 4 294
Sujets : 868
Inscription : Dec 2016
@prx: regarde ce tuto pour SSHGuard, concernant les autres services :
http://www.openbsd-edu.net/SSHGuard,_con...brute.html
Par contre, je me permets de le mettre ici :
Citation :(…)
Objectifs
Surveiller les connexions (via Syslog) entrantes et informer le parefeu pf des IP sources des attaques en force brute sur les divers services ouverts.
Contrairement à ce que le nom laisse penser, l'outil peut gérer les protocoles mails, webs,..
Installation et Configuration
pkg_add -i sshguard
Puis dans /etc/pf.conf
table <sshguard> persist
block in proto tcp from <sshguard> to port $mail_ports
block in proto tcp from <sshguard> to port $ssh_port
block in proto tcp from <sshguard> to port $http_ports
On teste que tout fonctionne et on relance
pfctl -vnf /etc/pf.conf
rcctl enable sshguard
rcctl start sshguard
Configuration des listes blanches
Afin de ne pas vous enfermer dehors, je vous conseille de whitelister votre accès d'administration :
mkdir -p /var/db/sshguard/
touch /var/db/sshguard/whitelist.db
echo "IP_ADM" >> /var/db/sshguard/whitelist.db
rcctl set sshguard flags -a 50 -l /var/log/authlog -l /var/log/maillog -p 14400 -w /var/db/sshguard/whitelist.db
Sur les accès Mails (Pop, Imap), et SSH, je bloque durant 4h les attaques au bout de 50 essais, sans tenir compte de l'IP d'admin.
(…)
On voit clairement l'usage dans PF vers les autres services que sont mail, web…
GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF 9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D 5B62 D0FF 7361 59BF 1733
Messages : 285
Sujets : 11
Inscription : Oct 2017
@prx Il me semble l'avoir déjà lu quelque part mais
ça n'enlève rien à cette nouvelle déclaration …
Pour info, lors de mon test le case est enrobé dans un
Code :
while read line
do
(…)
done
On peut peut-être faire autrement mais je n'ai pas cherché.
(27-08-2020, 02:49:55)PengouinBSD a écrit : @eol, stp, sois plus explicite.
Comme je l'écrivais, je renvoie sur cette ligne
juste pour donner une idée de la syntaxe.
Ce n'est qu'à titre d'exemple que logsurfer est écrit
dans le man. Remplace "/usr/local/sbin/logsurfer" par le chemin
vers ton propre script et éventuellement "*.*" par les "facility" et
"level" de ton choix.
Messages : 285
Sujets : 11
Inscription : Oct 2017
(27-08-2020, 09:27:07)eol a écrit : Pour info, lors de mon test le case est enrobé dans un
Code :
while read line
do
(…)
done
On peut peut-être faire autrement mais je n'ai pas cherché.
Comme on ne traite qu'une ligne à la fois, la boucle est superflue,
un simple
suivi d'un case sur line suffit.
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
(27-08-2020, 02:49:55)PengouinBSD a écrit : @eol, stp, sois plus explicite.
Citation :A pipe to another program (beginning with a leading pipe symbol). The given program is started and presented the selected messages on its standard input. If the program exits, syslogd(8) tries to restart it.
:
http://man.openbsd.org/syslog.conf
@eol : reste à traiter cette ligne pour en extraire l'IP de façon efficace.
Un script shell fera l'affaire dans un premier temps.
Ensuite, un bout de C pour profiter de pledge/unveil constituera un bon défi.
Messages : 285
Sujets : 11
Inscription : Oct 2017
(27-08-2020, 17:57:47)prx a écrit : @eol : reste à traiter cette ligne pour en extraire l'IP de façon efficace.
Un script shell fera l'affaire dans un premier temps.
Ensuite, un bout de C pour profiter de pledge/unveil constituera un bon défi.
Oui, pour le script shell
Code :
grep -Eho '([0-9]{1,3}\.){3}[0-9]{1,3}'
est un bon début (plein d'autres choses que des des IPs valides
peuvent correspondre à cette expression mais dans le contexte de authlog,
il y a de très fortes chances que ce qui y correspondent en soit une).
Pour les autres cas, une autre branche du case peut offrir autre chose.
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
En comptant sur le fait que la regex fait toujours ce qu'on attend, il manque le support d'ipv6.
J'étais parti sur du 'cut' et/ou du 'awk'
Messages : 285
Sujets : 11
Inscription : Oct 2017
(27-08-2020, 20:40:00)prx a écrit : il manque le support d'ipv6.
Dans parse_v6() de
https://www.geoghegan.ca/pub/pf-badhost/...badhost.sh
tu as un exemple mais encore avec grep.
Messages : 24
Sujets : 4
Inscription : Jan 2018
Bonjour,
super.
mais.... l'outil "Vilain" de Prx ne fait pas déjà cela ???
le script vient en plus, en complément ?
faut plus utiliser Vilain ?
j'ai dû louper un ou plusieurs épisode de l'aventure....
Antoine
Consultant JBoss, WildFly, J2EE,.... et utilisation d'OpenBSD avec un grand plaisir.
Bon pour l'
Hygiène-Numerique.
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
Salut!
Si, vilain fait exactement ce genre de choses, en temps réel là aussi. Vilain marche toujours très bien.
Là, j'ai envie de faire un truc plus simple, qui ne nécessite pas python, qui est plus intelligent que vilain en utilisant syslog comme le suggère eol.
Juste des geekeries finalement...
Messages : 24
Sujets : 4
Inscription : Jan 2018
ha ok !
tu as le temps ???.... tu as de la chaaannnce !!!
et nous aussi du coup,...merci pour ces outils
Antoine
Consultant JBoss, WildFly, J2EE,.... et utilisation d'OpenBSD avec un grand plaisir.
Bon pour l'
Hygiène-Numerique.
Messages : 1 862
Sujets : 90
Inscription : Oct 2017
Le temps ?
Ha ha, parfois pendant les siestes ^^