玩命狂奔的间隙,莫忘记抬头看看前路的星光

0%

使用Fail2ban防止暴力破解sshd/ftp/mongodb等

必要资料

  1. 官方代码库 https://github.com/fail2ban/fail2ban
  2. 过滤规则文档 https://fail2ban.readthedocs.io/en/latest/filters.html#filter-test-cases
    以为这些就够了吗?不够的,还有一些要注意的地方花了我较多的时间。

    安装

快速安装

由于在Ubuntu和CentOS的源里本身就带了这个软件的库,所以我们只要简单调用对应系统的安装命令就可以了。在ubuntu里安装的版本是0.97

  1. CentOS

    1
    sudo yum install fail2ban
  2. Ubuntu

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sudo apt-get install fail2ban
    ````

    ### 手动安装较新的稳定版
    1. 由于源里的版本太低,不支持mongodb,是几年前的版本,因此如果有mongodb要保护,去他的github上下载较新的版本,这里选择0.10.6
    (具体选择哪种方式,可以根据源的版本来决定)


    手动安装非常简单,不需要编译,因为使用python写的。

    ````shell
    wget https://github.com/fail2ban/fail2ban/archive/0.10.6.zip
    unzip fail2ban-0.10.6.zip
    cd fail2ban-0.10.6
    sudo python setup.py install
    1. 手动安装的需要自己增加服务
      在解压好的文件夹 fail2ban-0.10.6,执行下面命令。
    1
    2
    3
    sudo cp files/debian-initd /etc/init.d/fail2ban 
    sudo update-rc.d fail2ban defaults
    sudo service fail2ban start #或sudo systemctl start fail2ban
    1. 开机后自动启动
    1
    sudo systemctl enable fail2ban
    1. 检查设置自动启动是否成功
    1
    sudo systemctl is-enabled fail2ban #查询是否已设置为自启动
    1. 删除老的fail2ban数据库
      如果是曾经安装过,现在安装的是不同的版本,需要检查对应版本的changelog,看是否需要对已经持久化的fail2ban数据库进行删除或更新。因为版本不同,数据库格式可能不同。

配置

配置文件在/etc/fail2ban里,主要编辑jail.conf文件就可以了。(具体哪个文件,可能不同系统后缀名不同,请自行辨别)

也可以把所有自定义的配置写在自己新建的jail.local文件里(推荐)

解释下几个关键要设置的地方

  1. 不会被禁止的IP列表

    1
    ignoreip = 127.0.0.1/8  #这个是默认值

    这里在测试Fail2ban生效之前,可以再加上云服务(如果是云服务器)内网地址,方便你如果本机被禁止访问,可以通过另外一台服务器或内网登录目标服务器,对自己解除屏蔽。
    这是腾讯云的地址

    1
    ignoreip = 127.0.0.1  192.168.0.0/24  #这里屏蔽了敏感内网地址,请根据自己需要配置。
  1. 客户端主机被禁止的时长(秒)

    1
    bantime = 600 默认是10分钟,建议改大一点。
  2. ssh服务的最大尝试次数 超过这个次数的就会被拒绝掉。

    1
    maxretry = 5 #默认是5 请自行设置

自定义配置

  1. 在/etc/fail2ban添加配置文件:jail.local,在这里可以做自己需要的修改。

开启vsftpd的jail

编辑/etc/failban/jail.local
注意了!!如果自定义了端口号,一定要把自定义的几个端口号全部加上,不然可能挡不住。
这个问题困扰了我2天,因为觉得只要把认证的端口屏蔽就可以了,其实这样不行。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 [vsftpd]
enabled = true
port = 30010,30012,30013
logpath = /var/log/vsftpd.log
````
上面的端口号是举例,请务必根据自己实际情况填写

### mongodb数据库jail配置
默认的filter.d/mongodb-auth.conf中的failregex正则可能对高版本的mongodb无效,需要更新这个正则才可以正常运行。
可以在jail.local中覆盖编写

````sh
[mongodb-auth]
# reset filter:
filter =
# own failregex:
failregex = ^\s*\S+\s+ACCESS\s+\[conn\d+\]\s+SASL\s+\S+\s+authentication failed for \S+ on \S+ from client <ADDR>
enabled = true

这个问题困扰了我一天, 最后fail2ban的贡献者给了我正确的正则,详细见:https://github.com/fail2ban/fail2ban/issues/2884#issuecomment-736571316

完整的jail.local

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.0.1/8
bantime = 1d
maxretry = 3
destemail = 你接收的邮箱
sender = 发送的邮箱
mta = mail
action = %(action_mwl)s

[sshd]
enabled = true

[vsftpd]
enabled = true
port = 10060,10061,10062
logpath = /var/log/vsftpd.log

[mongodb-auth]
enabled = true
port = 27017
logpath = /var/log/mongodb/mongod.log
failregex = ^\s*\S+\s+ACCESS\s+\[conn\d+\]\s+SASL\s+\S+\s+authentication failed for \S+ on \S+ from client <ADDR>

上面的端口需要改成实际服务器上的。

针对CentOS特别的sshd配置:

因为最近有一台CentOS的系统需要装fail2ban,则在实际操作过程中,发现ssh防护不起作用。研究发现需要按照下面的写法才可以,centos 没有默认把登录日志写在/var/log/auth.log 而是写在/var/log/secure
另外,不知道为啥,全局的action不管用,所以只好加入自定义的banction。
能够正常使用的代码如下 (port 端口根据自己的自定义)

1
2
3
4
5
6
[sshd]
filter = sshd
enabled = true
logpath = /var/log/secure
port = 1234
banaction = iptables[name=ssh, port=ssh, protocol=tcp]

