前言

fail2ban是一款入侵防御工具,通过监视系统日志,匹配日志的错误信息执行相应的屏蔽动作,因为实现屏蔽操作是通过防火墙来实现的,所以使用 fail2ban 需要开启防火墙。

本文介绍在 CentOS7 上安装 fail2ban 进行安全防护,同时配置 mailx 使用阿里云企业邮箱通过 smtps 发送邮件。当 fail2ban 的监狱启动、停止、对 IP 执行 ban 操作后,都会通过邮件进行通知。

操作环境:
OS:CentOS Linux release 7.7
fail2ban:1.0.1.dev1
mailx:12.5 7/5/10


配置 mailx

首先删除服务器自带的邮件程序:

sudo yum -y remove postfix
sudo yum -y remove sendmail

安装 mailx:

sudo yum install -y mailx

然后配置邮箱,这里使用阿里云企业邮箱,并通过 smtps 发送邮件。
编辑/etc/mail.rc配置文件:

sudo vi /etc/mail.rc

在配置文件最后一行添加如下配置内容

set from=makiny@mtycho.com              #填写自己的邮箱
set smtp=smtps://smtp.mxhichina.com:465 #填写 smtp 发件服务器地址
set smtp-auth-user=makiny@mtycho.com    #填写自己的邮箱
set smtp-auth-password=passwd           #填写邮箱密码或者邮箱授权码
set smpt-auth=login
set ssl-verify=ignore
set nss-config-dir=/root/.certs

为邮箱配置证书,执行以下命令:

sudo mkdir /root/.certs
sudo echo -n | openssl s_client -connect smtp.mxhichina.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/mxhichina.com.crt
sudo certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/mxhichina.com.crt
sudo certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/mxhichina.com.crt
sudo certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i mxhichina.com.crt

出现如下提示说明证书配置完成:

Notice: Trust flag u is set automatically if the private key is present.

最后测试邮件发送:

echo hello word | mailx -v -s "demo title" xxx@163.com #xxx@163.com 填写收件邮箱

正常情况会发送成功,如下图所示:

配置 fail2ban

安装

不建议使用yum install fail2ban安装,推荐使用git安装最新版本。
执行以下命令安装 fail2ban:

git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python setup.py install
sudo cp build/fail2ban.service /usr/lib/systemd/system/fail2ban.service
sudo systemctl daemon-reload
sudo systemctl start fail2ban  #启动fail2ban
sudo systemctl enable fail2ban #开机自启动

ssh 登录防护

创建配置文件jail.local会覆盖默认默认操作,使用自定义监狱。
这里启用jail.local

sudo vi /etc/fail2ban/jail.local

jail.local中添加如下内容:

[DEFAULT]              #缺省配置,监狱未声明的配置都将使用缺省配置
ignoreip = 127.0.0.1/8 #忽略的 IP
bantime  = 86400       #禁止时间 单位 s
findtime = 600         #窗口时间 单位 s
maxretry = 5           #最大尝试次数
banaction = iptables-multiport #firewall 防火墙需设置为 firewallcmd-ipset
action = %(action_mwl)s

[sshd]                #监狱名
enabled = true
filter  = sshd        #日志过滤器,存放在`/etc/fail2ban/filter.d`下,sshd 为默认提供的
port    = 22          #监视的端口号,可以为具体的端口号、https、https 等
action = %(action_mwl)s
logpath = /var/log/secure #日志文件路径

[sshd]监狱动作为:同一 IP 在十分钟内登录 ssh 失败五次就把此 IP ban 24小时。

web 登录防护

以上使用的是 fail2ban 自带的过滤器,还可以根据日志文件自定义过滤器。
Nginx 下的 web 登录日志如下:

192.168.1.1 - - [03/Apr/2020:01:56:05 -0400] "POST /login HTTP/2.0" 303 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/123.45 (KHTML, like Gecko) Chrome/12.3.4567.890 Safari/123.45" "-"

以上日志表明 IP 192.168.1.1 在时间 03/Apr/2020:01:56:05 提交了一次登录申请。
通过正则表达式匹配POST /login HTTP即可匹配到类似的登录日志。
新建过滤器:

sudo vi /etc/fail2ban/filter.d/web.conf

填写如下内容:

[Definition]
failregex =  ^<HOST>.+"POST /login HTTP.+$  #正则表达式,匹配 POST /login HTTP
ignoreregex =

/etc/fail2ban/jail.local中追加如下监狱:

[web]
enabled = true
filter  = web
port    = http,https
action = %(action_mwl)s
logpath = /var/log/nginx/access.log
bantime  = 86400
findtime = 3600
maxretry = 3

[web]监狱动作为:同一 IP 在一小时内登录 web 服务超过三次就把此 IP ban 24 小时,由于正常用户不会在短时间内频繁登录,由此阻止恶意登录,达到防护目的。

配置 fail2ban 邮件发送。

使用 mailx 邮件服务,根据情况进行安装。
编辑 fail2ban 配置文件jail.conf

sudo vi /etc/fail2ban/jail.conf

找到如下配置项并设置为如下配置:

destemail = xxx@163.com    #收件邮箱
sender = makiny@mtycho.com #发件邮箱,需要和 mailx 配置里设置的一样
mta = mail

最后重启 fail2ban:

sudo service fail2ban restart 

重启后,会收到监狱已启动的邮件。
到这里,fail2ban 和邮件通知已经配置完成,fail2ban 使用很灵活,通过分析日志文件可以构造很多实用的日志过滤器。

Last modification:May 12th, 2020 at 12:16 pm