免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 14683 | 回复: 25

[FreeBSD] 【经验分享】ssh扫描封堵的实现过程 [复制链接]

论坛徽章:
0
发表于 2012-07-14 02:56 |显示全部楼层
本帖最后由 ulovko 于 2012-08-28 21:08 编辑

一旦把你的主机挂到网上,那你想免除扫描是不可能的,但有人在窥探你的“私家”空间总是一件让人感觉不怎么好的事。前阵子刚学Python,正好拿来练手。经过一段时间的摸索现已基本完备,于是决定拿出来晒,以集思广益。


目标:

切断扫描的手;统计看是谁最恶最毒。


思路:

扫描auth.log并入库;根据库中的数据情况,按照一定的策略提取出某些恶毒的IP,生成ipfw规则加以封堵。统计……


实现:

1.入库

没什么可说的,每分钟扫一次log文件,如果某记录的时间比库中最后记录的时间还要“新”,则把该记录入库。

尽管没什么可说的,但还是要注意:记录量非常大,在设计时得考虑效率问题。我在操作时为了找出“近来重复访问”的IP,查询时花了20+分钟,更巧的是正好那时有个脑残的人帮我在数据库中增加了1.5W条记录——真TNND晕。后来采取以下措施解决:功能分散,一个脚本别做太多的工作;给数据库减肥,只保留“足够长”时间段内的记录,其他的移进历史表;“近来重复访问”的IP改用新表来记录,入库时就检查这IP是不是“经常造访”,如果是则顺便记录到新的表中。

目前我是用一个脚本实现,功能为:入库;核对“经常造访”IP并记录;根据策略提取IP并加入ipfw规则;脚本运行情况记录到单独的log里面;备份和清除足够久远的记录。

策略定义:[(minute,times,limit),...],如[(2,5,10),(5,10,15),(60,20,20)]分别定义了三个规则“2分钟内有5条记录”、“5分钟内有10条记录”、“20分钟内有20条记录”,只要符合这些规则的IP将被提取出来并进入防火墙禁止访问规则。后面的limit是本类规则总IP数,在2分钟规则中limit=10意思是“两分钟内不管有多少个不同的IP扫描记录,最多只取前10个IP”。为什么这样做大家想想就会明白。

执行ipfw命令用以下的代码:
  1. ...
  2. import commands
  3. ...
  4. t="/sbin/ipfw -q add %d deny ip from %s to 10.0.0.251 22" % (GROUP*1000+NO,IP)
  5. (t,tmp)=commands.getstatusoutput(t)
复制代码
2.统计

有了原始数据后,想做统计就方便得多了。可以用php+apache动态实现,当然也可以用python生成表态的。我是用python+rrdtool+apache。

rrdtool看似复杂,其实不难。如我要生成下面的表(5分钟时长)

  1.          last    max   min    avg
  2. 2m        *       *       *       *
  3. 5m        *       *       *       *
  4. 10m      *       *       *       *
  5. 30m      *       *       *       *
  6. 1h        *       *       *       *
  7. 2h        *       *       *       *
  8. 12h      *       *       *       *
  9. 1d        *       *       *       *
  10. 2d        *       *       *       *
  11. 6d        *       *       *       *
  12. 15d      *       *       *       *
  13. 30d      *       *       *       *
  14. 60d      *       *       *       *
复制代码
其对应的命令为:
  1. rrdtool create fbsshd.rrd \
  2. --start 0 \
  3. --step 300 \
  4. DS:2m:GAUGE:600:0:U \
  5. DS:5m:GAUGE:600:0:U \
  6. DS:10m:GAUGE:600:0:U \
  7. DS:30m:GAUGE:600:0:U \
  8. DS:1h:GAUGE:600:0:U \
  9. DS:2h:GAUGE:600:0:U \
  10. DS:12h:GAUGE:600:0:U \
  11. DS:1d:GAUGE:600:0:U \
  12. DS:2d:GAUGE:600:0:U \
  13. DS:6d:GAUGE:600:0:U \
  14. DS:15d:GAUGE:600:0:U \
  15. DS:30d:GAUGE:600:0:U \
  16. DS:60d:GAUGE:600:0:U \
  17. RRA:AVERAGE:0.5:1:600 \
  18. RRA:AVERAGE:0.5:4:600 \
  19. RRA:AVERAGE:0.5:24:600 \
  20. RRA:AVERAGE:0.5:288:730 \
  21. RRA:MAX:0.5:1:600 \
  22. RRA:MAX:0.5:4:600 \
  23. RRA:MAX:0.5:24:600 \
  24. RRA:MAX:0.5:288:730 \
  25. RRA:MIN:0.5:1:600 \
  26. RRA:MIN:0.5:4:600 \
  27. RRA:MIN:0.5:24:600 \
  28. RRA:MIN:0.5:288:730 \
  29. RRA:LAST:0.5:1:600 \
  30. RRA:LAST:0.5:4:600 \
  31. RRA:LAST:0.5:24:600 \
  32. RRA:LAST:0.5:288:730