要移除某个ip,要根据上面设定的banaction的名字来写。
上面例子写的name=ssh,移除时要移除的类型就是 f2b-ssh

1
sudo iptables -D f2b-ssh -s 223.166.112.66 -j  REJECT

重新启动服务,使配置生效

1
2
sudo systemctl restart fail2ban
sudo fail2ban-client reload

禁止或允许某个IP访问服务器某个端口

  1. 禁止访问某端口

    1
    sudo iptables -I INPUT -p tcp --dport 30032 -s 180.173.18.28 -j DROP
  2. 允许访问某端口

    1
    sudo iptables -I INPUT -p tcp --dport 30032 -s 180.173.18.28 -j ACCEPT
  3. 删除增加的IP

    1
    sudo iptables -D INPUT -s 180.173.18.28 -p tcp -j DROP --dport 10062

将被禁止IP从屏蔽IP列表中移除

被禁止的IP地址存放在iptables里。

  1. 查看被禁止IP列表

    1
    sudo iptables --list -n

    列表如下:

    1
    2
    3
    4
    5
    6
    Chain f2b-sshd (1 references)
    target prot opt source destination
    REJECT all -- 141.98.9.31 0.0.0.0/0 reject-with icmp-port-unreachable
    REJECT all -- 141.98.9.36 0.0.0.0/0 reject-with icmp-port-unreachable
    REJECT all -- 141.98.9.35 0.0.0.0/0 reject-with icmp-port-unreachable
    REJECT all -- 141.98.9.34 0.0.0.0/0 reject-with icmp-port-unreachable

    1.从列表中删除要被移除的IP

命令说明:

1
sudo iptables -D [填Chain的名字] -s [IP地址] -j [填target的参数]

举例:

1
sudo iptables -D f2b-sshd -s 114.92.35.21 -j REJECT #这里几个参数都是要从上面的列表中查到,不是只改IP就可以。

1.另外一种移除IP的方法(请使用这个方法)

1
sudo fail2ban-client set sshd unbanip 116.232.143.41

发送警报邮件

安装mailx邮件发送程序

  1. 安装

    1
    sudo apt-get install bsd-mailx

    安装完毕后,会出现一个粉红色的界面,然后根据提示,选择Internet SMTP发送邮件。

  2. 配置发送邮件的账户
    编辑/etc/mail.rc

    1
    sudo vim mail.rc

    根据选用的邮箱服务进行设置,基本如下:

    1
    2
    3
    4
    5
    set from=发邮件的邮箱地址
    set smtp=smtps://smtp.exmail.qq.com:465
    set smtp-auth-user=发邮件的邮箱地址(同上)
    set smtp-auth-password=发邮件的邮箱密码
    set smtp-auth=login
  1. 测试

    1
    cat /opt/tesh |mailx -v -s '来自你的服务器' '你能接收邮箱的地址'

    登录你接收邮箱,点击收邮件,如果在收件箱或垃圾箱找到,就证明配置成功了。

  2. 发送邮件

    1
    mailx  -s '邮件标题' '接收的邮箱地址'

    然后按ctrl+D发送,如果你不动,是不会发送的。不要以为是程序出错了哦!

发送邮件到QQ企业邮箱

  1. 可能是因为dsb-mailx版本问题,无法使用TSL功能,发送邮件都不成功。
    所以以下配置在dsb-mailx的 8.1.2-0.20160123cvs-2版本没有达成效果。最后采用的方法是:
    邮件发送到普通的QQ邮箱,然后在QQ邮箱里设置转发规则,将邮件发送到指定企业邮箱。

    如果发送到的邮箱是qq邮箱,那么大概率就成功了。可是发到QQ企业邮箱的话,绝对会失败。
    所以需要额外的设置

  2. 一些参考文章
    https://blog.csdn.net/Aibiabcheng/article/details/109202831

  3. 在QQ企业邮箱,绑定微信安全登录,生成授权码。
    在/etc/mail.rc里使用授权码,而不是邮箱密码。

  4. 安装腾讯的邮箱证书(网易等其他邮箱都是一样,只是smtp地址不同)
    服务端需要安装libnss3-tools来完成证书的生成

    • 安装必要的程序
    1
    sudo apt install libnss3-tools  #下面生成证书要使用 certutil包含在这个包里。
    • 生成证书
    1
    2
    3
    4
    5
    echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt  
    certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    certutil -L -d ~/.certs
    certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt #认证

    会在~/.certs下发现生成了几个文件

  5. 更新/etc/mail.rc文件,加入证书路径好

    1
    2
    3
    4
    5
    6
    7
    set from=发邮件的邮箱地址
    set smtp=smtps://smtp.exmail.qq.com:465
    set smtp-auth-user=发邮件的邮箱地址(同上)
    set smtp-auth-password=发邮件的邮箱的授权码(不是密码哦)
    set smtp-auth=login
    set ssl-verify=ignore
    set nss-config-dir=/home/ubuntu/.certs

配置Fail2ban警报发送邮箱

  1. 修改jail.conf配置文件
    我们使用mail来发送邮件,所有要修改mta = mail

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	# Some options used for actions
    # Destination email address used solely for the interpolations in
    # jail.{conf,local,d/*} configuration files.
    destemail = username@email.com #请改成自己的

    # Sender email address used solely for some actions
    sender = username@email.com #请改成自己的

    # E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
    # mailing. Change mta configuration parameter to mail if you want to
    # revert to conventional 'mail'.
    mta = mail #这里默认为sendmail,我们修改为mail,不使用sendmail。