A fail2ban egy olyan alkalmazás ami folyamatosan parseolja a log fileoket és gyanús művelet esetén az adott IP-t kizárja a tűzfalon. Miután beröccent, úgy gondoltam jó lenne tudni róla, hogy
- működik
- folyamatosan működik
- kiket vág ki.
Nyilván belehetne kötni nagiosba (muninba már eleve ott van, szóval a folyamatos működés vizuálisan észlelhető rajta), de akkor mire használnám a webmailemet 🙂 ?
Úgyhogy gyorsba kerestem egy fail2ban report scriptet ami hetente lefut cron-ból. Szépen működik is, ellenben csak kiÃrja az IP-ket, jó lenne tudni, hogy az milyen országból érkezik. ezért kicsit kibÅ‘vÃtettem. Eredeti script megtalálható itt. Arra oda kell figyelni, hogy a crontab nem futtatja le azokat a fájlokat amiknek kiterjesztése van. Tehát semmiképpen ne úgy rakjuk be, hogy fail2banweeklyreport.sh, hanem fail2banweeklyreport.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 #!/bin/bash# Weekly Fail2Ban Report# Be sure to sudo chmod +x script_name.sh to make it executable# Original script by: https://www.mopar4life.com/fail2ban-reporting/# Forked by Bence G. DebnárFAIL2BAN_PATH="/var/log/fail2ban*"LOGFILE="/var/backups/logs/fail2ban/$(date +%m%d%Y)_Fail2Ban_Report.log"#LOGFILE="/tmp/testfail2ban.txt"MAILTOADDRESS="emailaddress"SUBJECT="$HOSTNAME Weekly Fail2Ban Report"echo $(date +%m/%d/%Y) > $LOGFILEecho '' >> $LOGFILEecho '' >> $LOGFILEecho '' >> $LOGFILEecho 'Most frequently banned IP addresses' >> $LOGFILEecho ' Count IP Address' >> $LOGFILEecho '_______________________________________' >> $LOGFILE# show only the most problematic IP Addresses# 1.1: now it's show the IP AND the country nameread -r -a IPARRAY <<< `zgrep -h "Ban " $FAIL2BAN_PATH | awk '{print $NF}' | sort | uniq -c | sort -n | tail | sort -nr`#read -r -a array <<< `zgrep -h "Ban " /var/log/fail2ban* | awk '{print $NF}' | sort | sort -n | tail | sort -nr`RE_NUMBER='^[0-9]+$'for IPADDRESS in "${IPARRAY[@]}"do#because the input file is pretty consequent we don't need a complicated filter##if it's a number then it's the counterif [[ $IPADDRESS =~ $RE_NUMBER ]]thenecho -n "${IPADDRESS} " >> $LOGFILE#if contains a dot, then it's an IP addresselif [[ $IPADDRESS == *"."* ]]thenecho -n "$IPADDRESS (`geoiplookup ${IPADDRESS} | awk '{print substr($0, index($0,$4))}'`)" >> $LOGFILEecho >> $LOGFILEfidoneecho '' >> $LOGFILEecho '' >> $LOGFILEecho '' >> $LOGFILEecho '' >> $LOGFILEecho 'All banned IP addresses with service type' >> $LOGFILEecho '' >> $LOGFILEecho '_______________________________________' >> $LOGFILE# Show what service the IP was banned from and how many times for all log files including rotated# Sorts from high to low (using sort -nr) to sort low to high replace -nr with -n# To not use WILDCARD (*), you much change from {print $11,$9} to {print $10,$8}# SAMPLE OUTPUT# 1 XXX.71.214.66 [ssh-iptables]# 1 XXX.62.36.219 [sendmail]# 2 XX.165.195.40 [vsftpd]grep "Ban " $FAIL2BAN_PATH* | awk -F[\ \:] '{print $11,$9}' | sort | uniq -c | sort -nr >> $LOGFILE# EMail File after completion (wait 10 seconds to finish writing log first)sleep 10mail -s "$SUBJECT" "$MAILTOADDRESS" < $LOGFILE