93·安全加固进阶

fail2ban 防暴力破解

fail2banintrusion

第 93 课 - fail2ban 防暴力破解

学习目标

完成本课学习后,你将能够:

  1. 理解 fail2ban 的工作原理及其在系统安全中的作用。
  2. 安装、配置并启动 fail2ban 服务。
  3. 查看和管理 fail2ban 的封禁状态与日志。
  4. 根据需求自定义 fail2ban 的过滤器和监狱(jail)。
  5. 将 fail2ban 应用于 SSH、Web 服务等常见场景以增强安全性。

核心概念

想象一下,你的服务器是一栋房子,而 SSH、Web 登录页面等服务是房子的门。fail2ban 就是一个尽职的保安,他不睡觉,时刻盯着门口的监控日志(日志文件)。如果发现有人在短时间内连续尝试用错误钥匙开门(多次登录失败),他就会立即拉下卷帘门(调用防火墙规则),把这个人的IP地址临时挡在门外一段时间。

简单来说,fail2ban 是一个入侵防御工具。它的核心任务是:

  1. 监控:实时监视指定的日志文件(如 /var/log/auth.log, /var/log/nginx/access.log)。
  2. 匹配:使用“过滤器”(Filter)中的正则表达式,识别日志中的恶意行为模式(如“登录失败”的错误信息)。
  3. 行动:当某个IP在设定时间内触发了足够多的恶意匹配次数,它就会调用“行动”(Action),最常见的是更新防火墙(iptables, firewalld, nftables)规则,封禁该IP。
  4. 自动解封:封禁是临时的,在设定的时间后会自动解封。

代码示例

1. 安装与基础配置(以 Ubuntu/Debian 为例)

# 更新软件包列表
sudo apt update

# 安装 fail2ban
sudo apt install fail2ban -y

# 安装完成后,fail2ban 会自动启动。我们可以检查它的状态。
sudo systemctl status fail2ban
# 输出中应能看到 “active (running)”

# 复制默认配置文件以创建本地配置,避免直接修改原文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑本地配置文件进行个性化设置
sudo nano /etc/fail2ban/jail.local

2. 配置并启用 SSH 保护

/etc/fail2ban/jail.local 文件中,找到 [sshd] 段落(或在 [DEFAULT] 段落中修改全局设置)。确保其配置类似如下:

[DEFAULT]
# 默认封禁时间(秒),这里设为1小时(3600秒)
bantime = 3600
# 在 `findtime` 秒内,如果失败次数达到 `maxretry`,则封禁
findtime = 600
maxretry = 5
# 使用哪个防火墙后端,通常 iptables-multiport 或 firewalld
banaction = iptables-multiport

[sshd]
# 启用这个监狱
enabled = true
# 端口,SSH默认为22,也可以是 “ssh, 22, 2222” 表示多个端口
port = ssh
# 日志文件路径
logpath = /var/log/auth.log
# 过滤器名称,fail2ban 自带匹配 SSH 登录失败的过滤器
filter = sshd
# 如果希望覆盖 [DEFAULT] 中的设置,可以在这里单独指定
# maxretry = 3
# bantime = 7200

修改配置后,需要重启 fail2ban 服务使更改生效。

sudo systemctl restart fail2ban

3. 查看 fail2ban 运行状态

# 查看所有启用的监狱(jail)状态
sudo fail2ban-client status

# 查看名为 `sshd` 的监狱的详细状态(被封禁IP列表等)
sudo fail2ban-client status sshd
# 输出示例:
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed:	1
# |  |- Total failed:	8
# |  `- File list:	/var/log/auth.log
# `- Actions
#    |- Currently banned:	1
#    |- Total banned:	2
#    `- Banned IP list:	192.168.1.100

# 手动封禁一个IP地址(测试用)
sudo fail2ban-client set sshd banip 10.0.0.5

# 手动解封一个IP地址
sudo fail2ban-client set sshd unbanip 10.0.0.5

# 查看 fail2ban 的日志,了解其工作细节
sudo tail -f /var/log/fail2ban.log

实践练习

练习 1:基础配置与验证

  1. 在你的测试服务器上安装 fail2ban。
  2. 启用 [sshd] 监狱,设置 maxretry = 3, bantime = 1800(30分钟)。
  3. 重启 fail2ban 服务。
  4. 从另一台机器上,故意输错密码登录 SSH 3次,然后用 fail2ban-client status sshd 查看你的IP是否已被封禁。

练习 2:自定义过滤器 你的 Nginx 访问日志 /var/log/nginx/access.log 中可能会出现大量对 /wp-login.php 的 POST 请求,这可能是暴力破解 WordPress 密码的尝试。你需要创建一个自定义过滤器来捕获这些请求。

  1. /etc/fail2ban/filter.d/ 目录下创建一个名为 nginx-wp-login.conf 的文件。
  2. 文件中写入如下过滤器配置:
    [Definition]
    failregex = ^<HOST> .* "POST /wp-login.php" .*$
    ignoreregex =
    
    注:^<HOST> 是 fail2ban 的一个变量,它会自动匹配并捕获日志行开头的IP地址。
  3. /etc/fail2ban/jail.local 文件末尾添加一个新的监狱:
    [nginx-wp-login]
    enabled = true
    port = http,https
    logpath = /var/log/nginx/access.log
    filter = nginx-wp-login
    maxretry = 5
    bantime = 3600
    
  4. 重启 fail2ban,观察日志是否开始工作。

练习 3:综合场景 配置 fail2ban 同时保护 SSH 服务(严格模式:3次失败封禁1小时)和上述的 Nginx WordPress 登录页(5次失败封禁1小时)。分别从两台客户端机器模拟攻击,验证两个监狱是否独立工作,互不干扰。

常见错误

  1. 配置文件语法错误:修改 jail.local 或自定义过滤器时,格式不正确(如缺少节名 [sshd]、冒号写错、有多余的空格)会导致 fail2ban 启动失败。务必使用 sudo fail2ban-client -t 命令测试配置文件语法。
  2. 日志路径错误logpath 指定的日志文件不存在或路径不正确,fail2ban 无法读取日志,自然也无法工作。使用 ls -l /var/log/auth.log 等命令确认文件存在。
  3. 忘记重启服务:修改配置文件后,必须执行 sudo systemctl restart fail2bansudo fail2ban-client reload,否则更改不会生效。
  4. 防火墙规则冲突:如果服务器上已经有其他复杂的 iptables 规则,fail2ban 添加的规则可能会与之冲突或被覆盖。检查 iptables -L -n 查看规则链。
  5. 日志轮转后监控中断:如果被监控的日志文件被 logrotate 轮转(如 auth.log 变为 auth.log.1),fail2ban 默认可能会失去追踪。可以在 jail.local[DEFAULT] 中添加 backend = polling 或确保 logpath 指向的是主日志文件,且 fail2ban 服务能感知到轮转。

小结

  • 核心作用:fail2ban 是一个基于日志分析的自动入侵防御系统,通过临时封禁恶意IP来暴力破解等攻击。
  • 关键组件:它由“过滤器”(定义什么是恶意行为)和“行动”(定义如何封禁)组成,它们被组合在“监狱”(jail)中。
  • 基本流程:监控日志 -> 模式匹配 -> 触发阈值 -> 调用防火墙封禁 -> 自动解封。
  • 实用操作:学会使用 fail2ban-client status 查看状态,systemctl 管理服务,并能够通过编辑 jail.local 文件轻松启用针对不同服务的保护。
  • 价值:fail2ban 极大地增强了服务器对外界自动化攻击的防御能力,是服务器安全加固工具箱中的重要一员。配置简单,但效果显著。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「auditd 审计系统」 以巩固所学知识。