使用Fail2ban保护服务器

・19 分钟阅读

使用Fail2ban保护服务器

Fail2ban主要关注SSH攻击,它可以进一步配置为适用于使用日志文件的任何服务,尽管可能有所妥协,
注释
本指南所需的步骤需要root特权,请确保以root或sudo前缀运行以下步骤,有关特权的详细信息,请参阅我们的用户和组指南,
小心
Fail2ban应该与已经经过硬化的服务器一起使用,不应该用作安全防火墙规则的替代,

安装Fail2Ban

你可能还希望在开始之前检查保护你的服务器指南。

CentOS 7

  1. 确保你的系统是最新的,并安装EPEL存储库:

    
    yum update && yum install epel-release
    
    
  2. 安装Fail2Ban :

    
    yum install fail2ban
    
    
  3. 如果你另外想要电子邮件支持,请安装Sendmail ,使用Fail2Ban不是必须要有Sendmail:

    
    yum install sendmail
    
    
  4. 启动并启用Fail2ban,如果需要,请启用Sendmail :

    
    systemctl start fail2ban
    systemctl enable fail2ban
    systemctl start sendmail
    systemctl enable sendmail
    
    
    注释

    如果遇到"没有目录/var/run/fail2ban包含套接字文件/var/run/fail2ban/fail2ban.sock "的错误,请手动创建目录:

    
    mkdir /var/run/fail2ban
    
    

Debian

  1. 确保你的系统是最新的:

    
    apt-get update && apt-get upgrade -y
    
    
  2. 安装Fail2Ban :

    
    apt-get install fail2ban
    
    

    服务将自动启动。

  3. (可选)如果你想要电子邮件支持,请安装Sendmail :

    
    apt-get install sendmail-bin sendmail
    
    
    注释

    当前的Debian Jessie 的Sendmail版本有一个上游bug,这会导致安装sendmail-bin时出现下列错误,安装将挂起一分钟,然后完成。

    
    Creating /etc/mail/sendmail.cf...
    ERROR: FEATURE() should be before MAILER() MAILER('local') must appear after FEATURE('always_add_domain')
    ERROR: FEATURE() should be before MAILER() MAILER('local') must appear after FEATURE('allmasquerade')
    
    

Fedora

  1. 更新你的系统:

     
    dnf update
    
     
  2. 安装Fail2Ban :

    
    dnf install fail2ban
    
    
  3. (可选)如果你想要电子邮件支持,请安装Sendmail :

    
    dnf install sendmail
    
    
  4. 启动并启用Fail2ban,如果需要,请启用Sendmail :

    
    systemctl start fail2ban
    systemctl enable fail2ban
    systemctl start sendmail
    systemctl enable sendmail
    
    

UBUNTU

  1. 确保你的系统是最新的:

    
    apt-get update && apt-get upgrade -y
    
    
  2. 安装Fail2Ban :

    
    apt-get install fail2ban
    
    

    服务将自动启动。

  3. (可选)如果你想要电子邮件支持,请安装Sendmail :

    
    apt-get install sendmail
    
    
  4. 允许通过UFW访问SSH,然后启用防火墙:

    
    ufw allow ssh
    ufw enable
    
    

配置Fail2Ban

Fail2ban首先读取.conf配置文件,然后.local文件会覆盖任何设置,因此,对配置所做的所有更改都通常在.local文件中完成,要保留了.conf文件不动。

配置fail2ban.local

  1. fail2ban.conf包含默认配置文件,默认设置将给你一个合理的工作设置,如果要进行任何更改,最好在单独的文件fail2ban.local中执行它,该文件重写fail2ban.conf ,将副本fail2ban.conf重命名为fail2ban.local

    
    cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
    
    
  2. 在这里,你可以选择编辑fail2ban.local中的定义以匹配你所期望的配置,可以更改的值是:

    • loglevel :Fail2ban提供程序日志可设置为1(error),2(warn),3(info)或4(debug)的详细信息级别,
    • logtarget :将操作记录到特定文件中,/var/log/fail2ban.log的默认值将所有日志记录放入已定义的文件中,或者,你可以将该值更改为:
      • STDOUT :输出任何数据
      • STDERR :输出任何错误
      • SYSLOG :基于消息的日志记录
      • FILE :输出到文件
    • socket :套接字文件的位置,
    • pidfile :PID文件的位置,

