在Ubuntu 18.04和RHEL/CentOS 8上进行Fail2ban SSH配置

时间:2020-01-09 10:38:19  来源:igfitidea点击:

在本文中,我将分享在Ubuntu 18.04和RHEL/CentOS 7/8 Linux中安装和配置Fail2ban SSHD Jail的步骤。

Fail2ban如何工作?

  • Fail2Ban由客户端,服务器和配置文件组成,以"限制暴力认证尝试"。

  • 服务器程序" fail2ban-server"负责监视日志文件并发出ban/unban命令。

  • 它由fail2ban-client通过一个简单的协议进行配置,该协议还可以读取配置文件并向服务器发出相应的配置命令。

  • 它扫描日志文件并禁止显示恶意标志的IP-过多的密码错误,寻找漏洞等。

  • 通常,它也可以用于更新防火墙规则以在指定的时间内拒绝IP地址,尽管也可以配置任何其他任意操作(例如发送电子邮件)。

  • 开箱即用,它带有用于各种服务(apache,courier,ssh等)的过滤器。

  • 有关更多详细信息,请参见不同的fail2ban工具的手册页。

安装Fail2ban

在RHEL/CentOS 7/8中

Fail2ban在默认的RHEL/CentOS 7/8存储库中不可用,因此我们将首先安装EPEL存储库:

[root@centos-8 ~]# dnf install epel-release

在可用存储库中搜索任何fail2ban软件包

[root@centos-8 ~]# dnf search fail2ban
Extra Packages for Enterprise Linux Modular 8 - x86_64 24 kB/s | 117 kB 00:04
Extra Packages for Enterprise Linux 8 - x86_64 490 kB/s | 6.1 MB 00:12
=========================================== Name Exactly Matched: fail2ban ===========================================
fail2ban.noarch : Daemon to ban hosts that cause multiple authentication errors
========================================== Summary & Name Matched: fail2ban ==========================================

然后我们需要使用Rsyslog安装它,因为它会扫描从Rsyslog获取的日志输出:

[root@centos-8 ~]# dnf install fail2ban -y

在Ubuntu 18.04上

要在Ubuntu 18上安装,我们将使用apt,如下所示:

root@Ubuntu:~# apt install fail2ban -y

说明:

我将使用CentOS 8演示本文中的步骤,但我们也可以在RHEL/CentOS 7/8或者Ubuntu 18上使用它们。

fail2ban配置文件列表

  • 默认的配置文件是/etc/fail2ban/jail.conf

  • "此文件的问题是,在安装安全更新时,它可能会被覆盖"。

  • 每个.conf文件都可以被名为.local的文件覆盖。

  • 首先读取.conf文件,然后读取.local,随后的设置将覆盖较早的设置。
    因此,.local文件不必在相应的.conf文件中包含所有内容,而仅包含我们希望覆盖的设置。

  • 在" .local"文件中,仅指定要更改的设置,其余配置将来自首先解析的相应" .conf"文件。

  • 除了.local外,对于jail.conf或者fail2ban.conf文件,可以有一个对应的.d /目录,其中包含其他.conf文件。

  • 例如监狱配置将是:

  • jail.conf

  • jail.d/*.conf(按字母顺序)

  • jail.local

  • jail.d/*.local(按字母顺序)

  • 在原始配置文件中的.conf文件之后以及在.d目录下的文件之后,将分析所有.local文件。

配置Fail2ban SSH监狱

要配置SSH Jail,我们需要创建/修改配置文件。
由于这里我们仅旨在保护SSHD,因此我们将创建00-sshd.conf文件。

[root@centos-8 ~]# touch /etc/fail2ban/jail.d/00-sshd.conf

提示:

我们可以参考jail.conf来收集默认值。
以下是我的ssh监狱文件-00-sshd.conf的内容

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.43.168
bantime  = 1m
findtime = 1m
maxretry = 2
[sshd]
enabled  = true

重要的提示:

Fail2ban是无情的;它会阻止任何符合阻止条件的服务,并且不会三思而后行。
这包括阻止我们。
要解决此问题,请在此处添加我们的网络以及我们永远不想阻止的任何其他IP地址。
确保使用ignoreip保持localhost IP完整无缺。
由于我将这些值用于演示目的,因此bantime和其他值要少得多。
我们可以根据自己的环境进行调整。

其中

  • findtime:用户尝试登录的时间

  • bantime:如果发现主机违反规则,将阻止该主机访问服务器的总秒数

  • 端口:如果我们将其他端口用于SSHD。
    由于我使用的是默认端口22,因此我没有使用过此端口。

  • ignoreip:我们不想被阻止的其他网络

  • maxretry:Fail2ban采取操作之前需要发生的故障数。
    IP将被阻止bantime选项中包含的分钟数。

启用并启动服务

接下来,我们将启用fail2ban在重新启动后自动启动服务

[root@centos-8 ~]# systemctl enable fail2ban

启动服务,并确保服务已成功启动

[root@centos-8 ~]# systemctl start fail2ban
[root@centos-8 ~]# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-03-24 18:21:20 IST; 3min 9s ago
     Docs: man:fail2ban(1)
  Process: 6633 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS)
  Process: 6634 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
 Main PID: 6636 (f2b/server)
    Tasks: 3 (limit: 26213)
   Memory: 11.6M
   CGroup: /system.slice/fail2ban.service
           └─6636 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start
Mar 24 18:21:20 centos-8.example.com systemd[1]: Stopped Fail2Ban Service.
Mar 24 18:21:20 centos-8.example.com systemd[1]: Starting Fail2Ban Service...
Mar 24 18:21:20 centos-8.example.com systemd[1]: Started Fail2Ban Service.

另外,还要检查fail2ban日志文件/var/log/fail2ban.log中是否有其他可能的错误。

检查SSH监狱状态

我们可以使用fail2ban-client来检查现有的Jail配置

[root@centos-8 ~]# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

如我们所见,当前我们仅启用了sshd监狱,我们可以使用以下命令检查该监狱的更多详细信息:

[root@centos-8 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

验证SSH监狱

当前没有失败事件,因此ssh禁止的IP列表以及其他变量为空。
我将执行一些失败的SSH来验证我们的监狱配置。

[root@centos-8 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     3
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.43.10

不出所料,我们的SSH配置已成功禁止了尝试多次登录失败的IP地址。

Fail2ban动作

默认情况下,SSH(Fail2Ban v0.10.5)使用iptables来阻止端口SSH。
我们可以使用以下方法进行验证:

[root@centos-8 ~]# fail2ban-client get sshd actions
The jail sshd has the following actions:
iptables-multiport

这里的动作列出了sshd jail的iptables-multiport
我们可以使用以下方法查看有关此任务的更多信息

[root@centos-8 ~]# fail2ban-client get sshd action iptables-multiport actionstart
 -N f2b-sshd
 -A f2b-sshd -j RETURN
 -I INPUT -p tcp -m multiport --dports ssh -j f2b-sshd

这些动作在/etc/fail2ban/action.d下定义。

[root@centos-8 ~]# ls -l /etc/fail2ban/action.d/iptables-multiport.conf
-rw-r--r-- 1 root root 1508 Jan 21 09:41 /etc/fail2ban/action.d/iptables-multiport.conf

如果使用SSH,则应该在下面的iptables规则中看到。
我们还可以使用iptables -L列出Linux节点上的所有规则:

[root@centos-8 jail.d]# iptables --list-rules f2b-sshd
-N f2b-sshd
-A f2b-sshd -s 192.168.43.10/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN

为sshd监狱创建新动作

我们还可以创建新的动作并将其添加到监狱中。
例如:如果"我们想使用firewalld阻止SSHD的端口22而不是默认iptables",我将在" /etc/fail2ban/action.d"下创建一个新的动作配置文件。

[root@centos-8 ~]# touch /etc/fail2ban/action.d/firewallcmd-sshd.conf

我们可以参考现有操作文件以获取一些示例模板,我在下面的内容中添加了配置fail2ban操作文件的内容

[root@centos-8 ~]# cat /etc/fail2ban/action.d/firewallcmd-sshd.conf

Fail2ban操作文件

提示:

其中我使用现有的配置文件" firewallcmd-common.conf"来获取操作文件的变量,并对其进行一些修改以使用"端口22"。

应用新的动作配置文件

接下来,在监狱配置文件中添加以下突出显示的内容:

[root@centos-8 ~]# cat /etc/fail2ban/jail.d/00-sshd.conf
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.43.168
bantime  = 1m
findtime = 1m
maxretry = 2
[sshd]
enabled  = true
action = firewallcmd-sshd

重新启动fail2ban服务以使更改生效

[root@centos-8 ~]# systemctl restart fail2ban

确保服务已成功启动

[root@centos-8 ~]# systemctl status fail2ban

有关服务状态的更多详细信息,我们可以参考日志文件/var/log/fail2ban.log

验证新的动作配置文件

接下来,我们将对该Linux主机执行一些失败的SSH登录,然后检查sshd jail的状态

[root@centos-8 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.43.10

检查fail2ban日志文件/var/log/fail2ban.log了解更多详细信息

一旦启动fail2ban ssh操作,我们可以看到在服务器上添加了以下firewalld规则,以阻止更多失败的SSH尝试

[root@centos-8 ~]# firewall-cmd  --direct --get-all-rules
ipv4 filter f2b-sshd 1000 -j RETURN
ipv4 filter f2b-sshd 0 -s 192.168.43.10 -j REJECT --reject-with icmp-port-unreachable
ipv4 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports ssh -j f2b-sshd

根据" bantime"值,拒绝规则将自动删除,如下所示:

[root@centos-8 ~]# firewall-cmd  --direct --get-all-rules
ipv4 filter f2b-sshd 1000 -j RETURN
ipv4 filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports ssh -j f2b-sshd

配置日志轮换

安装后默认情况下配置日志轮转。
fail2ban-server负责配置日志轮换

[root@centos-8 ~]# rpm -qf /etc/logrotate.d/fail2ban
fail2ban-server-0.10.5-2.el8.noarch

下面是logrotate配置文件:

[root@centos-8 ~]# cat /etc/logrotate.d/fail2ban
/var/log/fail2ban.log {
    missingok
    notifempty
    postrotate
      /usr/bin/fail2ban-client flushlogs >/dev/null || true
    endscript
}

我们可以根据需要向日志轮换文件添加更多选项。
关注logrotate的手册页以获得受支持的选项列表

其他一些fail2ban-client命令(备忘单)

说明:

" fail2ban-client"执行的所有操作或者命令对于当前会话都是临时的,如果重新启动或者重新加载fail2ban服务,则将从数据库中清除所有更改。
在下面的示例中,我将使用现有的" sshd"监狱。

Fail2ban转储配置

要打印Jail的配置:

# fail2ban-client --dp   <-- dump the configuration using more human readable representation
# fail2ban-client -d     <-- dump configuration

获取数据库名称和位置

要获取数据库名称:

# fail2ban-client get dbfile
Current database file is:
`- /var/lib/fail2ban/fail2ban.sqlite3

列出禁止的IP

我们可以使用" fail2ban-client"检查监狱的状态,以获取被禁止的IP列表。

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   192.168.10.0/24

在这种情况下,我们将获得如上所示的禁用IP列表,或者,我们也可以参考日志文件/var/log/fail2ban.log来列出禁用IP和其他详细信息。

禁止IP地址或者网络

使用fail2ban-client可以禁止IP地址或者网络

语法:

fail2ban-client set <JAIL> banip <IP> ... <IP>

示例:

# fail2ban-client set sshd banip 192.168.10.0/24
1

列出sshd监狱的禁止IP:

[root@centos-8 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   192.168.10.0/24

取消IP地址或者网络的禁止

从"监狱"手动"取消禁止" IP地址或者网络

语法:

fail2ban-client set <JAIL> unbanip [--report-absent] <IP> ... <IP>

示例:

# fail2ban-client set sshd unbanip 192.168.10.0/24
1

列出sshd监狱的禁止IP:

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     4
   `- Banned IP list:

Fail2ban操作列表

获取分配给监狱的行动列表

# fail2ban-client get sshd actions
The jail sshd has the following actions:
firewallcmd-sshd

监狱行动命令

要获得不同操作下的命令,例如:

对于动作开始:

# fail2ban-client get sshd action firewallcmd-sshd actionstart
firewall-cmd --direct --add-chain  filter f2b-sshd
firewall-cmd --direct --add-rule  filter f2b-sshd 1000 -j RETURN
firewall-cmd --direct --add-rule  filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports ssh -j f2b-sshd

对于动作检查:

# fail2ban-client get sshd action firewallcmd-sshd actioncheck
firewall-cmd --direct --get-chains  filter | sed -e 's, ,\n,g' | grep -q '^f2b-sshd$'

对于actionstop:

# fail2ban-client get sshd action firewallcmd-sshd actionstop
firewall-cmd --direct --remove-rule  filter INPUT_direct 0 -m conntrack --ctstate NEW -p tcp -m multiport --dports ssh -j f2b-sshd
firewall-cmd --direct --remove-rules  filter f2b-sshd
firewall-cmd --direct --remove-chain  filter f2b-sshd

Fail2banignoreip

要使用" fail2ban-client"获取现有的ignoreip详细信息和网络列表:

# fail2ban-client get sshd ignoreip
These IP addresses/networks are ignored:
|- 127.0.0.0/8
|- ::1
`- 192.168.43.168

分配新的" ignoreip"详细信息和网络:

# fail2ban-client set sshd addignoreip 192.168.11.12 192.168.10.0/24
These IP addresses/networks are ignored:
|- 127.0.0.0/8
|- ::1
|- 192.168.43.168
|- 192.168.11.12
`- 192.168.10.0/24

启动,停止,重新加载监狱

停止监狱配置

# fail2ban-client stop sshd
Jail stopped

开始监狱配置

# fail2ban-client start sshd
Jail started

重新加载监狱的配置

# fail2ban-client reload sshd
OK

日志路径详细信息

我们可以为监狱配置定义要监视的logfile
要获取各个监狱的logpath详细信息,请执行以下操作:

# fail2ban-client get sshd logpath
No file is currently monitored

由于我们使用的是journalmatch,所以没有logpath来添加logpath

# fail2ban-client set sshd addlogpath /var/log/secure