使用Fail2Ban防火墙工具


Fail2Ban:禁止导致多个身份验证错误的主机!

Fail2Ban 是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以 Python 程式设计语言编写,并能够在类 Unix 系统上运行,这些系统具有本地安装的封包控制系统或防火墙的界面,例如 IptablesTCP Wrapper 工具等。需要注意的是 Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险,而只是服务器防止暴力攻击的安全手段之一。

使用Fail2Ban防火墙工具


1. 工具特点介绍

主要介绍 Fail2Ban 工具的原理和注意事项!

使用Fail2Ban防火墙工具

  • 工作原理

Fail2ban 是使用 Python 编程语言编写的,其功能跟 DenyHosts 是类似的,可以阻挡有人恶意以字典暴力破解密码,通常应用于有开启 sshdtelnetdftpd 的主机上。而 Fail2ban 防止工具的做法是扫描 /var/log/auth.log 之类的日志文件,对检测过多的失败的异常登录进行禁止。通过更新系统防火墙规则以在可配置的时间内拒绝来自那些 IP 地址的新连接来实现此目的,用 iptables(给 IPv4 使用)或 ip6tables(给 IPv6 使用)禁止该 IP 之后的连线。至于,要多久之后可以再允许该 IP 再次连线可以在 Fail2ban 的设定档案内设定。

  • 注意事项
    • v0.10 版本开始,fail2ban 支持 IPv6 地址的匹配。

2. 工具安装启用

介绍多系统的多种工具安装方式!

  • Ubuntu
# 确保系统更新到了最新版
$ sudo apt-get update && apt-get upgrade -y

# 安装Fail2Ban工具之后服务将自动启动
$ sudo apt install -y fail2ban

# 如果需要支持电子邮件的话,需要安装Sendmail服务
$ sudo apt install -y sendmail

# 允许通过UFW进行SSH访问,然后启用防火墙
$ sudo ufw allow ssh
$ sudo ufw enable
  • CentOS7
# 安装EPEL源
$ sudo yum -y update && sudo yum install -y epel-release

# 安装Fail2Ban工具
$ sudo yum install -y fail2ban

# 如果需要支持电子邮件的话,需要安装Sendmail服务(Sendmail不需要使用Fail2Ban工具)
$ sudo yum install -y sendmail

# 启动并启用Fail2ban和Sendmail
$ sudo systemctl start fail2ban
$ sudo systemctl enable fail2ban
$ sudo systemctl start sendmail
$ sudo systemctl enable sendmail

# 如果遇到提示“没有目录/var/run/fail2ban”或者套接字文件
# “/var/run/fail2ban/fail2ban.sock”的错误,手动创建即可
$ sudo mkdir /var/run/fail2ban
  • Debian
# 确保系统更新到了最新版
$ sudo apt-get update && apt-get upgrade -y

# 安装Fail2Ban工具之后服务将自动启动
$ sudo apt install -y fail2ban

# 如果需要支持电子邮件的话,需要安装Sendmail服务
$ sudo apt install -y sendmail-bin sendmail

3. 修改配置文件

安装 fail2ban 工具完成之后,重点就是如何配置其对应的配置文件了。

  • [配置文件] => 默认情况下,Fail2Ban 将所有配置文件保存在 /etc/fail2ban/ 目录中。主配置是 jail.conf 文件,它包含一组预定义的过滤器,所以尽量不要编辑该文件,除非你知道自己在干什么。而且只要有新的更新,该配置配置就会重置为默认值。而我们要做的就是,在同一目录下创建一个名为 jail.local 的新配置文件,并根据自己的意愿进行修改,即可。
# 虽然会优先读取jail.conf文件,但是jail.local文件会覆盖前者的配置
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  • [进程管理] => 如果你使用的是 CentOSFedora 的操作系统,则需要将 jail.local 配置文件中的 backend 选项从 auto 更改为 systemd。虽然在 Debian8+Ubuntu 16.04+ 上也都是使用了 systemd 来管理服务进程的,但这并不是必需的设置。默认情况下,在 CentOS7 中默认的配置文件是没有启用任何服务的,如果我们需要启动对应服务的话,需要手动修改配置文件,例如要启用 SSH 守护程序。
# /etc/fail2ban/jail.local

