如何禁掉扫描机器的 IP(通过 ssh 认证记录分析)

发表于:2007-07-04来源:作者:点击数: 标签:
刚写了一个分析/var/log/secure日志,自动阻断入侵者IP的script 适用系统: Linux 有不足之处请大家指点 [code:1:6f82d78e64] #!/bin/bash #获取前1分钟内的secure记录,统计ssh认证失败的IP和其失败次数 SCANNER=`grep\`date\+%d%H%M\-d\-1min\\`/var/log/s

刚写了一个分析 /var/log/secure 日志,自动阻断入侵者 IP 的 script
适用系统:Linux
有不足之处请大家指点
[code:1:6f82d78e64]
#! /bin/bash
# 获取前 1 分钟内的 secure 记录,统计 ssh 认证失败的 IP 和其 失败次数
SCANNER=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'`

for i in $SCANNER
do
        # 取认证失败次数
        NUM=`echo $i|awk -F= '{print $1}'`

        # 取其 IP 地址
        IP=`echo $i|awk -F= '{print $2}'`

        # 若其在失败次数超过 5 次且之前没有被阻断过,那么添加一条策略将其阻断,并记录日志
        if [ $NUM -gt 5 ] && [ -z "`iptables -vnL INPUT|grep $IP`" ]
        then
                iptables -I INPUT -s $IP -m state --state NEW,RELATED,ESTABLISHED -j DROP
                echo "`date` $IP($NUM)" >> /var/log/scanner.log
        fi
done
[/code:1:6f82d78e64]



执行方式
用 crond 来运行,1 分钟运行 1 次


运行效果
[quote:6f82d78e64]
[root@platinum root]# iptables -vnL INPUT
Chain INPUT (policy DROP 548 packets, 67283 bytes)
 pkts bytes target     prot opt in     out     source               destination
  101 10240 DROP       all  --  *      *       211.248.100.100          0.0.0.0/0
        state NEW,RELATED,ESTABLISHED
[root@platinum root]#
[/quote:6f82d78e64]
[quote:6f82d78e64]
[root@platinum root]# cat /var/log/scanner.log
Sat Jul 16 10:27:22 CST 2005 211.248.100.100(15)
[root@platinum root]#
[/quote:6f82d78e64]

 扫净缘客 回复于:2005-07-16 10:40:09
我想问下啊.我通过规则以后

在我不登陆ssh的情况下

我的secure是没有其他记录的

要如何禁止其他人来扫描我啊 :em06:  :em06:

 platinum 回复于:2005-07-16 10:48:05
[quote:8416b0f494="扫净缘客"]我想问下啊.我通过规则以后

在我不登陆ssh的情况下

我的secure是没有其他记录的

要如何禁止其他人来扫描我啊 :em06:  :em06:[/quote:8416b0f494]
装了防盗门是为了防撬,你家没有门,买了一个防盗门放在家里,怎么防撬?
这个仅仅是通过 ssh 记录来判断是否扫描的

 零二年的夏天 回复于:2005-07-16 11:28:13
能用tail 来取1分钟不?

 platinum 回复于:2005-07-16 11:40:28
[quote:a0f5769509="零二年的夏天"]能用tail 来取1分钟不?[/quote:a0f5769509]
我想过,取多少不好定
少了可能漏信息,多了可能掺杂了其他时间的信息
如果用 tail,我没想好怎么取。。。。。
请夏天老师指教 :em06:

 零二年的夏天 回复于:2005-07-16 11:43:10
我没有实验环境,不知道这个命令行不行。我只是觉得pipe太多了。呵呵;)