配置jail.local设置

  1. 默认情况下,jail.conf文件将为Debian和Ubuntu自动启用Fail2ban的,但是,不支持CentOS ,所有其他协议和配置(HTTP,FTP,等等)都被注释掉了,如果要更改此选项,请创建一个用于编辑的jail.local

    
    cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
    
  2. 如果使用CentOS或Fedora,你将需要将jail.local中的backend选项从auto改为systemd ,在Debian 8或Ubuntu 16.04上这不是必须的,即使两者都使用了systemd 。

    /etc/fail2ban/jail.local
    
    1
    2
    3
    4
    5
    6
    7
    
    
    
    # "backend" specifies the backend used to get files modification.
    # Available options are "pyinotify", "gamin", "polling", "systemd" and "auto".
    # This option can be overridden in each jail as well.
    
    . . .
    
    backend = systemd
    

    缺省情况下,在CentOS 7.中没有启用jail,例如,要启用SSH守护进程,请取消注释jail.local中的以下行:

    /etc/fail2ban/jail.local
    
    1
    2
    
    
    
    [sshd]
    enabled = true
    

白名单IP

若要忽略特定的IP,请将它们添加到ignoreip行,默认情况下,此命令不会禁止本地主机,如果通常使用单个IP地址,则可能有利于将它添加到忽略列表中:

/etc/fail2ban/jail.local

1
2
3
4
5
6


