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
|
||
|
|