[code:1:clearcase/" target="_blank" >cc7cebcaeb]tail -s 60 -f /var/log/secure|awk ... [/code:1:cc7cebcaeb]

----------
我是赋闲在家的劳力。

 platinum 回复于:2005-07-16 11:48:09
tail -s 60 -f /var/log/secure|awk ... 
这样以后 tail 一直接收 /var/log/secure 的信息,并每 60 秒显示一次最新的
我不清楚这样的信息能用来 for 吗?
for i in `tail -s 60 -f /var/log/secure|awk ......`

 platinum 回复于:2005-07-16 12:58:51
经测试,for i in `tail -s 60 -f /var/log/secure|awk ......` 的方法无法将新增加的内容提交给变量 i 去进入循环

 零二年的夏天 回复于:2005-07-16 16:14:04
是的。

呵呵,劳动的时候在想这个问题,发觉应该是错误的想法。

:)

 lxdlj 回复于:2005-07-25 10:28:25
经常在CU上见到这样的帖子,可我觉得费解的是:在实际情况中,真有必要这样做吗?

我的观点是:
1.系统安全的加固要根据具体的实际需求和定级别。
2.系统是开放的。如果你要怕别人攻击的话,那就把你的所有端口关掉吧。。。。
3。每天Internet上的类似的探测,扫描多了,你还真这样过滤啊。晕。。。。
4.安全是相对的。

 platinum 回复于:2005-07-25 10:55:21
安全是相对的,而我们做的每种方法也都是为了达到相对的安全

 lxdlj 回复于:2005-07-25 10:59:47
可是这些措施我觉得就真一点必要都没有。Internet上尝试扫描登陆的人多,IP也多了。
把SSH等配置好,完全不必要这样做。
就好比,你开个WWW服务,你与其花各种办法阻止SQL 注入,还不如把程序代码写好。

 platinum 回复于:2005-07-25 11:03:35
是的这个 script 也许有点脱离实际用途,主要应该加强各个 service 的安全,重要的在疏通,而不是堵
这个 script 仅仅是一个研究,对于脆弱的 sshd 还是很有一定帮助的

 我爱钓鱼 回复于:2005-07-25 11:04:42
有个问题请教一下:假如机器真的被人盯上了,疯狂扫描,这个脚本的性能如何?对机器的整体性能有影响吗?

 platinum 回复于:2005-07-25 11:06:37
[quote:faa5b147e2="我爱钓鱼"]有个问题请教一下:假如机器真的被人盯上了,疯狂扫描,这个脚本的性能如何?对机器的整体性能有影响吗?[/quote:faa5b147e2]
扫描的前 1 分钟和正常机器被扫描一样,机器负载可能比较高
之后这个 IP 马上被尽掉(处理过程大概 1 秒都不到),被 iptables 挡到外面,机器恢复平常状态

 lxdlj 回复于:2005-07-25 11:12:54
在CU上看到这类的贴子多了, 本来从来都是看贴不回贴的,但今天实在忍不住想说几句。
我想我们的研究如果脱离实际情况将有什么意义?想调查一下发言的几位有多少实际做过大型的实际运维工作?

与其把精力放在iptables上还不如去做点其他事情呢。iptables是个好东东,但想请问拿iptables + TC做流量控制,以及iptables 做什么拒绝SYNFlood连接,iptables自动拒绝SSH登陆,等等,这些想法很好,但适合实际的运维吗?

注:我很佩服CU里iptables的高手,但我觉得我们做这些工作的时候要更加的切合实际。
比如iptables+TC做流量控制,这事情不太可行的根本原因就在于iptables+TC无法根据应用层报文进行协议的分析。就好比dst port =25并不意味这就是SMTP服务

 platinum 回复于:2005-07-25 11:16:39
对于实际生产系统,可以会用专业的防火墙去处理
这些方法只是给我们这些没有对 TCP/IP 编程经验的“菜鸟”们用的^_^

 lxdlj 回复于:2005-07-25 11:19:27
注:我很佩服CU里iptables的高手,但我觉得我们做这些工作的时候要更加的切合实际。 
比如iptables+TC做流量控制,这事情不太可行的根本原因就在于iptables+TC无法根据应用层报文进行协议的分析。就好比dst port =25并不意味这就是SMTP服务,对这种情况下显然就无法应用于实际中

 platinum 回复于:2005-07-25 11:28:02
