问题描述
当您通过 shell 登录到您的 Linux(Ubuntu/Centos/Redhat/RHEL)时,您会收到一条警告,出现如下提示:
There were xxx failed login attempts since the last successful login. # 其中 xxx 可能是数十次、数百次或数千次失败的登录尝试
如果你的操作系统不显示上面的提醒,这可能是由于您的服务器提供商修改了 CentOS 的 MOTD 规则 以阻止显示该信息,也可能是因为它们默认使用基于密钥的身份验证(更多信息见下文),或者可能是因为它使用不同的 Linux 发行版,根本不显示此信息。
对于任何接入到互联网的操作系统来说,这是相当正常的现象,互联网上有数十万个流氓机器人定期扫描并尝试访问服务器。如果您定期更新 SSHD 程序并且您只使用安全密码(例如:超过 20 个随机生成的字符),那么您不需要任何进一步的保护。但是,下面我们将介绍一些方法,您可以使用这些方法进一步防止未经授权的登录。
解决方案
有多种方法可以保护您的 Linux 系统免受未经授权的登录尝试,你可以进行以下的这些操作:
方法1:切换到使用 SSH 密钥,禁止通过密码登录。
方法2:将 SSHD 的默认端口 从 22更改为另一个端口,如 5522。虽然这比传统的安全加固方式有一定难度,但它可以再一定程度上抵御一些简单的密码暴力破解脚本。但是高级的攻击方式会扫描系统所有开放端口,并很方便地找到修改后的 SSHD 端口。
方法3:手动禁用登陆失败的IP地址
查看登陆失败的IP地址
[root@johnhao ~]# grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr 14861 167.71.52.192 4119 221.4.210.112 4119 220.174.25.172 3916 110.185.107.27 2760 182.150.48.140 2745 183.134.217.152 1921 223.99.195.182 976 104.248.255.6 387 46.101.200.235 40 186.4.161.148 30 159.89.14.76
通过下面的命令将这些登陆失败的 IP 加入服务器访问限制名单
[root@johnhao ~]# cat /var/log/secure | grep "Failed password for invalid user" | awk '{print $13}' | sort | uniq -c | sort -n | tail -10 |awk '{print "sshd:"$2":deny"}' >> /etc/hosts.allow [root@johnhao ~]# tail -20 /etc/hosts.allow # # hosts.allow This file contains access rules which are used to # allow or deny connections to network services that # either use the tcp_wrappers library or that have been # started through a tcp_wrappers-enabled xinetd. # # See 'man 5 hosts_options' and 'man 5 hosts_access' # for information on rule syntax. # See 'man tcpd' for information on tcp_wrappers # sshd:186.4.161.148:deny sshd:46.101.200.235:deny sshd:104.248.255.6:deny sshd:223.99.195.182:deny sshd:183.134.217.152:deny sshd:182.150.48.140:deny sshd:110.185.107.27:deny sshd:220.174.25.172:deny sshd:221.4.210.112:deny sshd:167.71.52.192:deny
方法4:安装 fail2ban 并启用对使用 SSH多次失败登录的自动检测,以便阻止重复尝试。如果在 CentOS 8 或 CentOS 7 上使用 firewalld,请参见下文。
在 CentOS 7/8 上使用 firewalld 安装和配置 fail2ban
注意事项:fail2ban内置在 Plesk/cPanel 中的,它会配置它使用 iptables 而不是 firewalld。如果使用 Plesk/cPanel,请改用本指南启用它。
dnf install epel-release dnf install fail2ban echo ' [sshd] enabled = true ' > /etc/fail2ban/jail.local systemctl restart fail2ban
要查看fail2ban状态,可以使用具有不同详细程度的各种选项:
systemctl status fail2ban fail2ban-client status fail2ban-client status sshd
如果IP被禁止,通过下面的方式取消禁止 IP:
fail2ban-client unban 192.168.56.1
Very good write-up. I definitely appreciate this site.
Keep it up!