# "backend" specifies the backend used to get files modification.
# Available options are "pyinotify", "gamin", "polling", "systemd" and "auto".
# This option can be overridden in each jail as well.
backend = systemd
  • [配置服务] => Fail2Ban 自带有一组预定义的过滤器,用于各种服务,如 sshapachenginx 等。我们不用对配置文件进行过多的更改,只需在对应服务区域中添加 enabled = true 启用该服务。禁用服务时将 true 改为 false 即可。
# /etc/fail2ban/jail.local
# enabled: 表明服务是要打开还是关闭
# port: 使用默认端口则填写服务名称;非传统端口则需要填写端口号
# logpath: 提供服务日志的位置
# backend: 指定用于获取文件修改的后端

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 5
  • [服务分离] => 如果需要监控的服务太多的话,放到一个配置文件里面,找起来还是又不方便的地方。所以,我们可以针对不同的服务配置创建不同的配置文件,每个配置文件立里面只配置对应服务的配置即可。将对应的配置放到 /etc/fail2ban/jail.d/ 目录下面,即可。
# /etc/fail2ban/jail.d/sshd.local

[sshd]
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8
  • [设置白名单] => 默认情况下,大多数选项都已经配置的很完美了,如果要启用忽略对某些特定 IP 的访问控制,则可以将 IP 地址添加到 ignoreip 区域即可。对于多个 IP 的情况,用空格隔开 IP 地址。配置文件中的 DEFAULT 部分包含 Fail2Ban 遵循的基本规则集,您可以根据自己的意愿调整任何参数。
# /etc/fail2ban/jail.local
# ignoreip: Fail2Ban不会禁止与列表中的地址匹配的主机;白名单
# bantime: 封禁时间秒,默认是10分钟
# findtime: 如果在最近findtime秒期间已经发生了maxretry次重试,则主机会被禁止
# maxretry: 最大重试次数,子项未设置时以此为准
# sendername: 发件人名称G
# sender: 用于发送告警邮件的邮箱地址
# destemail: 用于接收警报电子邮件的邮箱地址

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.100/24
bantime = 600
findtime = 600
maxretry = 3
sender = [email protected]
destemail = [email protected]

4. 使用方式说明

配置好配置文件之后,如果查看对应服务呢?=> fail2ban-client

  • 工具服务启停操作
# 启动Fail2ban服务
$ sudo systemctl start fail2ban

# 停止Fail2ban服务
$ sudo systemctl stop fail2ban

# 开机自启动Fail2ban服务
$ sudo systemctl enable fail2ban
  • 查看启用的服务监控列表
$ sudo fail2ban-client status
Status
|- Number of jail:  2
`- Jail list:   apache-auth, sshd
  • 获取 SSH 服务禁止的 IP 地址
$ sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
| |- File list: /var/log/auth.log
| |- Currently failed: 1
| `- Total failed: 3
`- action
 |- Currently banned: 1
 | `- IP list: 192.168.1.115
 `- Total banned: 1

# 根据配置文件中的服务配置字段
$ sudo fail2ban-client status ssh-iptables
  • 删除禁止的 IP 地址
# 根据配置文件中的服务配置字段
$ sudo fail2ban-client set ssh unbanip 192.168.1.115
$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.115
  • 手动添加白名单
# 根据配置文件中的服务配置字段
$ sudo fail2ban-client set ssh addignoreip 192.168.1.115
$ sudo fail2ban-client set ssh-iptables addignoreip 192.168.1.115

5. 示例演示说明

介绍几种常见服务配置的方式,拿来即用!

  • [1] 防止 SSH 密码爆破
# [ssh-iptables]模块的配置修改
[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=22, protocol=tcp]
logpath  = /var/log/secure
maxretry = 3
findtime = 300
  • [2] 阻止恶意扫描
# 新增[nginx-dir-scan]模块
[nginx-dir-scan]
enabled = true
filter = nginx-dir-scan
action   = iptables[name=nginx-dir-scan, port=443, protocol=tcp]
logpath = /path/to/nginx/access.log
maxretry = 1
bantime = 172800
findtime  = 300
  • [3] 防止 CC 攻击
# 新增[nginx-cc]模块
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
  • [4] 防止 vsftpd 攻击规则
[vsftpd-notification]
enabled = true
filter = vsftpd
action = sendmail-whois[name=VSFTPD, dest=[email protected]]
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 1800

[vsftpd-iptables]
enabled = true
filter = vsftpd
action = iptables[name=VSFTPD, port=ftp, protocol=tcp]
           sendmail-whois[name=VSFTPD, dest=[email protected]]
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 1800

6. 参考链接地址

送人玫瑰,手有余香!


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录