在CentOS 7上,如何使用Fail2Ban保护SSH

・13 分钟阅读

介绍

通过SSH连接到服务器可能非常安全,但是,SSH守护进程本身是一个必须向Internet公开才能正常运行的服务,这带来了一些固有的风险,为攻击者提供了攻击的载体。

任何暴露在网络中的服务都是这种方式的潜在目标,如果你注意这些服务的应用程序日志,你会经常看到重复的系统登录尝试,它们代表了用户和机器人的暴力攻击。

一个名为Fail2ban的服务可以通过创建基于预定义的不成功登录次数的规则来减少这个问题,这将允许你的服务器响应非法访问尝试,而不需要你的干预。

在本指南中,我们将介绍如何在CentOS 7服务器上安装和使用Fail2ban 。

在CentOS 7上安装Fail2ban

虽然Fail2ban在官方CentOS包存储库中不可用,但是,它被打包为 EPEL 项目,EPEL代表企业Linux的额外软件包,可以安装一个可从CentOS获得的发行包:

  • 
    sudo yum install epel-release
    
    

将提示你输入continue---press,然后输入:

yum prompt
Transaction Summary ============================================================================ Install 1 Package Total download size: 14 k Installed size: 24 k Is this ok [y/d/N]: y

现在我们应该能够安装fail2ban软件包了:

  • 
    sudo yum install fail2ban
    
    

再次按y键并在提示继续时输入。

安装完成后,使用systemctl来启用fail2ban服务:

  • 
    sudo systemctl enable fail2ban
    
    

配置本地设置

Fail2ban服务将它配置文件保存在/etc/fail2ban目录中,在那里,你可以找到一个名为jail.conf的默认值,由于这个文件可能被包升级覆盖,所以,我们不应该在这里编辑它,相反,我们将编写一个名为jail.local ,在jail.local中定义的任何值都将覆盖jail.conf中的值。

