Оригинал лежит на Howtoforge.

В этой статье я покажу, как установить и настроить fail2ban на системе openSUSE 10.3. Fail2ban - это инструмент, который отслеживает попытки залогиниться к раз личным сервисам, таким, как SSH, FTP, SMTP, Apache и другим, и если он находит постоянно повторяющиеся неудачные попытки с одного и того же IP-адреса или хоста, fail2ban остановит дальнейшие попытки залогиниться с этого IP-адреса/хоста, блокируя их с помощью правила iptables.

Этот документ не дает никаких гарантий! Я хочу сказать, что это не единственный способ установки такой системы. Есть много других способов достигнуть этой цели, но это путь, который выбрал я. Я не даю никакой гарантии, что это будет у вас работать!

Предварительное примечание

Fail2ban подобен DenyHosts, который я описывал в этом руководстве: http://www.howtoforge.com/preventing_ssh_dictionary_attacks_with_denyhosts, но в отличие от DenyHosts, который фокусируется на SSH,** fail2ban** может контролировать любой сервис, который записывает попытки входа, и, вместо использования /etc/hosts.deny для блокировки IP-адреса хоста, fail2ban может использовать iptables и /etc/hosts.deny.

В этом примере, я настрою fail2ban для мониторинга попыток залогиниться к серверу SSH, серверу ProFTPD, .htaccess/.htpasswd, защищающим веб-сайт, Courier POP3 и Courier IMAP, и SASL (для отправленных писем). Я установлю пакет** fail2ban**, который доступен в openSUSE 10.3. Он включает в себя конфигурацию по умолчанию, но, к сожалению, эта конфигурация не всегда работает для всех перечисленных сервисов.

Установка fail2ban

Fail2ban доступен в репозитории Packman:

    yast2

В YaST идите Software > Community Repositories

Затем отметьте Packman Repository и выберите [Finish]

Затем покиньте YaST

Далее можно установить fail2ban:

    # yast2 -i fail2ban

Затем мы должны создать ссылки для запуска и запустить его:

    # chkconfig –add fail2ban
    # /etc/init.d/fail2ban start

Вы найдете все конфигурационные файлы fial2ban в директории /etc/fail2ban.

Конфигурирование fail2ban

Стандартное поведение fail2ban настроивается в файле /etc/fail2ban/jail.conf. Взгляните на него, он не сложен для понимания. Там имеется секция [Defaults], которая применяется ко всем другим секциям, если только опции по умолчанию не перезаписаны в других секциях.

Здесь я объясню некоторые опции конфигурации:

  • ignoreip - это разделенный пробелами список ip-адресов, которые не могут быть блокированы fail2ban. Например, если компьютер, с которого вы подключаетесь к серверу, имеет статический IP-адрес, вы, возможно, захотите поместить его здесь.
  • bantime - время в секунда, на которое блокируется хост, если он был пойман fail2ban (600 секунд = 10 минут).
  • maxretry - Максимальное число неудавшихся попыток логина, прежде чем хост будет заблокирован fail2ban.
  • filter - Ссылается на соответствующий файл фильтра в /etc/fail2ban/filter.d.
  • action - Ссылается на соответствующий файл действия в /etc/fail2ban/action.d.
  • logpath - Файл логов, который fail2ban проверяет для неудавшихся попыток логина.