复制代码
至于上面的各参数具体区别,我也还没有参得透,碰到问题就google吧。

更新数据更加容易,如这一刻13类的记录数分别为(0:0:1:0:0:0:2:0:1:9:11:7:9),则对应的rrdtool命令为:
  1. rrdtool update fbsshd.rrd N:0:0:1:0:0:0:2:0:1:9:11:7:9
复制代码
画图也不太难,在这里就不深入谈论。嘿嘿,我是菜鸟一个,也深入不了。

rrdtool命令与python中的rrdtool的区别不大,下面的py代码与上面的命令对比一下你就能明白:
  1. ...
  2. import rrdtool
  3. ...
  4. sql='N'
  5. for tmp in range(1,14):
  6.         sql+=':'+str(coun[tmp])
  7. #sql串类似于N:0:0:1:0:0:0:2:0:1:9:11:7:9
  8. tmp=rrdtool.update('/usr/local/www/rrdtool/rrd/fbsshd.rrd',sql)
  9. if tmp:
  10.         print rrdtool.error()
  11. ...
  12. t="-t 2 Day of login (%s)" % NOW
  13. ret = rrdtool.graph( "/usr/local/www/apache22/data/rrd/fbsshd_daily.png", "--start", "-2d",
  14. "-w 670","-h 200",
  15. t,
  16. "--vertical-label=FB sshd login count",

  17. "DEF:2m=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2m:LAST",
  18. "DEF:2ma=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2m:MAX",
  19. "DEF:2mi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2m:MIN",
  20. "DEF:2mv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2m:AVERAGE",

  21. "DEF:5m=/usr/local/www/rrdtool/rrd/fbsshd.rrd:5m:LAST",
  22. "DEF:5ma=/usr/local/www/rrdtool/rrd/fbsshd.rrd:5m:MAX",
  23. "DEF:5mi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:5m:MIN",
  24. "DEF:5mv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:5m:AVERAGE",

  25. "DEF:10m=/usr/local/www/rrdtool/rrd/fbsshd.rrd:10m:LAST",
  26. "DEF:10ma=/usr/local/www/rrdtool/rrd/fbsshd.rrd:10m:MAX",
  27. "DEF:10mi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:10m:MIN",
  28. "DEF:10mv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:10m:AVERAGE",

  29. "DEF:30m=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30m:LAST",
  30. "DEF:30ma=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30m:MAX",
  31. "DEF:30mi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30m:MIN",
  32. "DEF:30mv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30m:AVERAGE",

  33. "DEF:1h=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1h:LAST",
  34. "DEF:1ha=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1h:MAX",
  35. "DEF:1hi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1h:MIN",
  36. "DEF:1hv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1h:AVERAGE",

  37. "DEF:2h=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2h:LAST",
  38. "DEF:2ha=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2h:MAX",
  39. "DEF:2hi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2h:MIN",
  40. "DEF:2hv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2h:AVERAGE",

  41. "DEF:12h=/usr/local/www/rrdtool/rrd/fbsshd.rrd:12h:LAST",
  42. "DEF:12ha=/usr/local/www/rrdtool/rrd/fbsshd.rrd:12h:MAX",
  43. "DEF:12hi=/usr/local/www/rrdtool/rrd/fbsshd.rrd:12h:MIN",
  44. "DEF:12hv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:12h:AVERAGE",

  45. "DEF:1d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1d:LAST",
  46. "DEF:1da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1d:MAX",
  47. "DEF:1di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1d:MIN",
  48. "DEF:1dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:1d:AVERAGE",

  49. "DEF:2d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2d:LAST",
  50. "DEF:2da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2d:MAX",
  51. "DEF:2di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2d:MIN",
  52. "DEF:2dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:2d:AVERAGE",

  53. "DEF:6d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:6d:LAST",
  54. "DEF:6da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:6d:MAX",
  55. "DEF:6di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:6d:MIN",
  56. "DEF:6dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:6d:AVERAGE",

  57. "DEF:15d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:15d:LAST",
  58. "DEF:15da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:15d:MAX",
  59. "DEF:15di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:15d:MIN",
  60. "DEF:15dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:15d:AVERAGE",

  61. "DEF:30d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30d:LAST",
  62. "DEF:30da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30d:MAX",
  63. "DEF:30di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30d:MIN",
  64. "DEF:30dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:30d:AVERAGE",

  65. "DEF:60d=/usr/local/www/rrdtool/rrd/fbsshd.rrd:60d:LAST",
  66. "DEF:60da=/usr/local/www/rrdtool/rrd/fbsshd.rrd:60d:MAX",
  67. "DEF:60di=/usr/local/www/rrdtool/rrd/fbsshd.rrd:60d:MIN",
  68. "DEF:60dv=/usr/local/www/rrdtool/rrd/fbsshd.rrd:60d:AVERAGE",

  69. "AREA:2m#FF0000:#1 ",
  70. "STACK:5m#FF00FF:#2 ",
  71. "STACK:10m#FF897C:#3 ",
  72. "STACK:30m#00FF00:#4 ",
  73. "STACK:1h#F5F800:#5 ",
  74. "STACK:2h#00BED9:#6 ",
  75. "STACK:12h#00234B:#7 ",
  76. "STACK:1d#8D85F3:#8 ",
  77. "STACK:2d#AFECED:#9 ",
  78. "STACK:6d#8F9286:#10 ",
  79. "STACK:15d#AAABA1:#11 ",
  80. "STACK:30d#CDCFC4:#12 ",
  81. "STACK:60d#D2D8F9:#13 ",
  82. "COMMENT:\\r",
  83. "COMMENT:\\n",
  84. "COMMENT:\\n",
  85. "COMMENT:        2m",
  86. "COMMENT:   5m",
  87. "COMMENT:  10m",
  88. "COMMENT:  30m",
  89. "COMMENT:   1h",
  90. "COMMENT:   2h",
  91. "COMMENT:  12h",
  92. "COMMENT:   1d",
  93. "COMMENT:   2d",
  94. "COMMENT:   6d",
  95. "COMMENT:   15d",
  96. "COMMENT:   30d",
  97. "COMMENT:   60d",
  98. "COMMENT:\\n",
  99. "GPRINT:2m:LAST:Last\:%5.0lf",
  100. "GPRINT:5m:LAST:%5.0lf",
  101. "GPRINT:10m:LAST:%5.0lf",
  102. "GPRINT:30m:LAST:%5.0lf",
  103. "GPRINT:1h:LAST:%5.0lf",
  104. "GPRINT:2h:LAST:%5.0lf",
  105. "GPRINT:12h:LAST:%5.0lf",
  106. "GPRINT:1d:LAST:%5.0lf",
  107. "GPRINT:2d:LAST:%5.0lf",
  108. "GPRINT:6d:LAST:%5.0lf",
  109. "GPRINT:15d:LAST:%6.0lf",
  110. "GPRINT:30d:LAST:%6.0lf",
  111. "GPRINT:60d:LAST:%6.0lf",
  112. "COMMENT:\\n",
  113. "GPRINT:2ma:MAX: Max\:%5.0lf",
  114. "GPRINT:5ma:MAX:%5.0lf",
  115. "GPRINT:10ma:MAX:%5.0lf",
  116. "GPRINT:30ma:MAX:%5.0lf",
  117. "GPRINT:1ha:MAX:%5.0lf",
  118. "GPRINT:2ha:MAX:%5.0lf",
  119. "GPRINT:12ha:MAX:%5.0lf",
  120. "GPRINT:1da:MAX:%5.0lf",
  121. "GPRINT:2da:MAX:%5.0lf",
  122. "GPRINT:6da:MAX:%5.0lf",
  123. "GPRINT:15da:MAX:%6.0lf",
  124. "GPRINT:30da:MAX:%6.0lf",
  125. "GPRINT:60da:MAX:%6.0lf",
  126. "COMMENT:\\n",
  127. "GPRINT:2mi:MIN: Min\:%5.0lf",
  128. "GPRINT:5mi:MIN:%5.0lf",
  129. "GPRINT:10mi:MIN:%5.0lf",
  130. "GPRINT:30mi:MIN:%5.0lf",
  131. "GPRINT:1hi:MIN:%5.0lf",
  132. "GPRINT:2hi:MIN:%5.0lf",
  133. "GPRINT:12hi:MIN:%5.0lf",
  134. "GPRINT:1di:MIN:%5.0lf",
  135. "GPRINT:2di:MIN:%5.0lf",
  136. "GPRINT:6di:MIN:%5.0lf",
  137. "GPRINT:15di:MIN:%6.0lf",
  138. "GPRINT:30di:MIN:%6.0lf",
  139. "GPRINT:60di:MIN:%6.0lf",
  140. "COMMENT:\\n",
  141. "GPRINT:2mv:AVERAGE: Avg\:%5.1lf",
  142. "GPRINT:5mv:AVERAGE:%5.1lf",
  143. "GPRINT:10mv:AVERAGE:%5.1lf",
  144. "GPRINT:30mv:AVERAGE:%5.1lf",
  145. "GPRINT:1hv:AVERAGE:%5.1lf",
  146. "GPRINT:2hv:AVERAGE:%5.1lf",
  147. "GPRINT:12hv:AVERAGE:%5.1lf",
  148. "GPRINT:1dv:AVERAGE:%5.1lf",
  149. "GPRINT:2dv:AVERAGE:%5.1lf",
  150. "GPRINT:6dv:AVERAGE:%5.1lf",
  151. "GPRINT:15dv:AVERAGE:%6.1lf",
  152. "GPRINT:30dv:AVERAGE:%6.1lf",
  153. "GPRINT:60dv:AVERAGE:%6.1lf",
  154. "COMMENT:\\n")
  155. if ret:
  156.         print rrdtool.error()
