YOLO813

Linux云服务器防止SSH暴力破解的尝试

    不安分的黑客成天想着暴力破解别人的密码,这个可以从/var/log/secure日志里面看到端倪:

cat /var/log/secure | awk '/Failed/{print $0}' | head -10

    需要注意的是,后面的port 51688之类的描述并非我的ssh登录端口,而是这些黑客使用的端口号,这串IP就是黑客使用的IP了,这些登录失败信息会被记录到secure日志里面,是因为黑客已经试探出了我的登录ssh端口号!如果连端口号都不对是不会被记录到这个日志里的。

    看下上面的命令,cat读取日志全部内容,awk '/Failed/输出带有Failed的字符串的行,{print $0}打印所有列的信息,所以输出的类似于如下的内容

Oct  4 16:19:56 VM-0-2-centos sshd[2508452]: Failed password for root from 134.122.92.218 port 51942 ssh2

    都到了这一步,我就干脆统计了下IP,可以看到IP在倒数第4列(awk中默认以空格为分隔符),NF是awk中内置变量(列数),例如

cat /var/log/secure | awk '/Failed/{print $NF}' | head -5

    直接调用NF,输出了最后一列值的内容,所以为了获取倒数第4列内容,可以使用如下代码:

cat /var/log/secure | awk '/Failed/{print $(NF-3)}'

    再深入一点,获取每个IP试探的次数:

cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | sort -nr

图片

    可以看到试探还是挺多的,闲着无聊,干脆把日期也打印出来看下

cat /var/log/secure | awk '/Failed/{print $1,$2,$(NF-3)}' | sort | uniq -c | sort -nr

    这些我目前采取的办法是通过安全组全部拉入小黑屋,但是手动添加太麻烦了,考虑自动化处理。


    这里面需要考虑的是如何在云服务器上禁止IP访问指定的端口,防火墙肯定可以,但是得写脚本,由于服务版本为centos 8,所以无法像centos 6、7编辑/etc/hosts.allow and /etc/hosts.deny文件来禁用IP,但是我在参考文章时,发现里面有个评论,说进入到以下文件

vim /etc/pam.d/sshd

添加如下内容,取消掉注释

# account required pam_access.so

就可以使用deny和allow文件了,未验证。


    最简单的办法就是安装Fail2Ban,文章参考在下方第二篇。

yum install fail2ban
systemctl enable fail2ban && systemctl start fail2ban

systemctl status fail2ban.service

    这个时候就ok了,可以测试下,默认是连续5次密码输入错误就封禁10分钟,测试一下

tail -f /var/log/secure


    我们也可以看下配置文件,复制一份.local文件是为了防止fail2ban在升级时会自动覆盖jail.conf文件,将配置的内容写入到local文件中就不会丢失自定义的更改了,fail2ban会自动读取这两种配置文件:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
echo "" > jail.local
vim /etc/fail2ban/jail.local

    填入以下代码:

[DEFAULT]
# Ban IP/hosts for 24 hour ( 24h*3600s = 86400s):
bantime = 86400
# An ip address/host is banned if it has generated "maxretry" during the last "findtime" seconds.
findtime = 600
maxretry = 3
 
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator. For example, add your
# static IP address that you always use for login such as 103.1.2.3
#ignoreip = 127.0.0.1/8 ::1 103.1.2.3
 
# Call iptables to ban IP address
banaction = iptables-multiport
 
# Enable sshd protection
[sshd]
enabled = true

   重启fail2ban之后,可以使用如下命令查看分组

fail2ban-client status

fail2ban-client status sshd

    可以看到,黑名单里面已经存在我的IP了(因为已经多次输入密码失败)。


    也可以使用如下命令查看黑名单的更多信息:

tail -f /var/log/fail2ban.log

 

 

参考:

https://cloudcone.com/docs/article/how-to-restrict-ssh-access-only-to-specific-ips/
# fail2ban
https://www.cyberciti.biz/faq/how-to-protect-ssh-with-fail2ban-on-centos-8/
https://baijiahao.baidu.com/s?id=1668945207293073822&wfr=spider&for=pc