Fail2Ban на Ubuntu server


   Для предотвращения атак на сервер, который непосредственно работает в сети Интернет, есть очень замечательный сервис - Fail2Ban.
Fail2Ban - простой локальный сервис, который анализирует логи на предмет попытки подобрать пароли к ssh, ftp, http-сервисам. Если такие попытки найдены, fail2ban блокирует ip-адрес источника. Сервис очень гибко настраивается - возможна блокировка через iptables или /etc/hosts.allow (deny), способен оповещать по email, писать лог, сбрасывать блокировку через заданное время и прочее.
Устанавливаем fail2ban:
aptitude install fail2ban

Изоляторы (jails)

Несмотря на то, что файл fail2ban.conf определяет основную конфигурацию всей подсистемы, всё-таки наиболее важным для функционирования, пожалуй, следует считать файл jail.conf, который содержит описания так называемых "изоляторов" (jails).
Текущую конфигурацию каждого изолятора описывает набор следующих параметров:

  • ignoreip - список IP-адресов, которые не должны быть заблокированы, причём можно задавать диапазон адресов с помощью маски подсети или список IP-адресов, отделённых друг от друга пробелом.
  • bantime - продолжительность интервала блокирования (в секундах) для IP-адреса.
  • findtime - длительность интервала обнаружения "подозрительных совпадений" (в журналах). Если за этот интервал времени ничего подозрительного не обнаружено, то счётчику (counter) присваивается значение 0.
  • maxretry - количество "подозрительных совпадений" (т.е., значение счётчика counter), при котором срабатывает определённая операция по отношению к отслеживаемому IP-адресу.
  • action - операция, которая должна быть выполнена, если значение счётчика стало равным значению параметра maxretry. По умолчанию сервис (порт) блокируется для отслеживаемого IP-адреса.
  • port - наименование сервиса или номер соответствующего этому сервису порта, за которым ведётся наблюдение.
  • filter - имя фильтра, который должен использовать данный изолятор, чтобы выявлять "подозрительные совпадения" в журналах (фильтры хранятся в подкаталоге /etc/fail2ban/filter.d).
  • logpath - путь к файлу журнала, который должен обрабатываться с помощью заданного фильтра.

    Содержимое файла jail.conf разделяется на секции, соответствующие различным сервисам. Самая первая секция называется [DEFAULT] и предназначается для определения общих параметров, значения которых имеют силу во всех последующих секциях данного файла. Один из вариантов содержимого конфига:

    [DEFAULT]

    ignoreip = 127.0.0.1
    bantime = 3600
    maxretry = 3
    backend = polling
    destemail = admin@admin.ru
    banaction = iptables-multiport
    protocol = tcp
    action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
    # ban & send an e-mail with whois report to the destemail.
    action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
    %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]

    # ban & send an e-mail with whois report and relevant log lines
    # to the destemail.
    action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
    %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]

    # Choose default action. To change, just override value of 'action' with the
    # interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local
    # globally (section [DEFAULT]) or per specific section
    action = %(action_)s

    #
    # JAILS
    #

    # Next jails corresponds to the standard configuration in Fail2ban 0.6 which
    # was shipped in Debian. Enable any defined here jail by including
    #
    # [SECTION_NAME]
    # enabled = true

    #
    # in /etc/fail2ban/jail.local.
    #
    # Optionally you may override any other parameter (e.g. banaction,
    # action, port, logpath, etc) in that section within jail.local

    [ssh]

    enabled = true
    port = ssh
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 6

    # Generic filter for pam. Has to be used with action which bans all ports
    # such as iptables-allports, shorewall
    [pam-generic]

    enabled = false
    # pam-generic filter can be customized to monitor specific subset of 'tty's
    filter = pam-generic
    # port actually must be irrelevant but lets leave it all for some possible uses
    port = all
    banaction = iptables-allports
    port = anyport
    logpath = /var/log/auth.log
    maxretry = 6

    [xinetd-fail]

    enabled = false
    filter = xinetd-fail
    port = all
    banaction = iptables-multiport-log
    logpath = /var/log/daemon.log
    maxretry = 2

    [ssh-ddos]

    enabled = true
    port = ssh
    filter = sshd-ddos
    logpath = /var/log/auth.log
    maxretry = 6

    #
    # HTTP servers
    #

    [apache]

    enabled = true
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache*/*error.log
    maxretry = 5

    # default action is now multiport, so apache-multiport jail was left
    # for compatibility with previous (<0.7.6-2) releases
    [apache-multiport]

    enabled = false
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache*/*error.log
    maxretry = 6

    [apache-noscript]

    enabled = true
    port = http,https
    filter = apache-noscript
    logpath = /var/log/apache*/*error.log
    maxretry = 6

    [apache-overflows]

    enabled = true
    port = http,https
    filter = apache-overflows
    logpath = /var/log/apache*/*error.log
    maxretry = 2

    #
    # FTP servers
    #

    [vsftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = vsftpd
    logpath = /var/log/vsftpd.log
    # or overwrite it in jails.local to be
    # logpath = /var/log/auth.log
    # if you want to rely on PAM failed login attempts
    # vsftpd's failregex should match both of those formats
    maxretry = 6

    [proftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = proftpd
    logpath = /var/log/proftpd/proftpd.log
    maxretry = 6

    [wuftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = wuftpd
    logpath = /var/log/auth.log
    maxretry = 6

    [pure-ftpd]

    enabled = false
    port = ftp
    filter = pure-ftpd
    logpath = /var/log/syslog
    maxretry = 6

    #
    # Mail servers
    #

    [postfix]

    enabled = true
    port = smtp,ssmtp
    filter = postfix
    logpath = /var/log/mail.log
    maxretry = 5

    [couriersmtp]

    enabled = true
    port = smtp,ssmtp
    filter = couriersmtp
    logpath = /var/log/mail.log
    maxretry = 5
    [courierpop3]

    enabled = true
    port = pop3
    filter = courierpop3
    logpath = /var/log/mail.log
    maxretry = 5

    [courierpop3s]

    enabled = true
    port = pop3s
    filter = courierpop3s
    logpath = /var/log/mail.log
    maxretry = 5

    [courierimap]

    enabled = true
    port = imap2
    filter = courierimap
    logpath = /var/log/mail.log
    maxretry = 5

    [courierimaps]

    enabled = true
    port = imaps
    filter = courierimaps
    logpath = /var/log/mail.log
    maxretry = 5

    [sendmail]

    enabled = true
    port = smtp,ssmtp
    filter = sendmail
    logpath = /var/log/mail.log
    bantime = 28800
    action = %(action_mwl)s
    maxretry = 0

    #
    # Mail servers authenticators: might be used for smtp,ftp,imap servers, so
    # all relevant ports get banned
    #

    [courierauth]

    enabled = true
    port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
    filter = courierlogin
    logpath = /var/log/mail.log

    [sasl]

    enabled = true
    port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
    filter = sasl
    logpath = /var/log/mail.log
    maxretry = 5

    # DNS Servers

    # These jails block attacks against named (bind9). By default, logging is off
    # with bind9 installation. You will need something like this:
    #
    # logging {
    # channel security_file {
    # file "/var/log/named/security.log" versions 3 size 30m;
    # severity dynamic;
    # print-time yes;
    # };
    # category security {
    # security_file;
    # };
    # };
    #
    # in your named.conf to provide proper logging

    # Word of Caution:
    # Given filter can lead to DoS attack against your DNS server
    # since there is no way to assure that UDP packets come from the
    # real source IP
    [named-refused-udp]

    enabled = false
    port = domain,953
    protocol = udp
    filter = named-refused
    logpath = /var/log/named/security.log

    [named-refused-tcp]

    enabled = false
    port = domain,953
    protocol = tcp
    filter = named-refused
    logpath = /var/log/named/security.log

    Перезапускаем:

    sudo /etc/init.d/fail2ban restart

    Проверяем логи fail2ban, они находятся в /var/log/fail2ban.log.
    Если Вы используете правила iptables для fail2ban, в логах будут ошибки:


    2013-02-06 12:36:18,402 fail2ban.jail : INFO Jail 'ssh-ddos' started
    2013-02-06 12:36:18,410 fail2ban.jail : INFO Jail 'ssh' started
    2013-02-06 12:51:41,522 fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports ssh -j fail2ban-ssh-ddos
    iptables -F fail2ban-ssh-ddos
    iptables -X fail2ban-ssh-ddos returned 100
    2013-02-06 12:51:41,523 fail2ban.jail : INFO Jail 'ssh-ddos' stopped
    2013-02-06 12:51:42,450 fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports ssh -j fail2ban-ssh
    iptables -F fail2ban-ssh
    iptables -X fail2ban-ssh returned 100

    Фиксим эти ошибки.
    Открываем /usr/bin/fail2ban-client. Находим:

    beautifier.setInputCmd(c)

    и выше добавляем строку:

    time.sleep(0.1)

    Должно выглядеть примерно так:

    def __processCmd(self, cmd, showRet = True):
    beautifier = Beautifier()
    for c in cmd:
    time.sleep(0.1)
    beautifier.setInputCmd(c)

    После рестарт fail2ban:

    /etc/init.d/fail2ban restart

    Просматриваем логи, в них все нормально:

    2013-02-06 13:10:14,037 fail2ban.filter : INFO Set maxRetry = 5
    2013-02-06 13:10:14,439 fail2ban.filter : INFO Set findtime = 600
    2013-02-06 13:10:14,539 fail2ban.actions: INFO Set banTime = 3600
    2013-02-06 13:10:15,646 fail2ban.jail : INFO Jail 'pure-ftpd' started
    2013-02-06 13:10:15,747 fail2ban.jail : INFO Jail 'courierpop3' started
    2013-02-06 13:10:15,848 fail2ban.jail : INFO Jail 'courierimaps' started
    2013-02-06 13:10:15,950 fail2ban.jail : INFO Jail 'courierauth' started
    2013-02-06 13:10:16,051 fail2ban.jail : INFO Jail 'apache' started
    2013-02-06 13:10:16,152 fail2ban.jail : INFO Jail 'courierpop3s' started
    2013-02-06 13:10:16,254 fail2ban.jail : INFO Jail 'couriersmtp' started
    2013-02-06 13:10:16,355 fail2ban.jail : INFO Jail 'named-refused-tcp' started
    2013-02-06 13:10:16,457 fail2ban.jail : INFO Jail 'apache-noscript' started
    2013-02-06 13:10:16,558 fail2ban.jail : INFO Jail 'sendmail' started
    2013-02-06 13:10:16,659 fail2ban.jail : INFO Jail 'ssh' started
    2013-02-06 13:10:16,760 fail2ban.jail : INFO Jail 'apache-overflows' started
    2013-02-06 13:10:16,862 fail2ban.jail : INFO Jail 'named-refused-udp' started
    2013-02-06 13:10:16,963 fail2ban.jail : INFO Jail 'postfix' started
    2013-02-06 13:10:17,064 fail2ban.jail : INFO Jail 'ssh-ddos' started
    2013-02-06 13:10:17,166 fail2ban.jail : INFO Jail 'courierimap' started
    2013-02-06 13:10:17,267 fail2ban.jail : INFO Jail 'sasl' started

    Проверяем работу:

    iptables -L

    Если у вас при перезапуске fail2ban-client reload
    Посыпят ошибки, примерно такого плана:
    WARNING 'findtime' not defined in 'ssh'. Using default value
    WARNING 'findtime' not defined in 'dropbear'. Using default value
    WARNING 'findtime' not defined in 'pam-generic'. Using default value
    WARNING 'findtime' not defined in 'xinetd-fail'. Using default value
    WARNING 'findtime' not defined in 'ssh-ddos'. Using default value
    WARNING 'findtime' not defined in 'apache'. Using default value
    WARNING 'findtime' not defined in 'apache-multiport'. Using default value
    WARNING 'findtime' not defined in 'apache-noscript'. Using default value
    WARNING 'findtime' not defined in 'apache-overflows'. Using default value
    WARNING 'findtime' not defined in 'php-url-fopen'. Using default value
    WARNING 'findtime' not defined in 'vsftpd'. Using default value
    WARNING 'findtime' not defined in 'proftpd'. Using default value
    WARNING 'findtime' not defined in 'pure-ftpd'. Using default value
    WARNING 'findtime' not defined in 'wuftpd'. Using default value
    WARNING 'findtime' not defined in 'postfix'. Using default value
    WARNING 'findtime' not defined in 'couriersmtp'. Using default value
    WARNING 'findtime' not defined in 'courierauth'. Using default value
    WARNING 'findtime' not defined in 'sasl'. Using default value
    WARNING 'findtime' not defined in 'named-refused-udp'. Using default value
    WARNING 'findtime' not defined in 'named-refused-tcp'. Using default value
    WARNING 'findtime' not defined in 'pop3'. Using default value

    Для исправления в секцию [DEFAULT] файла  /etc/fail2ban/jail.conf
    введите значение findtime = 600

  • Оцените блог: 
    Средняя: 2.4 (221 оценка)

    Задать вопрос