dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2160
  • 铜币13127枚
  • 威望5808点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:3703回复:3

保护 SSHD

楼主#
更多 发布于:2013-02-20 08:47
*** 过时请参考 4楼 ***
 
一台Linux 服务器(不能用iptables )每天都有ssh 暴力连接,统计下最多竟然达到5650次
1 secure 日志
/bin/awk '/Failed/{print $(NF-3)}' /var/log/secure | /bin/sort | /usr/bin/uniq -c  | sort -rn
  5650 123.29.68.70
     893 219.232.104.2
     139 87.110.156.171
     139 41.212.83.191
      75 111.74.82.33
      35 61.155.178.242
      32 201.236.80.4
      24 218.91.253.123
      15 122.194.200.3
       8 221.230.133.67
       7 190.146.233.184
       4 94.76.229.11
       4 77.76.109.119
       4 209.165.131.61
       3 208.254.58.144
       3 109.75.21.195
       2 93.189.94.179
       2 116.58.221.96
       2 109.75.21.200
       1 64.185.226.120
       1 138.100.78.80
 
 secure日志记录 61.155.178.242 这个ip尝试使用的账户 test/admin 等等

/bin/awk '/Failed/' /var/log/secure  | tail -n 35
 Oct  9 08:58:04 gw-new sshd[18864]: Failed password for root from 61.155.178.242 port 35336 ssh2
 Oct  9 08:58:06 gw-new sshd[18866]: Failed password for root from 61.155.178.242 port 36064 ssh2
...省略
 Oct  9 08:59:21 gw-new sshd[18930]: Failed password for root from 61.155.178.242 port 53268 ssh2
 Oct  9 08:59:22 gw-new sshd[18932]: Failed password for root from 61.155.178.242 port 54034 ssh2
 
 
 2 编写shell 脚本
思路:使用crontab 每3分钟执行一次defend_ssh.sh脚本, defend_ssh.sh调用 defend_ssh.awk 程序,awk 程序分析/var/log/secure日志,并输出超过20次的Failed ip地址由shell脚本输出到 /etc/hosts.deny 文件,以达到拒绝某IP的目的,由于secure日志将保留7天,所以 此IP 将被拒绝7天
crontab -l
 */3 * * * *  /root/sh/defend_ssh.sh >> /root/sh/cron_log 2>&1

cat defend_ssh.sh  
#!/bin/bash
#Defend sshd  
#Deny More than 20 black ip to "/etc/hosts.deny"
#/var/log/secure* log rotate every 7 days
#20120928 by dongnan
      
#variables
allow_num=20
      
#main
/bin/awk -v allow=$allow_num -f /root/sh/defend_ssh.awk /var/log/secure > /etc/hosts.deny

cat defend_ssh.awk
/Failed/ { ++S[$(NF-3)]}
END {
    for (a in S) {  
        if(S[a] > allow) print "sshd:"a
    }
}

awk 程序入门
-v 选项用于使用外部变量,这里在shell 中定义变量allow_num=20
-f 选项用于调用awk 程序
/Failed/ 为模式部分,具体是使用/正则表达式/ 匹配含有 Failed 行
{ ++S[$(NF-3)]} 为动作部分,使用数组每匹配一个Failed 则 ip([$(NF-3)]) 加1
END是特殊的动作,用于所有输入数据已经被处理完成之后,它多半用于产生摘要报告,这里则是使用循环for 读取数组S 元素 ,并使用if 语句判断是否大于20次,条件真则使用print 语句 输出。
 
  
3 测试-超过20次拒绝连接
awk '/refused/' /var/log/secure
 Oct  8 22:55:01 gw-new sshd[10324]: refused connect from ::ffff:218.91.253.123 (::ffff:218.91.253.123)
 Oct  9 06:25:03 gw-new sshd[18367]: refused connect from ::ffff:201.236.80.4 (::ffff:201.236.80.4)
 Oct  9 15:47:11 gw-new sshd[20491]: refused connect from ::ffff:61.155.178.242 (::ffff:61.155.178.242)
 Oct  9 16:31:38 gw-new sshd[20742]: refused connect from ::ffff:61.155.178.242 (::ffff:61.155.178.242)
 Oct  9 21:39:45 gw-new sshd[21892]: refused connect from ::ffff:61.155.178.242 (::ffff:61.155.178.242)
 Oct 10 07:05:03 gw-new sshd[30559]: refused connect from ::ffff:211.113.151.201 (::ffff:211.113.151.201)
 Oct 10 07:36:47 gw-new sshd[30668]: refused connect from ::ffff:61.155.178.242 (::ffff:61.155.178.242)
  

 
 参考
 用SHELL脚本来防SSH和vsftpd暴力破解
 
结束
 更多请:
 linux 相关 37275208
 vmware 虚拟化相关  166682360
本文出自 “dongnan” 博客,请务必保留此出处http://dngood.blog.51cto.com/446195/1068094
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2160
  • 铜币13127枚
  • 威望5808点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2013-04-18 18:00
#update 20130418 按天判断(每天每ip 错误次数超过规定次数,则加入hosts.deny)
#update 20150107 匹配 Invalid user

#crontab
* * * * * /root/sh/defend_ssh.sh > /root/sh/cron.log 2>&1

#shell 文件
cat defend_ssh.sh 
############################
############################
#!/bin/bash 
#Defend sshd for centos 
#black ip to "/etc/hosts.deny" 
#/var/log/secure* log rotate every 7 days 
#20131031 by dongnan
  
#variables 
allow_num=5
  
#main 
/usr/bin/awk -f /root/sh/defend_ssh.awk month="$(date +'%b')" day="$(date +'%d')" allow="$allow_num" /var/log/secure > /etc/hosts.deny

#awk 文件
cat defend_ssh.awk
#
($1==month) && ($2==day) && /Failed/ { ++S[$(NF-3)]}
END {
      for (a in S) {
           if(S[a] > allow) print "sshd:"a
      }
}
  
#
($1==month) && ($2==day) && /Invalid user/ { ++D[$NF] }
END {
      for (d in D) { 
           if(D[d] > allow) print "sshd:"d
    } 
}

#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2160
  • 铜币13127枚
  • 威望5808点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
板凳#
发布于:2013-04-18 18:00
awk defend_ssh 去掉重复IP
环境
#下面的awk 代码导致记录重复的IP
awk '/Failed/ { ++S[$(NF-3)]} END {for (a in S) print a,S[a]}' /var/log/secure
27.254.67.185 1
222.186.42.46 2

#重复
awk '/Invalid user/ { ++S[$NF]} END { for (a in S) print a,S[a]}' /var/log/secure
222.186.42.46 2
189.196.64.233 1

解决方法
#更换awk 文件
cat defend_ssh.awk
#update 20160110
#模式:匹配日期及错误关键字
#动作:将匹配的字段加入数组
($1==month) && ($2==day) && /Failed/ { ++F[$(NF-3)]}
($1==month) && ($2==day) && /Invalid user/ { ++I[$NF]}
 
#END 模块
#删除重复的数组元素
#打印符合条件的元素
 
END {
 
for (f in F) {
   if (F[f] > allow) {
       print "sshd:"f
   }
}
 
for (i in I) {
   if (i in F || I[i] < allow) {
      delete I[i]
   }
   else {
      print "sshd:"i
   }
}   
 
}

#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2160
  • 铜币13127枚
  • 威望5808点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
地板#
发布于:2018-09-04 11:37
python 版本
详见 https://github.com/eastNan/defend_ssh
游客

返回顶部