前言

当您通过 shell 登录到您的 Linux(Ubuntu/Centos/Redhat/RHEL)时,您会收到一条警告,出现如下提示:

1
2
There were xxx failed login attempts since the last successful login.
# 其中 xxx 可能是数十次、数百次或数千次失败的登录尝试

There were xxx failed login attempts since the last successful login.

如果你的操作系统不显示上面的提醒,这可能是由于您的服务器提供商修改了 CentOS 的 MOTD 规则 以阻止显示该信息,也可能是因为它们默认使用基于密钥的身份验证(更多信息见下文),或者可能是因为它使用不同的 Linux 发行版,根本不显示此信息。

对于任何接入到互联网的操作系统来说,这是相当正常的现象,互联网上有数十万个流氓机器人定期扫描并尝试访问服务器。如果您定期更新 SSHD 程序并且您只使用安全密码(例如:超过 20 个随机生成的字符),那么您不需要任何进一步的保护。但是,下面我们将介绍一些方法,您可以使用这些方法进一步防止未经授权的登录。

解决方案

有多种方法可以保护您的 Linux 系统免受未经授权的登录尝试,你可以进行以下的这些操作:

方法1:切换到使用 SSH 密钥,禁止通过密码登录

方法2:将 SSHD 的默认端口 从 22更改为另一个端口,如 5522

虽然这比传统的安全加固方式有一定难度,但它可以再一定程度上抵御一些简单的密码暴力破解脚本。但是高级的攻击方式会扫描系统所有开放端口,并很方便地找到修改后的 SSHD 端口。

禁止root账号直接ssh登录

修改/etc/ssh/sshd_config

1
PermitRootLogin no

修改之后重启sshd

1
systemctl restart sshd

方法3:手动禁用登陆失败的IP地址

查看登陆失败的IP地址

1
2
3
4
5
6
7
8
9
10
11
12
[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 加入服务器访问限制名单

1
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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多次失败登录的自动检测,以便阻止重复尝试

防止SSH爆破的最有效成本降至最低的一种方法是利用Fail2ban。Fail2ban可以配置为监视各种系统日志,并使用本地防火墙规则响应失败的登录尝试。在本教程中,我们将简要介绍如何安装和配置Fail2ban以防止SSH连接尝试。

安装fail2ban

为了使用yum轻松安装ail2ban包,我们需要访问Epel存储库。通过运行sudo yum install epel-release将其添加到您的系统中.

1
2
3
sudo yum install epel-release
sudo yum update
sudo yum install fail2ban-firewalld

现在fail2ban成功安装后,就配置它。

配置fail2ban

安装后,最好将默认的配置文件jail.conf另外拷贝一份

1
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

首先看一下其中一个参数ignoreip,有时必须将授权可信用的内部IP地址设定不受安全检测的。 默认情况下,环回地址被加入ignoreip。

(您要以设置的任何阈值监视和禁止的服务)。 默认情况下,IP被禁止1小时(时间不够长)。 最佳做法是使用* .local文件覆盖系统默认值,而不是直接修改jail.config

我们将其转换为通俗易懂的语言, 在最后10分钟内尝试5次后,IP将被阻止10分钟 。 卧槽,默认配置简直弱爆了,可以适当将封禁时间拉长还可以选择增加被多次禁止的IP的禁止时间,但这是另一篇文章的主题。

  • ignoreip :永远不会被禁止的IP地址白名单。他们拥有永久的“摆脱监狱”的特权。本地主机的IP地址127.0.0.1是在列表中默认情况下,IPv6的本机地址是::1。如果确认永远不应禁止的其它IP地址,请将它们添加到此列表中,并在每个IP地址之间留一个空格
  • bantime :禁止IP地址的时长,m代表分钟、h表示时。如果配置的数值不带m或h,则将其视为秒。值 -1将永久禁止IP地址。要非常小心,不要将自己的计算机给关了起来,这是非常有可能发生的低级错误。
  • findtime : 尝试失败的连接次数过多会导致IP地址进“监狱”的时间。
  • maxretry:尝试失败次数过多”的数值。
  • backend:指定用于获取文件修改的后端。 如果您使用的是 CentOS 或 Fedora,则需要将后端设置为 systemd。 对于其他操作系统,默认值 auto 就足够了。

理解上面的几个配置项非常重要,也就是说来自同一IP地址的maxretry次连接在该findtime时间段内尝试失败了,则在的持续时间内将其禁止bantime。唯一的例外是ignoreip列表中的IP地址。

要设置区别于全局配置文件jail.local的特定配置,必须在/etc/fail2ban/jail.d目录下创建一个相应的“ jail”文件。 对于SSHD,请创建一个名为sshd.local的新文件,然后在其中输入服务过滤说明, 下面就是配置ssh加固的配置文件,该配置的意思是在最后1分钟内尝试5次后,IP将被阻止一年:

1
2
3
4
5
[sshd]
enable=true
bandtime=1y
findtime=1m
maxretry=5

就这么简单! 为Fedora构建的软件包已经处理了许多配置, 接下来启用并启动fail2ban服务。

1
2
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

一切正常的话,如下图所示,fail2ban守护进程是正常启动的

如果是最近启动的,fail2ban不太可能显示任何有趣的事情,但要检查一下fail2ban的状态并确保启用了监狱功能,请输入:

可以通过对日志进行“tail命令”来监视fail2ban日志文件中的入侵尝试:

另外在安装fail2ban-firewalld后,会在/etc/fail2ban/jail.d目录下默认配置了一个辅助firewalld守护进程的配置文件,fail2ban-firewalld可以通过通过fail2ban绑定的其他网络服务ban掉IP记录,自动在后台的drop区域创建rich规则,换句话说fail2ban-firewalld可以最大限定地实现自动化防御。

当服务器运行一段时间后,查看一下firewalld的drop区域,

对于公开在互联网上的主机,我们不能掉以轻心,如果向更进一步的话,我们可以基于具体的IP地址,汇聚成一个范围较大子网,然后对这些子网的黑名单集中永久封禁,那么可以进一步降低服务器因为防火墙防御策略条目所占用的额外内存。