SSH防爆破

发布于 2021-09-30  196 次阅读


WTH?

本服务器刚拿到手就改了端口和复杂密码,一直以来,偶尔会有零星几个的尝试登录,也没太在意。
直到前几天需要上去处理点东西,登录后提示在这之前有上万次登录尝试....
再 lastb 一统计,全来自同一个ip,虽然短时间内没法爆开10多位的随机密码,但对方跑字典的行为让我感到不爽,遂得好好盘盘ssh安全


本文主要记录对爆破行为的防御措施;稍提及通用安全措施。

通用安全措施

  • 基础
    • 随机高端口
    • 包含大小写数字甚至符号的8位以上复杂密码
    • 使用密钥方式登录
  • 进阶
    • 新建一个用户并授root权限,然后禁用root用户
    • 设置允许或禁止ssh登录的ip、ip段
    • 程序、脚本防御

使用脚本识别攻击并添加到封禁列表

此处引用:教程原文

如题所示,使用定时任务的形式定期执行脚本。
思路:通过统计日志文件中的登陆失败的ip,并将达到阈值的ip添加到 /etc/hosts.deny 来拒绝某个ip的再次访问。

使用 crontabp 或者宝塔定时任务定期执行脚本:

#!/bin/bash
#protectssh.sh
#Prevent SSH from being hacked
 #SSH配置文件所在位置
 SSH_config='/etc/hosts.deny'
 #ssh 日志文件位置
 SSH_log='/var/log/secure'
 #记录尝试登陆超过15次且未登陆成功的ip,以及添加进黑名单的时间日志
 Deny_log='/var/lib/ssh_shell/ssh_deny.log'
 #储存所有ip及访问次数文件
 Visit_ip='/var/lib/ssh_shell/ssh_visit.txt'
 #超过设置下面次数将被添加进黑名单
 Visit_number=60
 #检查ssh日志文件是否存在
 if [ ! -e  $SSH_log ]
 then
   echo -e "\033[41;37m  ssh 日志文件不存在 请检查原因 \033[0m"
   exit 1
 fi
 
 if [ ! -e "$SSH_config.bak" ]
 then
   cp $SSH_config  $SSH_config.bak
   if [ $? -eq 0 ]
   then
     echo " 备份文件成功" >>$Deny_log
   else
     echo  -e"\033[41;37m ssh备份文件不成功  \033[0m"
     exit 2
   fi
 else
   echo " 已有备份文件 " >>$Deny_log
 fi
 cat $SSH_log |awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{ print $2"==="$1}' > $Visit_ip
 echo "---------$(date +%F_%T)------------" >>$Deny_log
 
 for VI  in  $(cat  $Visit_ip)
 do
   Number=$(echo $VI |awk -F=== '{print  $2}')
   IP=$(echo $VI |awk -F=== '{print  $1}')
   if  [ $Number -gt $Visit_number ]
   then
     grep $IP "$SSH_config" >/dev/null
     if [ $? -ne  0 ]
     then
      echo " sshd:$IP:deny" >>$SSH_config
      echo "$IP " >>$Deny_log
    fi         
  fi
done

执行效果:


Q.E.D