针对服务器ssh爆破的处理办法

在CentOS7 的/etc目录下有hosts.deny文件,在文件中按照相应的格式添加数据可以禁止相应的IP使用不同的协议进行服务器的连接

比如,禁止ssh爆破就可以使用ssh:all:deny来防范,限定条件deny可加可不加,但是在使用deny all的时候要注意在同目录的hosts.allow文件中添加允许访问的ip地址 例如ssh:1.2.3.4:allow。但是在实际测试的过程中发现,使用deny all可能会导致在hosts.allow 文件中的IP也无法访问远程服务器,暂时还不知道是什么原因,有可能是deny的优先级比allow的要高,也有可能单纯是代码写错了。

此时简单的方法是使用 cat /var/log/secure |grep Failed|grep invalid\ user命令 ,查找使用不同用户名对本机进行爆破的不同IP地址,然后手动添加到hosts.deny文件中。

此外,也可以使用sh脚本文件将/var/log/secure中密码输入超过一个指定次数的IP添加到黑名单文件中,然后将原来hosts.deny文件输出到/dev/null中,然后将符合条件的黑名单IP以"sshd:$IP:deny"的格式输出到hosts.deny文件中,即可实现对ssh爆破的防范

但是这种防范和使用deny all有很大的不同,在达到阈值之前,服务器的端口都是对所有IP开放的,但是在某个IP尝试的次数达到阈值之后,服务器就会主动终止与远程IP的连接,因此,脚本的方法在前期虽然没有deny all的方法那么有效,但是从长远上看,省去了每次向hosts.allow白名单中添加IP地址的麻烦

但是在使用命令cronable –e 尝试将刚刚完成的脚本文件自定义每隔一分钟运行时,由于没有反馈,因此无法确定脚本文件是否成功运行。修改了crontab -e中的内容为:

在crontab –e 中的格式为:

*/1 * * * * sh /usr/local/bin/secure_ssh.sh

在等待一分钟后,再次检查black.list文件的大小,发现文件的大小发生了变化,由此可以确定脚本已经成功的运行了

继续修改之前的sh过滤脚本,在今天上午对服务器日志检查的时候发现,依旧有少量的未知IP在试图对服务器的ssh端口进行暴破,
在检查日志的时候发现,暴力的端口并不是ssh标准的22端口,而是大量端口,因此修改端口并不能一劳永逸的解决问题。在对之前的分析中,发现sh脚本文件中的规则并不严格,原先的脚本文件将可疑IP加入黑名单的条件是连接失败的次数大于一位数,即十次,但是在实际观察日志的过程中,有大部分IP都是只连接了六次。在搜索资料后发现,CentOS密码错误的最大尝试次数就是六次,但是ssh:notty,即ssh空连接的最大次数并不是六次,因此,原脚本文件的意义是使用防火墙过滤所有使用ssh空连接进行连接的用户,和该服务器的需求并不完全符合
该脚本文件的内容如下

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
  if [ ${#NUM} -gt 1 ]; then
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

经过分析后发现,该脚本文件的操作是从日志中查找所有Failed,即登录失败的ip,然后排序并去重取重复次数,按照x.x.x.x=x的格式输入到/usr/local/bin/下的balck.list中。接着遍历black.list中所有数据,首先使用#参数获得第二位数据即登录失败的次数,然后比对是否大于一,然后将其打印到hosts.deny中,为了让防火墙过滤更严格,所以可以将判断条件的首次判断进行修改,将其更改为if [ ${NUM} -gt 2 ]; then,当服务器检测到一旦有未知IP连接失败的次数超过3次时 ,就将该IP地址导入到服务器的黑名单

修改后的文件为

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
   if [ ${NUM} -gt 2 ]; then 
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
      #echo "transaform success" 
    fi
  fi
done

在重新检查日志后,发现之前小于十次连接的IP也成功导入到了防火墙的过滤名单中,但是为了以后会在新设备上对服务器进行连接,判断的条件也不能写的太小。因此服务器依旧会收到新的爆破攻击,但是这些流量算是在服务器的承载范围内,所以并不会有太大的问题

后期添加

不过在后期的使用过程中,虽然是没有没有了ssh爆破的困扰,但是现在又来新的问题了,现在日志中又出现了这种问题

Invalid user zenoss from 106.13.23.77 port 59988

破解不了密码直接弄用户,没办法,重新修改脚本文件
观察日志记录可发现该种日志和之前那种Failed日志IP地址的位置不一样
修改后就可以使用该脚本文件即可

#! /bin/bash
cat /var/log/secure|awk '/Invalid/{print $(NF-2)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
   if [ ${NUM} -gt 2 ]; then ##
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done

直接执行 查看hosts.deny文件

sh /usr/local/bin/secure_user.sh
cat /etc/hosts.deny |grep 106.13.23.77

输出

sshd:106.13.23.77:deny

结束

一点小小的建议

其实如果有条件的话,还是建议使用密钥登录的方式。破解密钥肯定比破解密码麻烦,所以此时服务器的安全性还可以得到进一步的提升,关于这个的教程还是很简单的,随便弄一下就行了

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值