[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1/8 123.45.67.89

如果你希望仅针对某些jail启用IP,则可以使用fail2ban-client命令完成这个操作,将JAIL替换为你的监狱名称,并且123.45.67.89与你想要白名单的IP一起使用。


fail2ban-client set JAIL addignoreip 123.45.67.89

禁止时间和重试总数

设置bantimefindtimemaxretry以定义禁止的情况和时间长度:

/etc/fail2ban/jail.local

1
2
3
4
5
6
7


# "bantime" is the number of seconds that a host is banned.
bantime = 600

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600
maxretry = 3
  • bantime :屏蔽IP的时间长度(以秒为单位),如果设置为负数,则屏蔽为永久性,600的默认值设置为持续禁止IP10分钟时间 。

  • findtime :设置屏蔽之前登录尝试之间的时间长度,比如,如果将Fail2ban设置为在五次(5)失败后禁用一个IP,则将禁用一个IP ,这5次尝试必须在设置10分钟findtime限制内发生,findtime值应该是一组秒数。

  • maxretry :在强制执行屏蔽之前,可以尝试从单个IP访问服务器的次数。 默认值设置为3.

电子邮件提示

要在fail2ban触发时接收电子邮件,请调整电子邮件设置:

  • destemail :你希望接收电子邮件的电子邮件地址。

  • sendername :电子邮件显示的名称。

  • sender :Fail2ban将发送电子邮件的电子邮件地址。

注释
如果不确定如何放置sender,请运行sendmail -t user@email.com命令,用你的电子邮件地址替换user@email.com ,检查电子邮件(如果需要,包括垃圾邮件文件夹),并且查看发件人电子邮件,此地址可用于上述配置,

你还需要调整action设置,它定义了在屏蔽阈值时发生的操作,默认情况下,%(action_)s只禁止用户,%(action_mw)s将禁止使用WhoIs报告发送电子邮件; 当%(action_mwl)s将禁止使用WhoIs报告和日志文件中的所有相关行发送电子邮件,这也可以在监狱特定的基础上进行更改。

其他监狱配置

除了上述基本设置地址之外,jail.local还包含许多常见服务(包括SSH )的各种监狱配置,默认情况下,仅启用SSH 。

平均监狱配置如下所示:

/etc/fail2ban/jail.local

1
2
3
4
5
6
7


[ssh]

enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
  • enabled :确定过滤器是否已打开,
  • port :端口Fail2ban应该对服务进行引用,如果使用默认端口,则可以在这里放置服务名称,如果使用非传统端口,则应该是端口号,例如,如果将SSH端口移动到3456,则将用3456替换ssh
  • filter/etc/fail2ban/filter.d中文件的名称,它包含用于正确解析日志文件的failregex信息,不需要包含.conf后缀,
  • logpath :给出服务日志的位置,
  • maxretry :将覆盖已定义服务的全局maxretry ,还可以添加findtimebantime
  • action :如果默认操作不适用于jail,则可以添加为附加设置,可以在action.d文件夹中找到其他操作,
注释
jail也可以配置为放置在jail.d目录中的单个.conf文件,格式将保持不变,

Failregexs

尽管Fail2ban带有许多过滤器,但是,你可能需要进一步定制这些过滤器或创建自己的过滤器以满足你的需求,Fail2ban使用正则表达式(regex)来解析日志文件,查找尝试入侵和密码失败的实例。Fail2ban使用python扩展的正规表达式。

理解failregex如何工作的最好方法是编写一个,虽然我们不建议Fail2ban在大型网站上监视Wordpress的access.log,但是,它提供了一个易于理解的日志文件的实例。

为Fail2ban编写正规表达式

  1. 导航到网站的access.log (通常位于 /var/www/example.com/logs/access.log )查找失败的登录尝试,它将类似于:

    /var/www/example. com/logs/access.log
     
    1
    
    
    123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] "POST /wp-login.php HTTP/1.1" 200 1906 "http://example.com/wp-login.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0"

    请注意,你只需要跟踪200

    /var/www/example. com/logs/access.log
     
    1
    
    
    123.45.67.89 - - [01/Oct/2015:12:46:34 -0400] "POST /wp-login.php HTTP/1.1" 200
  2. 失败尝试产生的IP地址总是被定义为,后面几个字符是不变的,可以作为文字输入:

    
     - - [
    
    

    前面的[表示正方括号的读取方式。

  3. 下一节,登录尝试的日期,可以使用正规表达式表达式以分组表达式的形式写入,在本示例中,第一个部分01可以写成(d{2}) : 括号将表达式分组,而且d查找任何数字数字,{2}注意到表达式在一行,换句话说,月的日期中查找两位数字。

    到目前为止,你应该拥有:

    
     - - [(d{2})
    
    

    然后将以正向斜杠调用下面的斜杠,后面跟着w{3},查找一系列3 alpha数字字符(即,A-Z, a-z,0-9,任何大小写),以下正斜杠也应该是文字:

    
     - - [(d{2})/w{3}/
    
    

    年份的部分应该类似于日,但是,不需要捕获组,并且对四个连续字符(还有一个冒号):

    
     - - [(d{2})/w{3}/d{4}:
    
    
  4. 下一个序列是组成时间的两个数字序列,因为我们将月份的日期定义为捕获组(括号)中的两个数字,所以可以使用1 (因为它是第一个捕获组)对它进行反向引用,同样,冒号将是文字:

    
     - - [(d{2})/w{3}/d{4}:1:1:1
    
    

    如果你不希望使用引用,也可以将它编写为:

    
     - - [d{2}/w{3}/d{4}:d{2}:d{2}:d{2}
    
    
  5. 应该以类似于年份的方式编写-0400段,并使用附加的文本--d{4}最后,可以关闭方括号(先用反斜杠转义),并用文字字符串完成其余部分:

    
     - - [(d{2})/w{3}/d{4}:1:1:1 -d{4}] "POST /wp-login.php HTTP/1.1" 200
    
    

    或者:

    
     - - [d{2}/w{3}/d{4}:d{2}:d{2}:d{2} -d{4}] "POST /wp-login.php HTTP/1.1" 200
    
    

应用Failregex

创建failregex之后,需要将它添加到过滤器中。

  1. 导航到Fail2ban目录的filter.d

    
    cd /etc/fail2ban/filter.d
    
    
  2. 创建一个名为wordpress.conf的文件,并添加你的failregex :

    /etc/fail2ban/filter.d/wordpress.conf
    
    1
    2
    3
    4
    5
    6
    7
    8
    
    
    
    # Fail2Ban filter for WordPress
    #
    #
    
    [Definition]
    
    failregex =  - - [(d{2})/w{3}/d{4}:1:1:1 -d{4}] "POST /wp-login.php HTTP/1.1" 200
    ignoreregex =
    

    保存并退出。

  3. 将WordPress部分添加到jail.local

    /etc/fail2ban/jail.local
    
    1
    2
    3
    4
    5
    
    
    
    [wordpress]
    enabled = true
    filter = wordpress
    logpath = /var/www/html/andromeda/logs/access.log
    port = 80,443
    

    这将使用默认的禁止和电子邮件操作,其他操作可以通过添加action =行来定义。

    保存并退出,然后重新启动Fail2ban 。

使用Fail2ban客户端

Fail2ban提供一个命令fail2ban-client,可用于从以下位置运行Fail2ban :


fail2ban-client COMMAND

  • start :启动Fail2ban服务器和jail ,
  • reload :重新加载Fail2ban文件的配置,
  • reload JAIL :用Fail2ban jail的名字替换JAIL ; 这将重新载入监狱,
  • stop :终止服务器,
  • status :将显示服务器的状态,并启用jail ,
  • status JAIL :将显示监狱的状态,包括任何当前被禁止的IPs ,

例如,要检查Fail2Ban是否正在运行以及SSHd jail是否已启用,请运行:


fail2ban-client status

输出应该是:


Status
|- Number of jail: 1
`- Jail list: sshd

有关fail2ban-client命令的其他信息,请参见Fail2ban wiki

Zhongy0410 profile image