jail.conf包含一个[DEFAULT]节,后面是各个服务的各个部分,jail.local可以重写这些值中的任何一个,此外,/etc/fail2ban/jail.d/中的文件可以用来覆盖这两个文件中的设置,文件按以下顺序应用:

  1. /etc/fail2ban/jail.conf
  2. /etc/fail2ban/jail.d/*.conf,按字母顺序,
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local,按字母顺序,

任何文件都可以包含[DEFAULT]部分,首先执行,并且还可以包含单个jail的部分,为给定参数设置的最后一个vavalue优先。

让我们先编写一个非常简单的jail.local版本,使用nano (或者你的编辑)打开一个新文件:

  • 
    sudo nano /etc/fail2ban/jail.local
    
    

粘贴以下内容:

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

这将覆盖三个设置:它为所有服务设置一个新的默认bantime,确保我们在防火墙配置中使用iptables,并启用sshd

退出并保存新文件(在nano里按 Ctrl-X退出要节省一磅的y,输入以确认文件名),,现在,我们可以使用systemctl重启fail2ban服务:

  • 
    sudo systemctl restart fail2ban
    
    

systemctl命令应该没有任何输出,为了检查服务是否正在运行,我们可以使用fail2ban-client

  • 
    sudo fail2ban-client status
    
    
Output
Status |- Number of jail: 1 `- Jail list: sshd

你还可以获取有关特定监狱的更多详细信息:

  • 
    sudo fail2ban-client status sshd
    
    

浏览可用的设置

我们上面定义的jail.local版本是很好的开始,但是,你可能需要调整一些其他设置,打开jail.conf,我们将检查一些缺省值,如果你决定更改这些值,请记住它们应该复制到jail.local的适当部分,而不是修改。

  • 
    sudo nano /etc/fail2ban/jail.conf
    
    

所有jail的默认设置

首先,滚动[DEFAULT]部分。


ignoreip = 127.0.0.1/8

你可以通过向ignoreip参数添加值来调整Fail2ban忽略的源地址,目前,它被配置成禁止任何来自本地机器的流量,通过将附加地址追加到参数的末尾,以空格分隔,可以包含其他地址。

 
bantime = 600

 

bantime参数设置当客户端无法正确验证时将被禁止的时间长度,这是以秒计的,默认情况下,此设置设置为600秒,或10分钟。


findtime = 600
maxretry = 3

接下来要注意的两个参数是findtimemaxretry ,这些工作共同建立了客户应该被禁止的条件。

maxretry变量设置客户端在被findtime禁止之前定义的时间窗口中进行身份验证的尝试数,使用默认设置,Fail2ban将禁止客户端在10分钟窗口内尝试登录3次。


destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

如果希望配置电子邮件警报,则可能需要重写destemailsendernamemta设置,destemail参数设置应该接收禁止消息的电子邮件地址,sendername设置电子邮件中的"from字段的值,mta参数配置用于发送邮件的邮件服务。


action = $(action_)s

此参数配置Fail2ban要对它进行屏蔽时所采取的操作,在该参数之前不久,将在文件中定义值action_ ,默认操作是仅配置防火墙,以便在禁止禁止时间之前拒绝来自问题主机的流量。

如果要配置电子邮件警报,可以将此值从action_重写为action_mw ,如果希望电子邮件包含相关的日志行,可以将它更改为action_mwl ,如果你选择使用邮件警报,你将要确保你已经配置了适当的邮件设置。

单个jail的设置

[DEFAULT]之后,我们将会遇到配置不同服务的单个jail的部分,这些通常包括一个被禁止的port和一个监视恶意访问尝试的logpath ,例如,在jail.local中已经启用的SSH jail具有以下设置:

/etc/fail2ban/jail.local

[sshd]

port = ssh
logpath = %(sshd_log)s

这种情况下,ssh是标准SSH端口的预先定义变量,%(sshd_log)s使用在Fail2ban配置(这有助于在不同操作系统之间保持jail.conf可移植性)的其他地方定义的值。

可能会遇到的另一个设置是filter,用于决定日志中的行是否表示失败的身份验证。

filter值实际上是对位于/etc/fail2ban/filter.d目录中的文件的引用,它的.conf扩展被删除,此文件包含用于确定日志中的行是否坏的正规表达式,我们不会在本指南中深入覆盖这个文件,因为它相当复杂,预定义的设置匹配适当的行。

但是,通过查看该目录,可以查看可用的过滤器类型:

  • 
    ls /etc/fail2ban/filter.d
    
    

如果看到与正在使用的服务相关的文件,则应使用文本编辑器打开它,大多数文件都有相当好的注释,你应该能够告诉脚本设计的防范条件类型。大多数过滤器在jail.conf中都有适当的(已禁用)部分,如果需要,我们可以在jail.local中启用。

例如,假设我们正在使用Nginx服务一个网站,并意识到我们网站的密码保护部分正在遭受登录尝试的攻击。我们可以告诉Fail2ban使用nginx-http-auth.conf文件在/var/log/nginx/error.log文件中检查这个条件。

这实际上已经在我们的/etc/fail2ban/jail.conf文件中的一个名为[nginx-http-auth]的部分中设置了,我们只需要为nginx-http-auth jail添加一个enabled参数到jail.local

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

然后重新启动fail2ban服务:

  • 
    sudo systemctl restart fail2ban
    
    

监视Fail2ban日志和防火墙配置

重要的是要知道像Fail2ban这样的服务正在按预期工作。首先使用systemctl检查服务的状态:

  • 
    sudo systemctl status fail2ban
    
    

如果这里出现错误,你可以通过检查上次引导后的fail2ban单元来排除故障:

  • 
    sudo journalctl -b -u fail2ban
    
    

接下来,使用fail2ban-client查询fail2ban-server的整体状态或任何单独的jail :

  • 
    sudo fail2ban-client status
    
    
  • sudo fail2ban-client status jail_name

按照Fail2ban的日志记录最近操作(按Ctrl-C以便退出)的记录:

  • 
    sudo tail -F /var/log/fail2ban.log
    
    

列出为iptables配置的当前规则:

  •  
    sudo iptables -L
    
     

显示启用每个规则所需命令的格式显示iptables规则:

  •  
    sudo iptables -S
    
     

结束语

你现在应该能够为你的服务配置一些基本的禁止策略,Fail2ban非常容易设置,是保护任何使用身份验证的服务的好方式。

Zhongy0410 profile image