利用 fail2ban 保护 SSH 服务器

利用 fail2ban 保护 SSH 服务器

      • [一、关于 fail2ban](#一、关于 fail2ban)
        • [1. 基本功能与特性](#1. 基本功能与特性)
        • [2. 工作原理](#2. 工作原理)
      • 二、安装与配置
        • [1. Debian/Ubuntu系统:](#1. Debian/Ubuntu系统:)
        • [2. CentOS/RHEL系统:](#2. CentOS/RHEL系统:)
      • [三、保护 SSH](#三、保护 SSH)
      • [四、启动 fail2ban 服务](#四、启动 fail2ban 服务)
      • 五、测试和验证
      • [六、查看封禁的 IP 地址](#六、查看封禁的 IP 地址)
      • 七、一些配置
      • 八、注意事项

作者:高玉涵

时间:2024.6.30 12:56

博客:blog.csdn.net/cg_i

环境:CentOS8

左右左右下下 按按 滴------抓娃娃机

一、关于 fail2ban

Fail2ban是一款实用的入侵防御软件,旨在保护服务器免受暴力攻击,特别是通过密码猜测和暴力破解的方式。以下是关于Fail2ban的详细介绍:

1. 基本功能与特性
  1. 日志监控与封禁 :Fail2ban能够监视系统日志文件,如/var/log/auth.log/var/log/apache/access.log等,匹配日志中的错误信息(通过正则表达式匹配),并对符合特定规则的IP地址执行封禁操作。
  2. 支持多种服务和动作:Fail2ban支持大量的服务,如sshd、apache、qmail、proftpd等,并允许执行多种动作,如通过iptables或tcp-wrapper更新防火墙规则,发送邮件通知等。
  3. 灵活性高:用户可以根据自己的需求自定义监控规则、封禁时间和动作,Fail2ban的配置文件提供了丰富的选项来满足这些需求。
  4. 开箱即用:Fail2ban附带了许多服务的默认过滤器,用户无需从头开始配置即可快速部署。
2. 工作原理

Fail2ban通过扫描系统日志文件来检测失败的登录尝试或恶意行为。当检测到某个IP地址在指定时间内超过预设的失败尝试次数时,Fail2ban会根据配置执行相应的封禁动作,如通过iptables更新防火墙规则以拒绝该IP地址的访问。此外,Fail2ban还可以配置为在封禁IP地址时发送邮件通知给管理员。

二、安装与配置

Fail2ban的安装和配置相对简单,以下以基于Debian和CentOS的系统为例说明安装步骤:

1. Debian/Ubuntu系统:
  • 更新软件源:sudo apt-get update
  • 安装Fail2ban:sudo apt-get install -y fail2ban
2. CentOS/RHEL系统:
  • 更新软件源:sudo yum update
  • 安装EPEL仓库(如果尚未安装):sudo yum install -y epel-release
  • 安装Fail2ban:sudo yum install -y fail2ban

配置Fail2ban时,通常建议编辑/etc/fail2ban/jail.local文件(如果不存在,则从/etc/fail2ban/jail.conf复制一份并重命名)。在该文件中,可以启用和配置不同的监控服务,设置全局参数(如封禁时间、最大尝试次数等),以及为特定服务配置日志路径和动作。

三、保护 SSH

shell 复制代码
[root@centos8 ~]vi /etc/fail2ban/jail.local

添加以下内容并保存:

shell 复制代码
[sshd]
enabled = true
filter = sshd
port = 22
logpath = /var/log/secure
maxretry = 3
bantime = 600

下面是对每一行配置的解释:

  • enabled = true:启用对sshd服务的监控。
  • filter = sshd:使用sshd过滤器来匹配日志中的错误信息。
  • port = 22:指定sshd服务监听的端口号,默认是22。
  • logpath = /var/log/secure:指定sshd服务的日志文件路径。在大多数基于Red Hat的系统中,sshd的日志记录在/var/log/secure文件中。
  • maxretry = 3:设置最大尝试次数。如果某个IP地址在指定时间内尝试连接sshd服务并失败超过3次,则触发封禁动作。
  • bantime = 600:设置封禁时间,单位为秒。在这个例子中,被封禁的IP地址将在600秒内无法访问sshd服务。

四、启动 fail2ban 服务

shell 复制代码
systemctl enable --now fail2ban

因我已启用了 fail2ban 为了让新配置生效,重启服务即可。

shell 复制代码
[root@centos8 ~]# systemctl restart fail2ban
[root@centos8 ~]# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2024-06-30 13:22:15 CST; 5s ago
     Docs: man:fail2ban(1)
  Process: 3847005 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS)
  Process: 3847068 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
 Main PID: 3847070 (fail2ban-server)
    Tasks: 15 (limit: 49300)
   Memory: 22.8M
   CGroup: /system.slice/fail2ban.service
           ├─3847070 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start
           ├─3847098 /bin/bash /usr/sbin/sendmail -f root@centos8. root@localhost
           ├─3847116 /bin/bash /usr/sbin/sendmail -f root@centos8. root@localhost
           ├─3847134 /bin/bash /usr/sbin/sendmail -f root@centos8. root@localhost
           ├─3847137 /usr/bin/dotlockfile -p -l /root/.esmtp_queue/.deliver_lock
           ├─3847138 /usr/bin/dotlockfile -p -l /root/.esmtp_queue/.deliver_lock
           └─3847492 /bin/bash /usr/sbin/sendmail -f root@centos8. root@localhost

Jun 30 13:22:15 centos8 systemd[1]: fail2ban.service: Succeeded.
Jun 30 13:22:15 centos8 systemd[1]: Stopped Fail2Ban Service.
Jun 30 13:22:15 centos8 systemd[1]: Starting Fail2Ban Service...
Jun 30 13:22:15 centos8 systemd[1]: Started Fail2Ban Service.
Jun 30 13:22:16 centos8 fail2ban-server[3847070]: Server ready

五、测试和验证

客户端:连续输错 3 次密码:

shell 复制代码
ssh root@10.10.10.138
root@10.10.10.138's password:(随便输入)
Permission denied,please try again.
root@10.10.10.138's password:(随便输入)
Permission denied,please try again.
root@10.10.10.138's password:(随便输入)
Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password).

再次连接到服务器:

shell 复制代码
ssh root@10.10.10.138
ssh:connect to host 10.10.10.138 port 22: Connection refused(连接断开,没有给我们输入密码的机会)

六、查看封禁的 IP 地址

  • 查看封禁状态

通过防火墙策略查看当前封禁的 IP 地址:

shell 复制代码
[root@centos8 ~]firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	rule family="ipv4" source address="10.10.10.128" port port="ssh" protocol="tcp" reject type="icmp-port-unreachable"(IP 被禁止访问 SSH 端口。)

通过 fail2ban-client status命令检查:

shell 复制代码
fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd

可以看到此时有一条 Jail 生效为 sshd 的信息。要想进一步了解通过 fail2ban-client status sshd命令获得详细信息。

shell 复制代码
[root@centos8 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	2
|  `- Journal matches:	_SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned:	1
   |- Total banned:	2
   `- Banned IP list:	10.10.10.128

我们主要关注ActionsCurrently banned当前封禁 IP 数量、Total banned总封禁次数、Banned IP list封禁的 IP 地址。

七、一些配置

shell 复制代码
[nginx-http-auth]
# HTTP 验证防暴力破解
enabled = true
filter = nginx-http-auth
port = 80
logpath = /var/log/nginx/error.log

[nginx-badbots]
# 屏蔽爬虫
enabled = true
port = 80
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2

[nginx-nohome]
# 避免恶意请求网站目录结构
enable = true
port = 80
filter = nginx-nohome
logpath = /var/log/nginx/access.log
maxretry = 2

[nginx-noproxy]
# 避免被人利用反向代理
enable = true
port = 80
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2

八、注意事项

  • 在配置Fail2ban时,应谨慎设置封禁时间和最大尝试次数等参数,以避免误封合法用户。
  • Fail2ban虽然能够降低恶意登录尝试的发生率,但并不能完全消除弱身份验证带来的安全风险。因此,建议结合其他安全措施(如多因子认证)来提高系统的整体安全性。
  • 定期检查和更新Fail2ban的配置文件和规则集,以确保其能够有效地应对新的安全威胁。
相关推荐
九河云44 分钟前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock1 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零2 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
一坨阿亮4 小时前
Linux 使用中的问题
linux·运维
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
wclass-zhengge6 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱6 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范
free7 小时前
netstat中sendq/recvq用于排查发送端发送数据的问题
服务器
力姆泰克8 小时前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节