如何在 RHEL 7.x/CentOS 7.x 上使用 Fail2Ban 加固 SSHD
在本文中,我们将学习如何在 CentOS 7 上安装和配置 Fail2ban 以保护 SSH 连接。我们都知道,通过 SSH 连接到服务器是一种安全的方式,而 SSH 为了正常工作,通常会暴露在互联网上。这样一来,就存在被攻击的风险,如果我们查看这些服务的日志,经常会看到使用暴力破解攻击进行的重复登录尝试。
安装 Fail2ban
由于 Fail2ban 不包含在 CentOS 官方仓库中,我们需要更新并使用 EPEL 项目安装软件包,然后安装 fail2ban 并使其在系统启动时自动启动。
# yum update # yum install epel-release Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: centos.excellmedia.net * epel: kodeterbuka.beritagar.id * extras: mirrors.nhanhoa.com * updates: mirrors.nhanhoa.com Resolving Dependencies ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: fail2ban noarch 0.9.3-1.el7 epel 9.7 k Installing for dependencies: ebtables x86_64 2.0.10-13.el7 base 122 k fail2ban-firewalld noarch 0.9.3-1.el7 epel 9.9 k fail2ban-sendmail noarch 0.9.3-1.el7 epel 13 k fail2ban-server noarch 0.9.3-1.el7 epel 395 k firewalld noarch 0.3.9-14.el7 base 476 k ipset x86_64 6.19-4.el7 base 36 k ipset-libs x86_64 6.19-4.el7 base 46 k libselinux-python x86_64 2.2.2-6.el7 base 247 k python-slip noarch 0.4.0-2.el7 base 30 k python-slip-dbus noarch 0.4.0-2.el7 base 31 k systemd-python x86_64 219-19.el7_2.11 updates 99 k Updating for dependencies: libgudev1 x86_64 219-19.el7_2.11 updates 66 k systemd x86_64 219-19.el7_2.11 updates 5.1 M systemd-libs x86_64 219-19.el7_2.11 updates 358 k systemd-sysv x86_64 219-19.el7_2.11 updates 53 k Transaction Summary ================================================================================ Install 1 Package (+11 Dependent packages) Upgrade ( 4 Dependent packages) Total download size: 7.1 M Is this ok [y/d/N]: y Downloading packages: --> Running transaction check Installed: fail2ban.noarch 0:0.9.3-1.el7 Dependency Installed: ebtables.x86_64 0:2.0.10-13.el7 fail2ban-firewalld.noarch 0:0.9.3-1.el7 fail2ban-sendmail.noarch 0:0.9.3-1.el7 fail2ban-server.noarch 0:0.9.3-1.el7 firewalld.noarch 0:0.3.9-14.el7 ipset.x86_64 0:6.19-4.el7 ipset-libs.x86_64 0:6.19-4.el7 libselinux-python.x86_64 0:2.2.2-6.el7 python-slip.noarch 0:0.4.0-2.el7 python-slip-dbus.noarch 0:0.4.0-2.el7 systemd-python.x86_64 0:219-19.el7_2.11 Dependency Updated: libgudev1.x86_64 0:219-19.el7_2.11 systemd.x86_64 0:219-19.el7_2.11 systemd-libs.x86_64 0:219-19.el7_2.11 systemd-sysv.x86_64 0:219-19.el7_2.11 Complete!
现在,我们将启动 fail2ban 服务并使其在系统启动时自动启动。
# systemctl start fail2ban # systemctl enable fail2ban
配置 Fail2ban 本地设置
安装 Fail2ban 后,我们需要根据我们的环境自定义配置文件。Fail2ban 的所有配置文件都位于 ** /etc/fail2ban ** 目录下。我们将从 ** /etc/fail2ban/jail.conf ** 中的 jail.com 配置复制到 ** /etc/fail2ban/jail.local **,以下是复制配置的命令
# cp -pf /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
现在,我们将根据需要自定义配置文件。
# vi /etc/fail2ban/jail.local [DEFAULT] # # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT] # bantime = 3600 # # [sshd] # enabled = true # # See jail.conf(5) man page for more informationignoreip = 127.0.0.1/8 # External command that will take an tagged arguments to ignore, e.g. <ip>, # and return true if the IP is to be ignored. False otherwise. # # ignorecommand = /path/to/command <ip> ignorecommand = # "bantime" is the number of seconds that a host is banned to do ssh . bantime = 1200 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 600 # "maxretry" is the number of failures before a host get banned. maxretry = 5
配置文件中使用的选项
**Ignoreip** - 此选项用于设置允许的 IP 地址,IP 地址列表应使用空格分隔,用于设置您的 IP 地址。
**Bantime** - 此选项设置主机被禁止访问的持续时间(秒)。
**Findtime** - 此选项用于检查被禁止的主机列表,它将检查上次被禁止的时间。
**Maxretry** - 此选项用于设置主机尝试登录的次数限制,超过限制则该主机将被禁止访问。
添加配置文件以保护 SSH
我们将使用以下命令创建一个新的 sshd 配置文件,并在其中添加 fail2ban 配置。
# vi /etc/fail2ban/jail.d/sshd.local [sshd] enabled = true port = ssh #action = firewallcmd-ipset logpath = %(sshd_log)s maxretry = 25 bantime = 36000
配置文件中使用的选项
**Enable** → 如果此选项设置为 true,则启用保护,要禁用则可以设置为 false。这将检查 sshd 配置,位于 ** /etc/fail2ban/filters.d/sshd.conf ** 中。
**Action** → 此选项用于定义被禁止的 IP 地址,位于 ** /etc/fail2ban/action.d/firewallcmd–ipset.conf ** 中。
**Port** → 当我们更改 SSH 端口时使用此选项,SSH 的默认端口是 22,所以如果您没有更改默认端口,则无需更改此选项。
**Logpath** → 此选项用于允许我们将 fail2ban 扫描的日志存储到指定位置。
**Maxretry** → 此选项用于设置允许的失败登录的最大次数。
**Bantime** → 此选项用于设置主机被禁止的持续时间(秒)。
所有配置完成后,我们需要重新启动 fail2ban 服务。
# systemctl restart fail2ban
检查 Fail2ban 状态
以下是用于检查 fail2ban 状态的命令
# fail2ban-client status Status |- Number of jail: 2 `- Jail list: sshd
以下是检查使用 SSH 端口登录服务器的失败尝试次数的命令。
# cat /var/log/secure | grep ‘Failed password’ Jul 18 16:41:12 htf sshd[5487]: Failed password for root from 54.46.23.45 port 23421 ssh2 Jul 18 16:41:15 htf sshd[1254]: Failed password for root from 54.46.23.45 port 15286 ssh2 Jul 18 16:41:16 htf sshd[1254]: Failed password for root from 54.46.23.45 port 24157 ssh2 Jul 18 16:41:18 htf sshd[1254]: Failed password for root from 54.46.23.45 port 24057 ssh2 Jul 18 16:41:19 htf sshd[1254]: Failed password for root from 54.46.23.45 port 27286 ssh2 Jul 18 16:41:22 htf sshd[1254]: Failed password for root from 54.46.23.45 port 13486 ssh2
从 Fail2ban 中解除 IP 地址的禁止
如果要从禁止列表中删除 IP 地址,则需要将 IPADDRESS 替换为需要允许的 IP 地址列表。“sshd” 是以下示例中使用的监狱名称,以下是用于允许 IP 地址的命令。
通用语法
# fail2ban-client set sshd unbanip IPADDRESS
Example: # fail2ban-client set sshd unbanip 192.168.1.22 # fail2ban-client set sshd unbanip 54.46.23.45
我们可以对自上次启动以来 fail2ban 的日志进行故障排除,以下是用查找日志的命令
# journalctl -b -u fail2ban -- Logs begin at Mon 2016-07-18 08:20:57 EDT, end at Mon 2016-07-18 11:47:19 EDT Jul 18 17:47:19 centos-linux-1.shared systemd[1]: Starting Fail2Ban Service... Jul 18 17:47:19 centos-linux-1.shared fail2ban-client[2542]: 2016-07-18 11:47:19 Jul 18 17:47:19 centos-linux-1.shared fail2ban-client[2542]: 2016-07-18 11:47:19 Jul 18 17:47:19 centos-linux-1.shared systemd[1]: Started Fail2Ban Service.
通过以上配置和设置,我们现在能够为服务配置基本的禁止策略,使用 Fail2ban 非常容易设置,我们还可以使用 Fail2ban 来保护任何类型的服务。