在管理 linux 服务器时,提高服务器安全性应该是您的首要任务之一。
通常我们可以通过查看服务器日志,能发现针对暴力登录、网络泛滥、漏洞利用搜索等的不同尝试。
fail2ban是一款开源的入侵预防系统(IPS),您可以检查服务器日志并添加额外的 iptables 规则来阻止有问题的 IP 地址。
Fail2ban部署要求
Fail2ban 是用 python 编写的,唯一的要求是安装 python:
- Fail2ban 分支 0.9.x 需要 Python >=2.6 或 Python >=3.2
- Fail2ban 分支 0.8.x 需要 Python >=2.4
- 对系统的 root 访问权限
- (可选)iptables 或 showewall 和 sendmail
Fail2ban工作原理
Fail2ban的工作原理是监视系统日志文件,并根据预定义的规则识别登录失败的尝试。当检测到可疑活动时,Fail2ban会自动采取措施阻止攻击者,例如:
- 临时或永久阻止攻击者的IP地址
- 延迟攻击者的连接尝试
- 向管理员发送警报
安装 Fail2Ban
fail2ban 的安装相对简单:
在 CentOS/RHEL 上安装 Fail2Ban
首先,更新您的软件包,启用 Epel 存储库并安装 fail2ban,如下所示。
# yum update
# yum install epel-release
# yum install fail2ban
在 Debian/Ubuntu 上安装 Fail2Ban
首先,更新您的软件包并安装 fail2ban,如下所示。
# apt-get update && apt-get upgrade -y
# apt-get install fail2ban
(可选)如果您希望启用邮件支持(用于邮件通知),则可以安装 sendmail。
# yum install sendmail [On CentOS/RHEL]
# apt-get install sendmail-bin sendmail [On Debian/Ubuntu]
要启用 fail2ban 和 sendmail,请使用以下命令:
# systemctl start fail2ban
# systemctl enable fail2ban
# systemctl start sendmail
# systemctl enable sendmail
配置 Fail2ban
默认情况下,fail2ban 使用位于 /etc/fail2ban/ 中的.conf
文件,这些文件首先被读取。但是,这些文件可以被位于同一目录中的.local
文件覆盖。
- loglevel – 这是要记录的详细级别。可能的选项包括:
- CRITICAL - 危急
- ERROR - 错误
- WARNING - 警告
- NOTICE - 通知
- INFO - 信息
- DEBUG - 调试
- logtarget – 将操作记录在特定文件中。默认值为 /var/log/fail2ban.log。但是,您可以将其更改为:
- STDOUT – 输出任何数据
- STDERR – 输出任何错误
- SYSLOG – 基于消息的日志记录
- File – 输出到文件
- socket – 放置套接字文件的目录。
- pidfile – pidfile 的位置。
配置 jail.local
ail2ban 中最重要的文件之一是定义你的jail(小黑屋)。您可以在jail.conf
定义应为其启用 fail2ban 的服务。
正如我们之前提到的,.conf
文件可能会在升级过程中被更改,因此您应该创建一个 jail.local 文件,您可以在其中应用修改。
另一种方法是简单地复制 .conf 文件:
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
如果您使用的是 CentOS 或 Fedora,您需要将 jail.local 中的后端从 “auto” 更改为 “systemd”。
如果您使用的是 Ubuntu/Debian,则无需进行此修改,即使他们也使用 systemd。
默认情况下,jail 文件会为 Debian 和 Ubuntu 启用 SSH,但在 CentOS 上则不启用。如果您想启用它,只需更改 /etc/fail2ban/jail.local 中的以下行:
[sshd]
enabled = true
禁止和重试时间
您可以配置阻止 IP 地址的情况。为此,fail2ban 使用 bantime、findtime 和 maxretry。
- bantime – 这是 IP 地址将保持被禁止状态的秒数(默认为 10 分钟)。
- findtime – 在主机被禁止之前,登录尝试之间的时间量。(默认 10 分钟)。换言之,如果 fail2ban 设置为在 3 次登录尝试失败后阻止 IP 地址,则这 3 次尝试必须在查找时间段(10 分钟)内完成。
- maxretry – 在应用禁令之前进行的尝试次数。(默认值为 3)。
白名单IP地址
当然,您需要将某些 IP 地址列入白名单。要配置此类 IP 地址,请使用您喜欢的文本编辑器打开 /etc/fail2ban/jail.local,并取消注释以下行:
ignoreip = 127.0.0.1/8 ::1
然后,您可以放置要忽略的 IP 地址。IP 地址应与空格或逗号分隔。
电子邮件提醒
如果您希望在事件发生时收到邮件警报,则必须在 /etc/fail2ban/jail.local 中配置以下设置:
- destemail – 邮件地址,您将在其中收到通知。
- Sendername – 接收邮件时将看到的发件人。
- sender – fail2ban 发送电子邮件的电子邮件地址。
默认 mta(邮件传输代理)设置为 sendmail。
为了接收邮件通知,您还需要将“操作”设置从以下位置更改为:
Action = %(action_)s
对其中之一:
action = %(action_mw)s
action = %(action_mwl)s
- %(action_mw)s – 将禁止主机并发送带有 whois 报告的邮件。
- %(action_mwl)s – 将禁止主机,提供 WHOIS 信息和日志文件中的所有相关信息。
其他 Jail 配置
到目前为止,我们已经了解了基本配置选项。如果要配置 jail,则需要在 jail.local 文件中启用它。语法非常简单:
[jail_to_enable]
. . .
enabled = true
您应该将 jail_to_enable 替换为实际的 jail,例如“sshd”。在 jail.local 文件中,将为 ssh 服务预定义以下值:
[sshd]
port = ssh
logpath = %(sshd_log)s
您可以启用筛选器,这将有助于识别日志中的某一行是否为失败的行。filter 值实际上是对服务名称后跟 .conf 的文件的引用。例如:/etc/fail2ban/filter.d/sshd.conf。
语法为:
filter = service
例如:
filter = sshd
您可以在以下目录中查看现有筛选器:/etc/fail2ban/filter.d/。
使用 fail2ban-client
Fail2ban 附带一个客户端,可用于查看和更改当前配置。由于它提供了许多选项,因此您可以通过以下方式阅读其手册:
# man fail2ban-client
在这里,您将看到一些可以使用的基本命令。要查看 fail2ban 或特定 jail 的当前状态,您可以使用:
# fail2ban-client status
结果将如下所示:
检查 Fail2ban 状态
对于单个监狱,您可以运行:
# fail2ban-client status sshd
在下面的屏幕截图中,您将看到我故意使多次登录失败,因此 fail2ban 可以阻止我尝试连接的 IP 地址:
检查 Fail2ban SSH 状态
配置SSH服务
默认情况下,Fail2ban会自动配置一些常见服务的规则,包括SSH。但是,你可以根据需要自定义这些规则。要配置SSH服务的Fail2ban规则,编辑/etc/fail2ban/jail.conf
文件。找到如下部分:
$tail /etc/fail2ban/jail.conf
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
port = 22
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 8h
配置Nginx服务
要配置Nginx服务的Fail2ban规则,在/etc/fail2ban/jail.conf
文件中添加以下内容:
[Definition]
name = nginx-http
filter = /var/log/nginx/access.log
action = iptables-multiport
bantime = 8h
可以修改以下参数:
name
: 规则名称,建议设置为nginx-http
filter
: 指定要监视的日志文件,默认值为/var/log/nginx/access.log
action
: 指定当检测到可疑活动时要采取的措施,默认值为iptables-multiport
,表示将攻击者的IP地址添加到iptables防火墙的黑名单中
重启Fail2ban服务
在完成配置后,重启Fail2ban服务以使更改生效:
sudo systemctl restart fail2ban
测试Fail2ban
检查fail2ban的运行状态: