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

介绍

虽然通过SSH连接到服务器可能非常安全,但SSH守护程序本身是一种必须暴露给Internet才能正常运行的服务。这带来了一些固有的风险,并为潜在攻击者提供了一个攻击媒介。

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

名为Fail2ban的服务可以通过创建根据预定义的不成功登录尝试次数自动更改iptables防火墙配置的规则来缓解此问题。这将允许您的服务器在没有您干预的情况下响应非法访问尝试。

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

在CentOS 7上安装Fail2ban

虽然官方CentOS软件包存储库中没有Fail2ban,但它是为EPEL项目打包的。EPEL,代表额外的企业版Linux软件包,可以用发行包安装的可从CentOS的:

sudo yum install epel-release

系统将提示您继续---按y,然后按Enter键

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

再次,在提示继续时按yEnter

安装完成后,使用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]部分,首先执行,也可以包含各个jails的部分。为给定参数设置的最后一个vavalue优先。

让我们从编写一个非常简单的版本jail.local开始。使用nano(或您选择的编辑器)打开一个新文件:

sudo nano /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用于防火墙配置,并启用sshdjail。

退出并保存新文件(在nano,按Ctrl-X退出,按y保存,按Enter确认文件名)。现在我们可以使用systemctl重启fail2ban服务

sudo systemctl restart fail2ban

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

sudo fail2ban-client status
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

所有Jails的默认设置

首先,滚动查看[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套在电子邮件中的“发件人”字段的值。该mta参数配置将用于发送邮件的邮件服务。

action = $(action_)s

此参数配置Fail2ban在要禁止时采取的操作。该值action_在此参数之前不久的文件中定义。默认操作是简单地将防火墙配置为拒绝来自违规主机的流量,直到禁用时间结束。

如果你想配置电子邮件警报,您可以覆盖从该值action_action_mw。如果您希望电子邮件包含相关日志行,则可以将其更改为action_mwl。如果选择使用邮件警报,则需要确保已配置相应的邮件设置。

单个监狱的设置

之后[DEFAULT],我们将遇到为不同服务配置单个jails的部分。这些通常包括port禁止和logpath监视恶意访问尝试。例如,我们已启用的SSH jail 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-authjail 添加一个enabled参数到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非常易于设置,是保护使用身份验证的任何服务的好方法。

更多CentOS教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Protect SSH With Fail2Ban on CentOS 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Bug生活2048

Spring Boot学习笔记(一)环境搭建

http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.h...

11530
来自专栏Albert陈凯

Hadoop离线数据分析平台实战——380MapReduce程序优化Hadoop离线数据分析平台实战——380MapReduce程序优化

Hadoop离线数据分析平台实战——380MapReduce程序优化 项目进度 模块名称 完成情况 用户基本信息分析(MR)� 完成 浏览器信...

34480
来自专栏潘嘉兴的专栏

手把手教你如何优化linux服务器

服务器的优化是我们最小化安装系统后应该做的事情,下面是一些常见的基本的优化服务器的方法。关闭不需要的服务。列出需要启动的的服务crond、network、ssh...

65600
来自专栏林德熙的博客

win10 uwp 无法附加到CoreCLR 查询临时变量:

本文说的是在vs调试无法附加到CoreCLR。拒绝访问。已经如何去解决,可能带有一定的主观性和局限性,说的东西可能不对或者不符合每个人的预期。如果觉得我有讲的不...

8010
来自专栏静下来

解决ssh出现Host key verification failed错误的方法

image.png ssh登陆Linux服务器的时候,如果出现了Host key verification failed的错误,需要清空下本地ip密码记录。 出...

38370
来自专栏python3

习题1:第一个程序

9230
来自专栏机器学习实践二三事

Ipynb文件的打开

RT,ipynb文件用gedit直接打开的话,太多附加信息,此时需要在浏览器端打开 升级ipython 太低版本的ipython是不行的,出现的错误可能是这样的...

27280
来自专栏deepcc

nodejs服务器anywhere简介

41340
来自专栏人工智能

带你构建你的的第一个Python和Django应用程序

群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流 ? 您以前可能听说过Python,特别是如果您...

25750
来自专栏抠抠空间

Node.js基础

31900

扫码关注云+社区

领取腾讯云代金券