我们可以通过脚本来编写实现一个功能,就是多次尝试登录系统,并且登录的过程全部失败,这种用户就检测并生成报告

显示登录的账户

登录的次数

登录的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的打印

发表评论

邮箱地址不会被公开。 必填项已用*标注