CentOS-ssh动态禁用ip,防暴力破解

前面几句废话

最近发生了一件很闹心的事儿,新加了一台服务器,刚刚部署了一个台服DNF准备体验一下的时候,服务器被黑了。

某天下午,小伙伴给发我消息,游戏登录的时候报错了,还顺便给发了个截图。当时我还很奇怪,因为报错是数据连接失败了。我以为是本地配置哪里出错了。

等我登录到后台看数据库的时候,看的我一脸蒙逼,数据完全空了,留下了一个空表,里面两条记录。大概意思就是让我给他发 0.001 BTC,发完后给他发个邮件,他给我数据库数据的下载地址,否则数据将用就删除。

毕竟以前从来没发生过这种事情,还挺兴奋。开始追查到底是哪里出现了问题。这也就引出来这次需要记录的东西,自动禁用 IP 登录,防止暴力破解。

问题原因

经过系统日志的分析,发现在系统日志中,有大量的ssh尝试登录的报错,简单查询一下 IP 来源,基本上都在国外。

这次数据库被暴力破解其实是我自己的问题,我将本地的数据直接覆盖到服务器上之后,数据库的默认密码忘记修改了,默认密码太容易被暴力破解了。

为了防止暴力破解,配置一个将可疑IP加入ssh 黑名单的自动处理程序是非常有必要的。设置方法如下。

设置ssh自动将可疑IP加入黑名单

在 CentOS 系统中,lastb 命令可以查看所有的登录记录,通过该命令过滤出可疑IP,屏蔽每小时SSH暴力破解超过10次的IP。

编写一个自动检查的脚本secure_ssh.sh,脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

# =================================
# 屏蔽每小时SSH暴力破解超过10次的ip
# =================================

DATE=$(date +"%a %b %e %H")
# %星期 %月 %天 %时 其中,星期、月都是英文简写显示;用于匹配lastb
# %e:单数字时显示7;而%d显示07

ABNORMAL_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>10)print i}')
# lastb:上次登录失败的记录
# grep "$DATE":匹配当前分钟内的ssh失败记录
# {for(i in a)if(a[i]>10)print i}:小括号表示判断条件

# echo
# echo "以下ip每小时超过10次登录失败"
# echo
for IP in $ABNORMAL_IP; do

# 查看系统黑名单中是否已存在需要屏蔽的ip
insert_ip=`grep "$IP" /etc/hosts.deny | wc -l`
if [ $insert_ip -le 0 ] ; then
echo "屏蔽IP:$IP"
echo "sshd:${IP}" >> /etc/hosts.deny
else
echo "IP:$IP 已存在系统黑名单中"
fi
done

# 重启ssh服务生效
systemctl restart sshd

# echo
# echo "屏蔽完成"
# echo

将该脚本放到服务器上任意目录都可以,我这里放在/usr/local/bin/,然后将这个脚本设置到每个小时执行一次。

通过crontab 编辑定时任务。

1
crontab -e

编辑命令跟vim一样,如下表达式是每小时执行一次。

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

效果

一般情况下,只要有公网IP开了端口,就会被扫,就有概率被暴力破解,这些“专业”的都是自动程序在破解,循环扫的,所以还是有必要配置一下。

配置好之后,没多久就能记录一堆可疑 IP。

ssh-deny.png

结束

又踩了一个坑。