Quelque chose que je fais, principalement en raison de mon ignorance d'une solution plus élégante, est de vérifier manuellement mes journaux Nginx toutes les 4 heures et les journaux du serveur de messagerie toutes les 2 minutes pour un accès excessif par des IP individuelles. Je lance quelques scripts ensemble que :
- Vérifiez le
access.log
et de lister les 10 premières adresses IP organisées par le nombre d'accès au serveur.
- Transférer les résultats dans un fichier journal
- Demandez à un autre script de regarder ce fichier journal et de bannir toute IP qui a frappé le serveur plus de X fois au cours des X dernières heures.
- Sauvez mon
iptables.save
Voilà à quoi ça ressemble :
autoBanIPs_mail.sh
#!/bin/bash
# This script checks the last 2 minutes of log entries to see if any
# IP has made over 99 connections
now=$(date +"%m_%d_%Y")
/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh
checkBadIPs_mail.sh
Une chose qui est TRÈS importante à noter ici, c'est que vous DEVEZ configurer une liste blanche ou vous allez commencer à bloquer beaucoup d'IP authentiques de serveurs dont vous recevez juste beaucoup d'e-mails ou dans le cas d'autres journaux, des IP qui frappent juste beaucoup votre serveur pour des raisons légitimes. Ma liste blanche est juste construite dans ce script en ajoutant des pipes grep juste après | grep ']] | qui ressemblent à quelque chose comme ceci "grep -v 127.0 |" .
Vous devez prendre le temps d'apprendre à votre serveur quelles IP à fort trafic sont légitimes et lesquelles ne le sont pas. Pour moi, cela signifie que j'ai dû passer la première semaine à vérifier manuellement mes journaux toutes les deux heures, à rechercher les adresses IP à fort trafic sur iplocation.net, puis à ajouter à cette liste blanche celles qui sont légitimes, comme amazon, box.com ou même les plages d'adresses IP de mon domicile/bureau. Si vous ne le faites pas, vous risquez d'être bloqué sur votre propre serveur ou de commencer à bloquer des serveurs de messagerie/web légitimes et de provoquer des interruptions de la messagerie ou du trafic.
cat /var/log/mail.log | awk \
-v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
-v d2="$(date "+%b %_d %H:%M")" \
'$0 > d1 && $0 < d2 || $0 ~ d2' | \
grep '\[' | grep '\]' | \
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
awk '{print $1}' | sort | uniq -c | sort -n | tail -10
BlockIP
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"
Encore une fois, je sais que c'est très rudimentaire et qu'il existe probablement un protocole efficace et propre qui fait tout cela, mais je ne le connaissais pas et cela dure depuis un an ou deux maintenant et garde les méchants à distance. La seule chose que je recommande SERIEUSEMENT est d'avoir un proxy ou un autre serveur dans les coulisses que vous pouvez utiliser pour accéder à votre serveur principal. La raison en est que si vous êtes en train de faire du développement web un jour et que vous vous envoyez 2000 ping en 5 heures pour des tests, vous pourriez être bloqué et n'avoir aucun moyen de revenir en arrière, sauf avec un proxy.
Vous pouvez voir cela dans checkBadIPs.sh
J'ai mis grep -v 127.0 et dans mes fichiers actuels, j'ai une tonne de règles d'ignorance pour mes propres IP et d'autres plages d'IP de confiance, mais parfois votre IP change, vous oubliez de mettre à jour et vous êtes bloqué sur votre propre serveur.
Enfin, j'espère que ça vous aidera.
UPDATE
J'ai un peu modifié les choses et maintenant, au lieu de vérifier toutes les deux heures, je vérifie certains journaux toutes les deux minutes, principalement mon journal d'authentification ssh et le journal de messagerie, car ils étaient surchargés :(.
Je configure des scripts spécifiques pour chaque fichier journal bien que ce serait assez facile à partir du scripts manuel que j'utilise moi-même lorsque je veux inspecter les journaux. Cela ressemble à ceci :
#!/bin/bash
log=$1 time=$2
cat /var/log/${log} | awk \
-v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
-v d2="$(date "+%b %_d %H:%M")" \
'$0 > d1 && $0 < d2 || $0 ~ d2' | \
grep '\[' | grep '\]' | \
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
sort | uniq -c | sort -n | tail -10
Cette fonction nécessite deux entrées au moment de son exécution : le fichier journal que vous souhaitez analyser et la date à laquelle vous souhaitez remonter dans le passé.
Donc, si je voulais vérifier le fichier mail.log pour le nombre d'ip, disons 75 minutes dans le passé, je le ferais :
$ sudo script.sh mail.log 75