Это то, как выглядит мой файл /etc/fail2ban/jail.conf:

    # Fail2Ban configuration file
    #
    # Author: Cyril Jaquier
    #
    # $Revision: 611 $
    #
    # The DEFAULT allows a global definition of the options. They can be override
    # in each jail afterwards.

    [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 192.168.0.99

    # "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" is the number of failures before a host get banned.
    maxretry = 3

    # "backend" specifies the backend used to get files modification.
    Available

    # options are "gamin", "polling" and "auto". This option can be
    overridden in

    # each jail too (use "gamin" for a jail and "polling" for another).
    #
    # gamin:   requires Gamin (a file alteration monitor) to be installed.
    If Gamin

    #          is not installed, Fail2ban will use polling.
    # polling: uses a polling algorithm which does not require external
    libraries.

    # auto:    will choose Gamin if available and polling otherwise.

    backend = auto

    # This jail corresponds to the standard configuration in Fail2ban 0.6.
    # The mail-whois action send a notification e-mail with a whois request
    # in the body.

    [ssh-iptables]

    enabled  = true
    filter   = sshd
    action   = iptables[name=SSH, port=ssh, protocol=tcp]
        sendmail-whois[name=SSH, dest=you@mail.com,
        sender=fail2ban@mail.com]
    logpath  = /var/log/messages
    maxretry = 5

    [proftpd-iptables]
    enabled  = true
    filter   = proftpd
    action   = iptables[name=ProFTPD, port=ftp, protocol=tcp]
           sendmail-whois[name=ProFTPD, dest=you@mail.com]
    logpath  = /var/log/messages
    maxretry = 6

    # This jail forces the backend to "polling".

    [sasl-iptables]
    enabled  = true
    filter   = sasl
    backend  = polling
    action   = iptables[name=sasl, port=smtp, protocol=tcp]
           sendmail-whois[name=sasl, dest=you@mail.com]
    logpath  = /var/log/mail

    # Here we use TCP-Wrappers instead of Netfilter/Iptables. "ignoreregex"
    is
    # used to avoid banning the user "myuser".

    [ssh-tcpwrapper]
    enabled     = false
    filter      = sshd
    action      = hostsdeny
              sendmail-whois[name=SSH, dest=you@mail.com]

    ignoreregex = for myuser from
    logpath     = /var/log/messages


    # This jail demonstrates the use of wildcards in "logpath".
    # Moreover, it is possible to give other files on a new line.

    [apache-tcpwrapper]

    enabled  = true
    filter   = apache-auth
    action   = hostsdeny
    logpath  = /var/log/apache2/error_log
    maxretry = 6

    # The hosts.deny path can be defined with the "file" argument if it is
    # not in /etc.

    [postfix-tcpwrapper]

    enabled  = true
    filter   = postfix
    action   = hostsdeny
           sendmail[name=Postfix, dest=you@mail.com]
    logpath  = /var/log/mail
    bantime  = 300

    # Do not ban anybody. Just report information about the remote host.
    # A notification is sent at most every 600 seconds (bantime).

    [vsftpd-notification]

    enabled  = false
    filter   = vsftpd
    action   = sendmail-whois[name=VSFTPD, dest=you@mail.com]
    logpath  = /var/log/messages
    maxretry = 5
    bantime  = 1800

    # Same as above but with banning the IP address.

    [vsftpd-iptables]

    enabled  = false
    filter   = vsftpd
    action   = iptables[name=VSFTPD, port=ftp, protocol=tcp]
           sendmail-whois[name=VSFTPD, dest=you@mail.com]
    logpath  = /var/log/messages
    maxretry = 5
    bantime  = 1800

    # Ban hosts which agent identifies spammer robots crawling the web
    # for email addresses. The mail outputs are buffered.

    [apache-badbots]

    enabled  = true
    filter   = apache-badbots
    action   = iptables-multiport[name=BadBots, port="http,https"]
            sendmail-buffered[name=BadBots, lines=5, dest=you@mail.com]
    logpath  = /var/log/apache2/access_log
    bantime  = 172800
    maxretry = 1

    [courierpop3]

    enabled  = true
    port     = pop3
    filter   = courierlogin
    action   = iptables[name=%(__name__)s, port=%(port)s]
    logpath  = /var/log/mail
    maxretry = 5

    [courierimap]

    enabled  = true
    port     = imap2
    filter   = courierlogin
    action   = iptables[name=%(__name__)s, port=%(port)s]
    logpath  = /var/log/mail
    maxretry = 5

Мой клиентский компьютер имеет статический IP-адрес 192.168.0.99, и поскольку я не хочу быть заблокированным, я внес его в список ignoreip.

Я хочу контролировать попытки логина к SSH, Apache, Proftpd, Courier-POP3, Courier-IMAP и Sasl, поэтому я установил значение “true” для этих сервисов и отключил с помощью “false” для всех остальных. Заметьте, что некоторые сервисы, например, SSH, могут блокироваться или iptables, или TCPWrappers (/etc/host.deny). Решите для себя, какой метод для вас предпочтительнее.

Убедитесь, что заменили адрес электронной почты you@mail.com на свой собственный адрес для получения уведомлений, когда fail2ban что-нибудь заблокирует.

Если вы сравните этот файл с файлом конфигурации по умолчанию /etc/fail2ban/jail.conf, вы заметите также, что я поменял несколько файлов логов, потому что log-файлы в стандартной комплектации не подходят для openSUSE 10.3.

Каждый раз, как мы меняем файл конфигурации, мы должен рестартануть fail2ban, что мы сейчас и сделаем:

    /etc/init.d/fail2ban restart

Все готово. Fail2ban записывает логи в /var/log/fail2ban.log, так что вы можете проверить этот файл для выяснения почему/какие хосты были блокированы. Если хост заблокирован fail2ban, это выглядит примерно так:

    2007-10-07 17:49:09,466 fail2ban.actions: WARNING [apache-tcpwrapper] Ban 1.2.3.4
    2007-10-07 18:08:33,213 fail2ban.actions: WARNING [sasl-iptables] Ban 1.2.3.4
    2007-10-07 18:26:37,769 fail2ban.actions: WARNING [courierlogin] Ban 1.2.3.4
    2007-10-07 18:39:06,765 fail2ban.actions: WARNING [courierimap] Ban 1.2.3.4

Вы также можете проверить свой файерволл, чтобы посмотреть, заблокированы ли какие-либо хосты. Для этого просто запустите:

    # iptables -L

Про сервисы, которые используют TCPWrapper для блокировки хостов, смотрите /etc/hosts.deny.

Ссылки: