Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22092
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 42
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-24 11:08
文章分类
文章存档

2015年(3)

2014年(1)

我的朋友

分类: 网络与安全

2015-03-27 17:11:24

    在工作中,我发现只要开放到公网的主机,都会受到各种攻击的威胁,常见的就是ssh暴力破解,以下是一个python脚本,对/var/log/secure登录日志中的ssh记录进行简单分析,并将一周内多次进行破解试探的ip地址,存入到/etc/hosts.deny中拒绝其连接,代码于centos6.5下测试正常工作。如需定期执行,可以配合crond使用。

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # Hackers try to login in servers by ssh too much times, in /var/log/secure you can find it .The script will add hackers's ip to /etc/hosts.deny last a week
  3. #by hank 2015-03-27

  4. import re
  5. from datetime import date

  6. logfile = r'/var/log/secure'
  7. denyfile = r'/etc/hosts.deny'
  8. months_31 = ['Jan','Mar','May','Jul','Aug','Oct','Dec']
  9. months_30 = ['Apr','Jun','Sep','Nov']
  10. month_28or29 = 'Feb'
  11. months = {
  12.           'Jan':1,'Feb':2,'Mar':3,'Apr':4,'May':5,'Jun':6,
  13.           'Jul':7,'Aug':8,'Sep':9,'Oct':10,'Nov':11,'Dec':12
  14.          }
  15. month_days = {}
  16. for mon in months_31:
  17.     month_days[mon] = 31
  18. for mon in months_30:
  19.     month_days[mon] = 30
  20. if date.isocalendar(date.today())[0] % 4 == 0:
  21.     month_days[month_28or29] = 29
  22. else:
  23.     month_days[month_28or29] = 28

  24. def search_source():
  25.     t = date.today()
  26.     month = t.strftime('%b')
  27.     day = t.strftime('%d')
  28.     pat = re.compile('.+sshd.+Failed password.+ (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) .+')
  29.     lines = []
  30.     f = open(logfile,'r')
  31.     for line in f:
  32.         if line.split()[0] == month and (int(day) - int(line.split()[1])) < 7 and (int(day) - int(line.split()[1])) >= 0:
  33.             if re.search(pat,line):
  34.                  lines.append(line)
  35.         elif (months[month] - months[line.split()[0]]) == 1 or (months[month] - months[line.split()[0]]) == -11:
  36.             if (int(day) + month_days[line.split()[0]] - int(line.split()[1])) < 7 and re.search(pat,line):
  37.                 lines.append(line)
  38.     return lines

  39. def count_ips(lines):
  40.     count = {}
  41.     if len(lines) == 0:
  42.         print 'No one use ssh and failed.'
  43.         raise SystemExit
  44.     pat = re.compile(' (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ')
  45.     for line in lines:
  46.         ip = re.findall(pat,line)[0]
  47.         if ip in count:
  48.             count[ip] += 1
  49.         else:
  50.             count[ip] = 1
  51.     return count

  52. def deny_ips(count):
  53.     f = open(denyfile,'w')
  54.     valve = 50
  55.     for ip in count:
  56.         if count[ip] >= valve:
  57.             word = 'ALL: %s #failed %d times in a week.\n' % (ip,count[ip])
  58.             f.write(word)
  59.     f.close()

  60. def main():
  61.     lines = search_source()
  62.     count = count_ips(lines)
  63.     deny_ips(count)

  64. if __name__ == '__main__
  65.     main()
如果使用非root账户,那么得对这两个文件具有读(/var/log/secure)写(/etc/hosts.deny)权限方可进行。
使用方法:

点击(此处)折叠或打开

  1. #cp /etc/hosts.deny /etc/hosts.deny.bak #备份源文件
  2. #vim much_failed_ssh_deny.py #添加代码
  3. #chmod +x much_failed_ssh_deny.py #授予执行权限
  4. #./much_failed_ssh_deny.py #执行脚本
  5. #cat /etc/hosts.deny  #查看结果

阅读(5172) | 评论(0) | 转发(0) |
0

上一篇:python核心编程第六章第八题

下一篇:没有了

给主人留下些什么吧!~~