没有绝对,只有相对,就好比 TCP/25 ,是 SMTP 的概率有多少?没有 100% 可能也有 99% 了,所以就没必要去分析 packet 中的具体数据内容来判断是否为 SMTP
但好比 TCP/16881,这个虽然 BT 用的很多,但不一定就代表BT,且 BT 还会用到其他端口,因此要想匹配 BT 就需要分析 packet 里面的具体数据内容
任何事都没有绝对的,就好比这个 script,我的机器很烂,366MHz,如果有人扫描我,机器就受不了了,变得异常迟钝,因此我写了这样一个脚本,并贴出来大家共享,我并没有告诉大家要把这个用于生产,但这个对我来说确实实用,仅此而已:)

 采风 回复于:2005-07-25 12:01:57
[quote:1e5fbe056c="lxdlj"]注:我很佩服CU里iptables的高手,但我觉得我们做这些工作的时候要更加的切合实际。 
比如iptables+TC做流量控制,这事情不太可行的根本原因就在于iptables+TC无法根据应用层报文进行协议的分析。就好比dst port =2..........[/quote:1e5fbe056c]

啥场合需要“根据应用层报文进行协议的分析” :roll:

 soway 回复于:2005-07-26 08:36:17
这个方式还是有必要的。

当然,我这里设置更加严格一些,从主机前面的网络层面做了比较笨的ip地址限制。

也是因为我曾经一次发现好几个地方的破解测试。

 mocou 回复于:2005-07-26 08:56:00
[quote:a24c6c3793="lxdlj"]注:我很佩服CU里iptables的高手,但我觉得我们做这些工作的时候要更加的切合实际。 
比如iptables+TC做流量控制,这事情不太可行的根本原因就在于iptables+TC无法根据应用层报文进行协议的分析。就好比dst port =2..........[/quote:a24c6c3793]

iptables有一个模式支持应用层 :m01: l7

 waker 回复于:2005-07-26 09:16:56
http://bbs.chinaunix.net/forum/viewtopic.php?t=542583

科学就是在不断重复发现别人已经发现的东西:mrgreen:

 platinum 回复于:2005-07-26 09:28:43
[quote:5f7d9eb071="waker"]http://bbs.chinaunix.net/forum/viewtopic.php?t=542583

科学就是在不断重复发现别人已经发现的东西:mrgreen:[/quote:5f7d9eb071]
这个我早看过,和我这个原理不同,而且差很多
一个是统计总次数,一个是分析频率,当然,我若为他的方法好:)

 守夜人 回复于:2005-07-26 15:11:59
谢谢platinum贡献这么好的方法,目前正好在学shell~~~
不知能不能将此句分析一下(看了半天也没弄懂是什么意思,上机试也报错),platinum谢谢了

SCANNER=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'`

 platinum 回复于:2005-07-26 15:39:13
获取前 1 分钟内的 secure 记录,统计 ssh 认证失败的 IP 和其失败次数

 perryhg 回复于:2005-08-04 06:13:24
用tail总是不可靠,不能阻止flood以及应对logrotate对文件的截断,而且每分钟都运行对系统资源也是一种浪费,尤其是系统负荷高的时候。
我用java写了个监控程序,对所有failed login都记录其ip地址和失败的时间,如果30分钟内失败超过10次,那么就调用iptables屏蔽这个ip,至于怎么读取log,我用mkfifo 创建一个pipe,然后设置syslog把有关的日志同时也发送一份到这个pipe设备上,然后在java程序的单独线程里面读取这个pipe文件,这个程序以后台服务运行,这样重要的日志一条也漏不掉。为了防止内存占用过多,我只记录100个ip,超过100个最前面的自动删除,每个ip只记录10个login的时间,新记录进来最前面的自动删除。

原文转自:http://www.ltesting.net