复制代码
这是画图的效果:
fbsshd_daily.png


夜深了,睡觉去了。欢迎坛友先辈们拍砖。

评分

参与人数 1可用积分 +6 收起 理由
gvim + 6 赞一个!

查看全部评分

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
发表于 2012-07-14 20:16 |显示全部楼层
有点高深,需要慢慢消化。

论坛徽章:
0
发表于 2012-07-16 10:08 |显示全部楼层
回复 2# lsstarboy


    要消化请移步到前辈ailms的帖子RRDtool简体中文教程 v1.01,在那我受益多多。

论坛徽章:
29
技术图书徽章
日期:2013-09-02 19:59:502015元宵节徽章
日期:2015-03-06 15:51:332015小元宵徽章
日期:2015-03-06 15:57:20操作系统版块每日发帖之星
日期:2015-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17操作系统版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之水原三星
日期:2015-10-30 00:06:07数据库技术版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2016-01-07 10:32:07操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-05-18 06:20:00IT运维版块每日发帖之星
日期:2016-07-23 06:20:00
发表于 2012-07-16 10:14 |显示全部楼层
先收下来,这个暂时不研究

论坛徽章:
0
发表于 2012-07-26 13:27 |显示全部楼层
措施得当——在主页上公布“光临”过“访客”的IP,让蜘蛛把这些恶意IP收集。
效果明显——下面是近段时间规则选出来的IP情况,由原来的40条减到今天的26条。

近来规则选出的记录数

近来规则选出的记录数

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
发表于 2012-07-26 13:37 |显示全部楼层
感谢分享 精品! ^_^

论坛徽章:
0
发表于 2012-07-26 13:41 |显示全部楼层
回复 6# ulovko


    谢谢支持。感觉老大您时时刻刻在泡CU。

论坛徽章:
0
发表于 2012-07-27 10:25 |显示全部楼层
本帖最后由 ljwsy 于 2012-07-27 10:25 编辑

哟,加精呢,没想到。

昨天发个图是想让大家知道个长远效果如何,总不能有始无终吧。没想到变“精”了,倒象是讨要来的……

谢谢大家的支持与关注。

论坛徽章:
0
发表于 2012-08-13 23:19 |显示全部楼层
帮顶!!!!

论坛徽章:
0
发表于 2012-08-14 01:06 |显示全部楼层
谢谢大家的围观。

真的不敢当为“精华”帖,我只觉得本帖能体现我的观点:只有想不到的,没有做不到的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP