你是否在担心你的服务器被暴力破解?你是否还在担心恶意频繁请求导致你的服务不可用?今天带给大家一款开源防护工具 “Fail2ban” ,从此让你睡个安稳觉,起因是因为自己家里开了公网IP,对外映射了一个内网都Linux机器,方便自己从外面访问到家里,今天一看日志,好家伙,ssh登录失败上千次,作为注重安全的哦,必须想办法阻止这一切。

很多人第一时间想到最好的办法就是使用白名单,只允许指定的IP地址访问到家里,确实是一个不错的办法,但是人在外面网络环境随时都在变化,可能是流量访问又可能是家庭网络,所以不是一个好的办法,为了让自己能访问,又要能把一些“非法”用户阻断,那么就用到了这款 “Fail2ban” ,今天就带大家一起来试试,学会了之后举一反三,它内置了很多规则,简单修改启用就可以达到意想不到的效果。

介绍

《来自ChatGPT生成》Fail2ban 是一款开源的安全工具,可用于自动阻止恶意 IP 地址的攻击、暴力破解等行为。它可以监视各种日志文件,例如 SSH、HTTP、FTP 等服务的日志文件,并根据用户定义的规则对恶意行为进行检测和响应。

Fail2ban 的工作方式如下:

  1. 监视日志文件:Fail2ban 会监视指定的日志文件,例如 SSH、HTTP、FTP 等服务的日志文件。
  2. 匹配规则:Fail2ban 会根据用户定义的规则(也称为“过滤器”)对日志文件进行匹配。规则通常基于正则表达式,以识别恶意行为,例如登录失败尝试、恶意请求等。
  3. 触发响应:当匹配到规则时,Fail2ban 会触发定义的响应操作,例如将攻击者的 IP 地址添加到防火墙规则中以阻止其访问,或向管理员发送电子邮件报警。
  4. 自动解封:Fail2ban 还提供了自动解封功能,可以在一段时间后自动解封被阻止的 IP 地址,以避免误阻止合法用户。

Fail2ban 的优点包括:

  • 自动化阻止恶意行为,减轻管理员的工作负担。
  • 可以根据用户定义的规则进行灵活配置。
  • 支持自动解封功能,避免误阻止合法用户。
  • 可以与其他安全工具(例如防火墙)集成使用,提高安全性。

但 Fail2ban 也有一些缺点,例如:

  • 对于一些高级的攻击行为可能无法有效防御。
  • 在某些情况下可能会误阻止合法用户,例如当多个用户共享同一 IP 地址时。
  • 需要一定的配置和管理工作,以保证其有效性和安全性。

总体来说,Fail2ban 是一款非常有用的安全工具,可以帮助管理员自动阻止恶意行为,提高系统的安全性和稳定性。

Fail2ban官网:http://www.fail2ban.org/

Github开源地址:https://github.com/fail2ban/fail2ban

实战

1、安装Fail2ban

# Ubuntu、 本次演示使用Ubuntu 22.04.1 LTS,Fail2Ban v0.11.2版本下演示整个过程
sudo apt install fail2ban

# CentOS
sudo yum install fail2ban 

2、认识Fail2ban目录

Fail2ban安装完后就自带了很多缺省的配置,简单点说就是无需配置直接启用也能达到一定的效果,Fail2ban默认安装在/etc/fail2ban目录下,文件树形如下:

/etc/fail2ban/
├── action.d # 各种动作,默认自带很多常用的
│    ├── dummy.conf
│    ├── hostsdeny.conf
│    ├── iptables.conf
│    ├── mail-whois.conf    
│    ├── mail.conf
│    ├── shorewall.conf
│    └── xxxxx.conf
│    .......
├── fail2ban.conf  # 默认缺省配置
├── fail2ban.d # 启动目录
├── filter.d # 各种过滤器,默认自带很多常用的
│    ├── apache-auth.conf
│    ├── apache-noscript.conf
│    ├── couriersmtp.conf
│    ├── postfix.conf
│    ├── proftpd.conf
│    ├── qmail.conf
│    ├── sasl.conf
│    ├── sshd.conf            
│    └── xxxxx.conf
│    .......
├── jail.conf # 默认监视配置
└─  jail.d
     └── defaults-debian.conf           ## SSH 相关配置

安装完成之后默认的缺省配置建议不要去动,我们直接拷贝默认的配置然后修改个性化的东西,这样是方便我们后续官方升级也不用担心不兼容,因为最终程序会将我们自定义的配置去覆盖缺省配置,没有修改的地方就会使用缺省配置。

3、配置Fail2ban启用SSH防护

  • 拷贝默认配置
# 切换到fail2ban目录
cd /etc/fail2ban
# 拷贝默认缺省配置
sudo cp fail2ban.conf fail2ban.local
# 拷贝默认监视配置,如果不想要全量的配置,可以不拷贝直接新增一个空文件自己编辑
sudo cp jail.conf jail.local
  • 自定义SSH防护规则,编辑jail.local文件,可参考如下:

    #DEFAULT配置开始 类似于全局配置,单个服务不配就使用默认的配置
    [DEFAULT]
    ignoreip = 127.0.0.1/8 ::1
    bantime = 1h
    findtime = 1m
    maxretry = 3
    banaction = firewallcmd-ipset
    action = %(action_mwl)s
    #DEFAULT配置结束
    
    #sshd服务配置开始
    [sshd]
    enabled = true
    filter = sshd
    port = 22
    maxretry = 3
    findtime = 60
    bantime = -1
    action = %(action_mwl)s
    #sshd服务配置结束

    各参数介绍:

    • ignoreip:永远不会被禁止的IP地址白名单。他们拥有永久的“摆脱监狱”卡。本地主机的IP地址(127.0.0.0.1/8)是在列表中默认情况下,其IPv6相当于(::1)。如果确认永远不应禁止的其它IP地址,请将它们添加到此列表中,并在每个IP地址之间留一个空格
    • bantime: 禁止IP地址的持续时间(“ m”代表分钟)。如果键入的值不带“ m”或“ h”(代表小时),不填则将其视为秒。值 -1将永久禁止IP地址。要非常小心,不要将自己的计算机给关了起来,这是非常有可能发生的低级错误。
    • findtime: 尝试失败的连接次数过多会导致IP地址被禁止的时间。
    • maxretry: “尝试失败次数过多”的数值。

    上面的配置表示ssh服务在60s的周期内最大尝试3次失败,违反这个规则然后封禁IP永久。

4、启用并验证Fail2ban是否生效

# 启用fail2ban
sudo systemctl start fail2ban
# 查看状态 ,状态是running就对了,没对就检查配置
sudo fail2ban-client status
# 查看sshd服务具体状态
sudo fail2ban-client status sshd

默认输出一下内容:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

接下来我们通过自己的机器连续登录错误再看看状态:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     6
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     3
   `- Banned IP list: 192.168.1.12

可以看到我连续ssh登录错误之后 Banned IP 出现了我的机器IP,然后从此再也连接不上ssh了,只有通过可视化工具接管服务器删除被Ban的IP,命令为:

fail2ban-client set sshd unbanip 192.168.1.12

我们继续查看fail2ban的日志,可以发现登录的IP都能看到,何时被Ban的也有。

root@ubuntu-dev:~# tail -f /var/log/fail2ban.log
2023-08-02 22:31:26,770 fail2ban.filter         [2906926]: INFO    [sshd] Found 192.168.1.12 - 2023-08-02 22:31:26
2023-08-02 22:31:29,616 fail2ban.filter         [2906926]: INFO    [sshd] Found 192.168.1.12 - 2023-08-02 22:31:29
2023-08-02 22:31:33,925 fail2ban.filter         [2906926]: INFO    [sshd] Found 192.168.1.12 - 2023-08-02 22:31:33
2023-08-02 22:31:34,271 fail2ban.actions        [2906926]: NOTICE  [sshd] Ban 192.168.1.12
2023-08-02 22:33:13,076 fail2ban.actions        [2906926]: NOTICE  [sshd] Unban 192.168.1.12

总结

以上就完整的演示了如果使用Fail2ban保护自己的SSH服务,你可以举一反三保护你的nginx、mysql、redis、以及自建的一些服务,一些开源项目很多文档里面也写了如何配置fail2ban,比如giteavaultwarden,在找到Fail2ban也发现有人通过python脚本去解析对应的日志文件,抓取并统计然后进行执行防火墙阻断操作,其实Fail2ban也是同样的原理,定义要监控的日志文件,然后通过filter过滤出需要监视的内容,最终去执行action操作添加防火墙规则。

网络安全不容小觑,数据无价,除了日常做到定时备份,也要做到尽量把威胁阻挡在门外,以上就是Fail2ban全部内容了,觉得不错赶快去动手尝试吧。

Fail2ban常用命令备忘

  • fail2ban-client ping:测试fail2ban服务是否启动成功,成功会输出pong
  • fail2ban-server -V:查看fail2ban版本号
  • fail2ban-client status sshd : 查看某个服务(这里是sshd,对应jail.local配置文件中[sshd])规则下被封禁的IP情况
  • fail2ban-client set sshd unbanip 192.168.1.12:解除某个服务的IP封禁,这里是解除sshd服务192.168.1.12的封禁
  • fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf:测试filter规则是否正确
  • tail /var/log/fail2ban.log:查看Fail2ban日志信息
  • fail2ban-client unban --all慎用,清理所有被ban的IP

参考文章

从零开始使用fail2ban

Fail2Ban 简介与使用

宝塔面板6.X安装fail2ban+ Firewalld防止CC攻击

Vaultwarden Fail2ban 设置

Fail2ban setup to block users after failed login attempts

文章目录