使用host.deny防止ssh暴力破解

最近在登陆主机ssh的时候系统提示有几万次的ssh登陆失败,这种情况可以确定是被某些无聊的人扫到了ssh端口并尝试用弱密码破解,所以这里使用host.deny文件将他们的ip给屏蔽掉就好,本文使用的是centos7主机,其他Linux系统基本类似。

1.使用强密码,修改ssh端口

这种暴力破解无非就是使用穷举或者密码库,只要我们使用强密码并将主机ssh的默认端口22修改为其他端口就是最为行之有效的办法,具体方法很简单请自行搜索。

2.查看主机登陆失败日志

在将攻击者加入黑名单之前总需要知道他们的IP地址才行,这里使用

1
lastb > failed.log

来将所有登陆失败的日志写入到failed.log文件中,然后将文件在本地打开

攻击主要是这两个ip发起的,查了一下地址分别是:江西省南昌市、广东省东莞市

现在我们已经得到了攻击者的IP。

3.将攻击者的IP添加到黑名单

centos7中我们可以利用hosts.deny文件对攻击者的IP进行屏蔽,host.deny的主要原理tcp_wrappers,具体原理可以看这篇文章

我们只需要编辑/etc/host.deny文件,将攻击者的IP添加到其中,攻击者的IP就不能使用ssh连接主机了。

4.“一劳永逸”的方法

我们屏蔽掉攻击者的IP,但是他们还是可以换IP,我们不能每次都去更新屏蔽列表,所以我们需要一个“一劳永逸”的方法:使用脚本来自动屏蔽攻击者IP。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
cat /var/log/secure | grep "Failed password" | awk '{ print $(NF-3)}' | sort -n | uniq -c | awk '{ print $2"="$1}' > /tmp/bad_ips.txt
ipaddr=(`cat /tmp/bad_ips.txt`)
for i in ${ipaddr[*]}; do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt 5 ]; then
grep $IP /etc/hosts.deny > /dev/null
# echo "$?\n"
if [ $? -gt 0 ]; then
# echo "sshd:$IP\n"
echo "ALL: $IP" >> /etc/hosts.deny
fi
fi
done

这段脚本会统计/var/log/secure日志中登陆失败的ip和次数,并将登陆失败超过5次的ip自动添加到hosts.deny文件中,现在我们只需将脚本添加到定时任务中就可以实现自动屏蔽攻击者IP了。

1
2
crontab -e
*/5 * * * * /usr/bin/sh /home/yoyo/auto_denny.sh