LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1502|回复: 14

难题: /var/log/secure 日志内容处理的挑战

[复制链接]
发表于 2003-12-10 17:31:24 | 显示全部楼层 |阅读模式
这是我的/var/log/secure日志文件。
Dec  9 16:23:21 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19
Dec  9 16:23:21 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$0lMC7YxmzzkCAlgGl35gn. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec  9 16:23:32 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19
Dec  9 16:23:32 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$XkHs3kv.fhksGQMwCXC6g. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec  9 16:23:35 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19
Dec  9 16:23:35 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$0lMC7YxmzzkCAlgGl35gn. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec  9 16:24:16 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19
Dec  9 16:24:16 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$gfVz2yisY99bNN2VCf.zv. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec  9 16:24:20 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19
Dec  9 16:24:20 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$Ax6Y904/FJCP0V6jC55wg. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec  9 17:16:24 cvsserver sshd[8002]: Bad protocol version identification 'adf;kadf' from 192.168.0.19
Dec  9 17:26:00 cvsserver sshd[8006]: Accepted publickey for linxd from 192.168.0.19 port 3062 ssh2
Dec  9 17:26:18 cvsserver sshd[8045]: Accepted publickey for root from 192.168.0.19 port 3065 ssh2
Dec  9 17:36:56 cvsserver sshd[946]: Received signal 15; terminating.
Dec 10 08:30:16 cvsserver sshd[933]: Server listening on 0.0.0.0 port 22.
Dec 10 08:32:03 cvsserver sshd[975]: Accepted publickey for root from 192.168.0.19 port 1246 ssh2
Dec 10 13:39:25 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 13:39:49 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 13:39:49 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$0lMC7YxmzzkCAlgGl35gn. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 13:39:55 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 13:40:55 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 13:48:57 cvsserver sshd[3603]: Bad protocol version identification 'quot' from 192.168.0.19
Dec 10 13:50:29 cvsserver sshd[4340]: Accepted publickey for root from 192.168.0.19 port 2495 ssh2
Dec 10 14:01:05 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:01:05 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$guwXfUfT4LRwkUlIEu6OP0 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:01:11 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:01:51 cvsserver last message repeated 3 times
Dec 10 14:02:19 cvsserver last message repeated 3 times
Dec 10 14:02:19 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$ZDegfDyOQrALaxkTy1Crr/ vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:07 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:07 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$X0xklncwwV4eKH6pRyQAl0 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:09 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:09 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$X0xklncwwV4eKH6pRyQAl0 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:11 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:11 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$13rGkBVgY8nDxzv3ocA771 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:14 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:14 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0

我想完成以下的任务:
1。选择Dec 10 14:06:14 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19记录行,提取IP地址,根据cvspserver字段确定这条记录是cvspserver产生的。然后记录下时间
2。Dec 10 14:01:05 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$guwXfUfT4LRwkUlIEu6OP0 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
由此记录行中的mismatch字段来判断登陆失败。再跟据时间来在1中找到对应的ip地址。记录下用户名。
3。统计一天内同一个ip地址登陆失败的次数,若超过5次,则把他的ip地址添加到/etc/hosts.deny中,并在/etc/shadow中锁定此帐户,并发送邮件给系统管理员.
注意,/var/log/secure文件包括很多服务的日志信息,要提取出和cvspserver相关的日志记录,然后再作处理.

小弟愚笨,哪位大虾帮帮忙,谢谢
发表于 2003-12-11 00:11:16 | 显示全部楼层
确实是个挑战!
发表于 2003-12-11 00:15:19 | 显示全部楼层
不怎么明白楼主的意思。
关于Dec 10 14:06:14 cvsserver的就只有两行,你是要那日期吗?要提取那些关键字,请说清楚点。。或着你想实现什么功能就行了。

Dec 10 14:06:14 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:14 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs.
 楼主| 发表于 2003-12-11 09:00:06 | 显示全部楼层
动机是这样的:

linux本身没有多次登陆失败后锁定帐户这样的做法[或者是因为小弟愚昧无知,不知道],为防止cvs用户反复的登陆暴力破解密码,想加上些限制:
就是同一天内同一用户从同一ip登陆失败超过N次后,则封掉此ip地址![可选功能是同时记录下用户名,并能根据时间线绘制统计表格]

我需要做到:
1.根据Dec  9 16:24:20 cvsserver xinetd[7743]: START: cvspserver from=192.168.0.19这样的行中的字符串cvspserver和xinetd判断这一行是有关cvspserver的.在其中找到   a.时间.日期 b.ip地址.
2.Dec  9 16:24:20 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$Ax6Y904/FJCP0V6jC55wg. vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
在这一行中会有cvs 登陆失败的信息,根据password mismatch 来判断.如果cvs pserver登陆成功,则不会有这一行.由这一行,要做到:
   a.找出时间,日期   [并和1中列出的行中的日期相比较,如果是同一时间,则由此判断是这次登陆是通过1中的ip地址,而且登陆失败!]
   b.记录下同一天内失败的次数
3.综合1,2中的信息,得出结论:user1在某一天内通过某一IP登陆cvs pserver失败次数-->如果失败超过5次,则在/etc/hosts.deny中加入此ip,封掉它.并记录在文件里.
4.把此程序加到cron中,每五分钟检查一次/var/log/secure文件.


不好意思,不知这次说明白了没有
 楼主| 发表于 2003-12-11 09:10:13 | 显示全部楼层
