网站搜索

如何使用fail2ban保护SSH服务器免受暴力攻击


对 SSH 服务的一种常见攻击是暴力攻击,远程攻击者无限期地尝试使用不同的密码登录。当然,也有人反对 SSH 的密码身份验证,并且存在替代身份验证机制(例如公钥身份验证或双因素身份验证)来消除此类攻击。抛开不同认证方式的优缺点,我们来考虑需要密码认证的情况。您将如何保护您的 SSH 服务器免受暴力攻击?

fail2ban 是 Linux 上著名的开源入侵防御框架,它监视各种系统日志文件(例如 /var/log/auth.log 或 /var/log/secure),并在检测到任何可疑活动时自动触发各种防御操作。事实上,fail2ban 对于防御 SSH 服务器上的暴力密码猜测攻击非常有用。

在本指南中,我将演示如何安装和配置 fail2ban 以保护 SSH 服务器免受来自远程 IP 地址的暴力攻击。

在 Linux 上安装 fail2ban

要在 CentOS 或 RHEL 上安装 fail2ban,请首先设置 EPEL 存储库,然后运行以下命令。


$ sudo yum install fail2ban

要在 Fedora 上安装 fail2ban,只需运行:


$ sudo yum install fail2ban

要在 Ubuntu、Debian 或 Linux Mint 上安装 fail2ban:


$ sudo apt-get install fail2ban

为 SSH 服务器配置 fail2ban

现在您已准备好配置 fail2ban 来强化您的 SSH 服务器。您需要编辑 /etc/fail2ban/jail.conf 中的配置文件。配置文件包含 DEFAULT 部分,您可以在其中定义所有受监视服务的默认参数,还可以包含特定于服务的部分,您可以在其中定义任何特定于服务的监狱(例如 SSH、Apache 等)以覆盖默认参数。

在特定于服务的监狱部分([DEFAULT] 部分之后),您需要定义 [ssh-iptables] 部分,在其中定义特定于 SSH 的监狱配置。实际的 IP 地址禁止是由 iptables 完成的。

以下是 /etc/fail2ban/jail.conf 的示例,其中包含 ssh-iptables 监狱配置。当然,根据您的需要,可能还有其他特定于应用程序的监狱。


$ sudo vi /etc/fail2ban/jail.local

[DEFAULT]
# a space delimited list of IP addresses, CIDR prefixes, or DNS hostnames
# to bypass fail2ban protection
ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24

# number of seconds during which a client host is blocked
bantime = 86400

# number of failures before a client host is blocked
maxretry = 5

# number of seconds within which "maxentry" failures result in banning
findtime = 600

mta = sendmail

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, [email , [email ]
# for Debian-based distros
logpath = /var/log/auth.log
# for Red Hat-based distros
logpath = /var/log/secure
# ssh-specific max-retry threshold
maxretry = 3

根据上述配置,fail2ban 将自动禁止在过去 10 分钟内至少有 3 次登录尝试失败的任何远程 IP 地址。一旦被封禁,违规 IP 地址将被封锁 24 小时。此类事件将通过 sendemail 通知收件人电子邮件地址。 (可选)可以使用 logwatch 设置 fail2ban 以生成自定义报告。

配置文件准备好后,重新启动 fail2ban 服务,如下所示。

在 Debian、Ubuntu 或 CentOS/RHEL 6 上:


$ sudo service fail2ban restart

在 Fedora 或 CentOS/RHEL 7 上:


$ sudo systemctl restart fail2ban

要验证 fail2ban 是否成功运行,请运行带有 ping 参数的 fail2ban-client 命令。如果 fail2ban 服务运行正常,您应该会看到 pong 作为响应。


$ sudo fail2ban-client ping

Server replied: pong

使用 fail2ban 测试针对 SSH 暴力攻击的防护

要测试 fail2ban 是否有效,请尝试使用不正确的密码通过 SSH 连接到服务器来模拟暴力攻击。同时,监视 /var/log/fail2ban.log,它记录 fail2ban 中发生的任何有趣事件。


$ sudo tail -f /var/log/fail2ban.log

根据上面的日志文件,fail2ban 在检测到多次失败的 SSH 登录尝试后,已禁止 IP 地址 192.168.1.8。

检查 fail2ban 状态并取消禁止被阻止的 IP 地址

由于 fail2ban 的 ssh-iptables 监狱使用 iptables 来阻止违规 IP 地址,因此您可以通过检查当前 iptables 规则轻松验证禁令,如下所示。


$ sudo iptables --list -n

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-SSH  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-SSH (1 references)
target     prot opt source               destination
DROP       all  --  192.168.1.8          0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

如果您想从 fail2ban 中解锁 IP 地址,您还可以使用 iptables 命令:


$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP

虽然您可以像上面那样使用 iptables 命令手动检查和管理 fail2ban 的 IP 阻止列表,但正确的方法实际上是使用 fail2ban-client 命令行工具。该工具不仅允许您在统一的命令行界面中管理 ssh-iptables 监狱,还可以管理任何其他类型的 fail2ban 监狱。

要检查 fail2ban 状态(将显示当前活动的监狱列表):


$ sudo fail2ban-client status

要检查特定监狱的状态(例如,ssh-iptables):


$ sudo fail2ban-client status ssh-iptables

上述命令将显示被禁止的 IP 地址列表。

要取消禁止特定 IP 地址:


$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

请注意,如果您停止 fail2ban,所有被阻止的 IP 地址都将被解除阻止。当您重新启动 fail2ban 时,它会从 /var/log/secure(或 /var/log/auth.log)中查找违规 IP 地址列表,如果违规时间仍在禁止时间内,则会重新禁止这些 IP 地址。

将 fail2ban 设置为开机自动启动

成功测试 fail2ban 后,最后一步是启用 fail2ban 在服务器开机时自动启动。在基于 Debian 的发行版上,默认情况下启用 fail2ban 自动启动。在基于 Red Hat 的发行版上,按如下方式启用自动启动。

在 CentOS/RHEL 6 上:


$ sudo chkconfig fail2ban on

在 Fedora 或 CentOS/RHEL 7 上:


$ sudo systemctl enable fail2ban

概括

在本教程中,我演示了如何安装和配置 fail2ban 来保护 SSH 服务器。虽然 fail2ban 可以缓解暴力密码猜测攻击,但请注意,它无法保护 SSH 服务器免受复杂的分布式暴力攻击活动的影响,在这种活动中,攻击者通过使用数千个机器人控制的 IP 地址来绕过 fail2ban。

相关文章: