在Ubuntu 18.04和RHEL/CentOS 8上进行Fail2ban SSH配置
在本文中,我将分享在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