Dec 10 14:06:07 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19//这是企图连接cvs server时的log
Dec 10 14:06:07 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$X0xklncwwV4eKH6pRyQAl0 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0//这是登陆失败的log
Dec 10 14:06:09 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19 //这是登陆成功的log,没有接下来的mismatch一行
Dec 10 14:06:11 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:11 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$13rGkBVgY8nDxzv3ocA771 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:14 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:14 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:16 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:16 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:18 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:18 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:20 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:20 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:21 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:21 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:23 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:23 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:26 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:26 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:28 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:28 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:06:30 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:06:30 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$EfTsFX09zb/xzYE6.lhG.1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 10 14:42:11 cvsserver sshd[6664]: Accepted publickey for root from 192.168.0.19 port 2801 ssh2
Dec 10 14:48:14 cvsserver xinetd[944]: START: cvspserver from=192.168.0.19
Dec 10 14:48:41 cvsserver last message repeated 2 times
Dec 10 14:48:41 cvsserver cvs: password mismatch for root: $1$xLgEQP9D$jzxpkupVPnRy0HZRa73Z11 vs. $1$xLgEQP9D$j3YJn8Ess5ZPK6o2Ym.Tx0
Dec 10 16:51:11 cvsserver sshd[8008]: Accepted password for root from 192.168.0.5 port 1026 ssh2//这些是有关ssh server的信息
Dec 11 08:23:10 cvsserver sshd[944]: Server listening on 0.0.0.0 port 22.//这些是有关ssh server的信息
Dec 11 08:29:58 cvsserver sshd[986]: Accepted publickey for root from 192.168.0.19 port 1167 ssh2//这些是有关ssh server的信息
Dec 11 09:00:38 cvsserver xinetd[955]: START: cvspserver from=192.168.0.19
Dec 11 09:01:01 cvsserver last message repeated 3 times//这是因为从同一ip登陆成功了两次后又登陆失败了一次,所以把本该重复三次的上一行压缩显示了
Dec 11 09:01:01 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$g.367x3AwJ8Qo22wg80Ei1 vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 11 09:01:35 cvsserver xinetd[955]: START: cvspserver from=192.168.0.19
Dec 11 09:01:35 cvsserver cvs: password mismatch for linxd: $1$.r2M1V0o$HIVTcbSQVGOoBNZHKfvpA/ vs. $1$.r2M1V0o$GxrQHPud3NHEGRUTguvmB0
Dec 11 09:01:59 cvsserver xinetd[955]: START: cvspserver from=192.168.0.19  //一行这是登陆成功的提示,没有接下来的mismatch一行
发表于 2003-12-11 11:47:47 | 显示全部楼层
不知道这个文件干嘛用的 :ask,不过根据你的意思是不是可以用last(个人觉得这个不错)之类的系统自带的日志工具来看呢?! 或者下载几个日志工具,这个链接讲述了多个日志工具的用法和其他日志工具的下载:
http://www.linuxsir.cn/postnuke/ ... rticle&sid=1273
发表于 2003-12-11 14:31:13 | 显示全部楼层
#!/bin/bash
old=`cat /share/tmp/xiao|awk '{print $3}'|cut -f1 -d ":"|head -n 1`
count=0
for i in $(cat /share/tmp/xiao|awk '{print $3}'|cut -f1 -d ":")
do
if [[ $old == $i ]] ;then
count=$((count+1))
else echo "datei      timecount ">>date_time
old=$i
count=0
fi
done
这是结果。
date:17      time:10
date:08      time:3
date:13      time:1
date:14      time:6

先弄好日期先。
不懂得处理awk '{print $1,$2,$3}' 在if()那里用${i}==${old}也不行,请教:help
 楼主| 发表于 2003-12-11 15:40:31 | 显示全部楼层
谢谢home,javalee先。

问题是这样的:
首先,我要过滤出包含cvs和password mismatch for USERNAME的行,因为这个log中间有很多其他认证过程的日志信息。
然后,根据上述行中的时间,找到这个时间点【一般为前一行】的xinetd记录,即包含xinetd[7743]: START: cvspserver from=192.168.0.19的这一行,从中找到ip地址。
然后对这个ip和失败次数统计……
这是小弟的awk文件。只能提取出失败的用户名和对应的日期。:confused:
我现在有几个问题:
awk的多维数组怎么遍历?
还有怎么在匹配某一行时转而处理它的上一行?比如下面脚本中匹配password mismatch时开始处理上一行中的xinted日志信息。

#!/bin/awk  -f
BEGIN {
        months="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
}
function monthdigit(mymonth) {
        return (index(months,mymonth)+3)/4
}

($0 ~ /cvs:/)&& ($0 ~ /mismatch/)&& ($0 ~/password/){
        count++
        month=monthdigit($1)
        day=$2
        username=substr($9,1,length($9)-1)
        #faillog[$month,$day,$username]+=1 #本想使用多维数组,可是不知在循环中怎么遍历
        print month "\t" day "\t" username
}
发表于 2003-12-11 16:20:04 | 显示全部楼层
这个问题从一开始就是失败的。
1、封ip是非常不好的,要考虑到局域网的人是用同一个ip的,所以不能封ip。
2、你的脚本运行后,我故意用你的或别人的ID登陆,就可以干掉一个局域网和一个ID.没有人骂你?

想其它的办法吧。
 楼主| 发表于 2003-12-11 16:44:50 | 显示全部楼层
其实这也不是我的想法,可是寄人篱下总有些事是由不得我自己的:confused:
还有些情况要说明:
首先,我的应用本来就是在一个局域网内,所以不存在你所说的情况1。
再者,我主要是想根据ip来控制,对用户名只是想做一个统计,锁定用户帐户的任务只是可选。
再者,我想趁此机会学习一下shell编程,怎么说这也算一个综合的应用。学习至上!:p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表