我们可以通过脚本来编写实现一个功能,就是多次尝试登录系统,并且登录的过程全部失败,这种用户就检测并生成报告
显示登录的账户
登录的次数
登录的IP
IP对应的主机
登录的时间段
我们就可以编写一个shell脚本,可以扫描日志文件,得到不同的数据,然后使用host命令利用IP找到对应的主机
脚本如下
#! /bin/bash
AUTHLOG=/var/log.auth.log if [[ -n $1 ]]; then AUTHLOG=$1 echo Using Log file : $AUTHLOG fi LOG=/tmp/valid.$$.log grep -v “invalid” $AUTHLOG > %LOG users=$(grep “Failed password” $LOG | awk ‘{ print $(NF-5) }’ | sort | uniq) printf “%-5s|%-10s|%-13s|%-33s|%s\n” “Sr#” “User” “Attempts” “IP address” “Host_Mapping” “Time range” ucount=0; ip_list=”$(egrep -o “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” $LOG | sort | uniq)” for ip in $ip_list; do grep $ip $LOG > /tmp/temp.$$.log for user in $users; do grep $user /tmp/temp.$$.log > /tmp/$$.log for user in $user; do grep $user /tmp/temp.$$.log > /tmp/$$.log cut -c -16 /tmp/$$.log > $$.time tstart=$(head -1 $$.time); start=$(date -d “$tstart” “+%s”); tend=$(tail -1 $$.time); end=$(date -d “$tend” “+%s” ) limit=$(( $end – $start )) if [ $limit -gt 120 ]; then let ucount++; IP=$(egrep -o “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” /tmp/$$.log | head -1 ); tart–>$tend” TIME_RANGE=”$ts ATTEMPTS=$(cat /tmp/$$.log|wc -l); HOST=$(host $IP | awk ‘{print $NF}’) printf “%-5s|%-10s|%-10s|%-10s|%-33s|%-s\n” “$ucount” “$user” “$ATTEMPTS” “$IP” “$HOST” “$TIME_RANGE”; fi done done rm /tmp/valid.$$.log /tmp/%%.log $$.time /tmp/temp.$$.log 2> /dev/null |
其原理在于:
1.我们首先查看有没有用户指定某个日志文件去读取,不然就使用默认的日志文件
2.我们只需要记录合法登录的用户信息,如果是非法的登录,会记录类似 Failed password for invalid user bob from 203.83 248.32 port 7016 ssh2 的一行数据
我们将除了这种类型数据进行了排除,使用的是grep -v的选项,这样我们将所有的剩余写入了临时文件
3.我们找出所有失败的IP地址,我们使用了正则表达式,然后遍历了所有的IPList,将所有匹配的IP行进行了迭代,并进行了写入,算是个排序吧
4.然后我们利用awk去提取用户名,NF命令是倒序返回的 NF-5是倒数第6个单词的列号,我们利用sort uniq来生成一个没有重复的用户列表
然后循环这个用户列表,我们我们获取到了每一个用户的日志行,
然后利用cut命令获取到了时间戳,然后分别利用head -1 tail -1获取第一行和最后一行
这样,方便我们计算了时间戳,我们利用date,转换为了秒数,然后计算差值
判断差值大于120秒后,我们就要生成日志
然后分别取出 日志行数,IP地址,花费时间,进行一个printf的打印