136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/bin/sh  | ||
|  | # Read the log files depending on $1 (PREF) | ||
|  | # Read all of the IPs concerned, search countries and count them.   | ||
|  | # exec crontab 2h AM for previous day | ||
|  | 
 | ||
|  | EXECDIR="/usr/share/xt_geoip" | ||
|  | STATDIR="/var/lib/xt_geoip" | ||
|  | 
 | ||
|  | case $1 in | ||
|  |     "ssh") | ||
|  |         PREF="ssh" | ||
|  |         LOGDIR="/var/log/sshd" | ||
|  |         CMD1='cat' | ||
|  |         CMD2=' | grep -i ' | ||
|  |         CMD3=' | grep -E "(Failed password|Invalid user \w+ from)" | sed -e "s/^.*from //" -e "s/ port.*$//" >> $RESFILE' | ||
|  |     ;; | ||
|  |     "ipt") | ||
|  |         PREF="ipt" | ||
|  |         LOGDIR="/var/log/iptables" | ||
|  |         CMD1='zcat -f ' | ||
|  |         CMD2=' | grep -i ' | ||
|  |         CMD3=' | grep "GeoIP BAN" | sed -e "s/^.*SRC=//" -e "s/ DST=.*$//" >> $RESFILE' | ||
|  |     ;; | ||
|  |      "f2b") | ||
|  |  	if [[ -x /bin/fail2ban-client && -f /var/log/fail2ban/daemon.log ]] | ||
|  |  	then | ||
|  |      	    PREF="f2b" | ||
|  |      	    LOGDIR="/var/log/fail2ban" | ||
|  |      	    CMD1='zcat -f ' | ||
|  |      	    CMD2=' | grep -i ' | ||
|  |      	    CMD3=' | grep -E "] Ban " | sed -e "s/^.* Ban //" >> $RESFILE' | ||
|  |  #        	CMD3=' | grep -E ": NOTICE  [.*] Ban" | sed -e "s/^.* Ban //" >> $RESFILE' | ||
|  |  	else | ||
|  |  	    echo "No fail2ban enabled here" | ||
|  |  	    exit 1 | ||
|  |  	fi | ||
|  |      ;; | ||
|  |     *) | ||
|  | 	echo "usage : $0 [ssh|ipt|f2b|....]" | ||
|  |         exit 1 | ||
|  |     ;; | ||
|  | esac | ||
|  | 
 | ||
|  | 
 | ||
|  | # files of the day | ||
|  | RESFILE="$STATDIR/${PREF}_ip.lst" | ||
|  | RES2FILE="$STATDIR/${PREF}_country.lst" | ||
|  | # permanent files | ||
|  | BASEFILE="$STATDIR/Base_${PREF}_ip.lst" | ||
|  | BASE2FILE="$STATDIR/Base_${PREF}_country.lst" | ||
|  | ARCHFILE="$STATDIR/ArchBase_${PREF}_ip.lst" | ||
|  | ARCH2FILE="$STATDIR/ArchBase_${PREF}_country.lst" | ||
|  | # tempo | ||
|  | TMPFILE=$(mktemp $STATDIR/xt_${PREF}.XXXXXXX) | ||
|  | # Day - 1 | ||
|  | MONTH=$(date --date '1 day ago' +%B) | ||
|  | LOGDAY="$(LC_ALL=C date --date '1 day ago' '+%h %e')" | ||
|  | DATE=$(date --date '1 day ago' '+%Y-%m-%d') | ||
|  | ARCHDATE=$(date --date '90 day ago' '+%Y-%m-%d') | ||
|  | [[ $PREF = 'f2b' ]] && LOGDAY=$DATE | ||
|  | 
 | ||
|  | cd $EXECDIR | ||
|  | 
 | ||
