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
Comments NOTHING