Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229505
  • 博文数量: 32
  • 博客积分: 2318
  • 博客等级: 大尉
  • 技术积分: 298
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-14 01:07
个人简介

新博客: http://qinchuan.me

文章分类
文章存档

2012年(2)

2011年(7)

2010年(6)

2009年(8)

2008年(9)

分类:

2011-05-28 02:31:54

无限发现他的ssh服务器有人企图暴力破解账号,我也自查了一下,发现我也一样受到了此类攻击,ssh中的相关log如下:

  1. May 10 23:20:21 localhost sshd[9075]: Invalid user x from x.x.x.x
明显x.x.x.x在进行账号猜测。随即写了个ruby脚本,监控sshd的此类日志,并对连续输错用户名十次以上的IP用iptables进行封堵。

  1. #!/usr/bin/ruby
  2. #

  3. class Daemon
  4.   def Daemon.start
  5.     exit!(0) if fork
  6.     Process::setsid
  7.     exit!(0) if fork
  8.     Dir::chdir("/")
  9.     File::umask(0)
  10.     STDIN.reopen("/dev/null")
  11.     STDOUT.reopen("/dev/null", "w")
  12.     STDERR.reopen("/dev/null", "w")
  13.     yield if block_given?
  14.   end
  15. end

  16. def block_ip(ip)
  17.   cmd = "iptables -A block_ip -s #{ip} -j DROP"
  18.   system(cmd)
  19. end

  20. def block_invalid(filename)
  21.   block_limit = 10

  22.   log_file = File.new(filename)
  23.   ips = Hash.new
  24.   blocked_ips = Hash.new
  25.   log_file.each do |line|
  26.     field = line.split
  27.     if field[5] == "Invalid"
  28.       ip = field[field.length - 1]
  29.       if ips.key?(ip)
  30.         ips[ip] += 1
  31.       else
  32.         ips[ip] = 1
  33.       end
  34.       if ips[ip] > block_limit and not blocked_ips.key?(ip)
  35.         blocked_ips[ip] = 1
  36.         block_ip(ip)
  37.       end
  38.     end
  39.   end
  40. end

  41. if system("iptables -nvL block_ip &>/dev/null")
  42.   system("iptables -F block_ip")
  43. else
  44.   system("iptables -N block_ip")
  45.   system("iptables -I INPUT -j block_ip")
  46. end

  47. Daemon.start do
  48.   block_invalid("/var/lib/myips.fifo")
  49. end
本质上,这就是一个简单的LIPS--基于日志的入侵防护系统。
阅读(1084) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~