|  | # yesterday already in base ? | ||
|  | if  [ -f $BASEFILE ] | ||
|  | then | ||
|  |     if (fgrep $DATE $BASEFILE > /dev/null 2>&1) | ||
|  |     then  | ||
|  |         echo "$0 : $PREF already run for that date. Please verify this !" | ||
|  |         exit 1 | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | cp /dev/null $RESFILE | ||
|  | 
 | ||
|  | # All logfiles update for 2 days, not empty | ||
|  | for file in $(find $LOGDIR/* -type f -mtime -2 -size +50c) | ||
|  | do | ||
|  | #    echo "$(echo $CMD1 $file $CMD2 \'^"$LOGDAY"\' $CMD3)" | ||
|  |     eval "$(echo $CMD1 $file $CMD2 \'^"$LOGDAY"\' $CMD3)" | ||
|  | done | ||
|  | 
 | ||
|  | # number of incidents by IP, sorted by IP | ||
|  | awk  -F ";" -v OFS=";" \ | ||
|  |  '{t[$1]=$1; t1[$1]+=1} END {for(n in t) print t[n], t1[n]}' $RESFILE | sort -t ";" -n -k 1 > $TMPFILE | ||
|  | 
 | ||
|  | # +date, +country code | ||
|  | awk -F ";" -v v1=$DATE -v OFS=";" \ | ||
|  | '{ printf "%s",v1 ";" $0 ";"; system("./geoip_look " $1) }' $TMPFILE > $RESFILE | ||
|  | 
 | ||
|  | # number of incidents by country code, sorted reverse by number | ||
|  | awk -F ";" -v v1=$DATE -v OFS=";" \ | ||
|  |  '{t[$4]=$4; t1[$4]+=$3} END {for(n in t) print v1, t[n], t1[n]}' $RESFILE | sort -t ";" -k 3 -r -n > $RES2FILE | ||
|  | 
 | ||
|  | rm -f $TMPFILE | ||
|  | 
 | ||
|  | # concatenate into bases | ||
|  | cat $RESFILE >> $BASEFILE | ||
|  | cat $RES2FILE >> $BASE2FILE | ||
|  | 
 | ||
|  | touch ${TMPFILE}_last3m | ||
|  | touch ${TMPFILE}_older | ||
|  | 
 | ||
|  | # split IP bases file between 'last 3 months' and 'archives' | ||
|  | awk -F ';' "\$1 > \"$ARCHDATE\" {print > (\"${TMPFILE}_last3m\"); next} {print > (\"${TMPFILE}_older\")}" $BASEFILE | ||
|  | 
 | ||
|  | if [ -f ${TMPFILE}_older ] | ||
|  | then | ||
|  |     cat ${TMPFILE}_older >> $ARCHFILE | ||
|  |     cp ${TMPFILE}_last3m $BASEFILE | ||
|  | fi | ||
|  | cp /dev/null ${TMPFILE}_last3m | ||
|  | cp /dev/null ${TMPFILE}_older | ||
|  |   | ||
|  | # split COUNTRY bases file between 'last 3 months' and archives | ||
|  |  awk -F ';' "\$1 > \"$ARCHDATE\" {print > (\"${TMPFILE}_last3m\"); next} {print > (\"${TMPFILE}_older\")}" $BASE2FILE | ||
|  |   | ||
|  | if [ -f ${TMPFILE}_older ] | ||
|  | then | ||
|  |      cat ${TMPFILE}_older >> $ARCH2FILE | ||
|  |      cp ${TMPFILE}_last3m $BASE2FILE | ||
|  | fi | ||
|  | 
 | ||
|  | rm -f ${TMPFILE}_last3m ${TMPFILE}_older | ||
|  | 
 | ||
|  | # for mail | ||
|  | if [ -s $RES2FILE ] | ||
|  | then | ||
|  |     echo "parse $LOGDIR for $PREF events" | ||
|  |     cat $RES2FILE | ||
|  | fi | ||
|  | 
 | ||
|  | # delete files of today | ||
|  | #rm -f $RESFILE $RES2FILE | ||
|  | 
 |