Настраиваем fail2ban в Ubuntu

  1. Не секрет, что стоит только засветиться в Сети новому сервису, как сразу к нему потянутся нити роботов, пытающихся подобрать учетные данные. Остановить процесс можно разными способами, один из них – утилита Fail2ban (fail2ban.org). Идея проста: демон, сканируя логи, проверяет наличие записей о неудачных попытках ввода пароля или попытке входа в запрещенную область сети. Если таковые будут найдены, то подозрительный IP блокируется средствами iptables/ipwf или TCP Wrapper (/etc/hosts.allow|deny). Со временем бан может сниматься автоматически, без вмешательства админа, что очень удобно, ведь под раздачу может попасть и нормальный хост. О блокировке сисадмин получает сообщение по почте. Изначально Fail2ban разрабатывался для защиты SSH, сегодня это уже фреймворк, который можно легко настроить под любые приложения и события, в том числе и прописать свои методы блокировки IP. Удобно также, что один процесс может защищать сразу несколько сервисов, по умолчанию идет с готовыми настройками для SSH, Apache и Vsftpd/ProFTPD. В комплекте имеются готовые описания и для десятка других приложений, но чтобы они проверялись их следует активировать.
    Проект уже пару лет не развивается, но за это время появились сторонние наработки, в частности, правила для ряда приложений, описывающие, что и где искать. На странице закачки Fail2ban предлагаются собственные сборки пакетов для большинства дистрибутивов Linux. Но для установки лучше выбрать вариант из репозитария. Мэйнтейнеры обычно учитывают особенности конкретного дистра, да и добавляют от себя файлы запуска и правил блокировки.
    В Ubuntu/Debian установить очень просто.

    Код:
    [COLOR="Green"]$ sudo apt-get install fail2ban[/COLOR]
    Демон стартует сразу с установками по умолчанию, защищая только SSH. Все настройки производятся в нескольких файлах, размещенных в каталоге /etc/fail2ban (для Debian/Ubuntu). В fail2ban.conf хранятся параметры запуска демона, внутри для настроек ничего интересного для нас нет. Разработчик упростил процесс создания новых правил, начиная с версии 0.7, фильтры и действия прописываются в разных файлах. После установки их можно найти соответственно в подкаталогах filter.d и action.d.
    Причем файлы внутри могут быть двух расширений – .conf и .local. Параметры из второго замещают установки из первого, то есть, чтобы что-то переопределить, вносить изменения непосредственно в conf не нужно. Такими образом облегчается последующее обновление и возврат к дефолтным настройкам.
    Правила поиска просты. Предусмотрено использование переменных, причем имеются и уже встроенные. Так, например HOST соответствует регулярному выражению, используемому для поиска IP или имени узла.

    Код:
    [COLOR="Green"](?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
    </host>[/COLOR]
    Например, правило для поиска попыток DDOS в SSH.

    Код:
    [COLOR="Green"]$ grep -v '^#' /etc/fail2ban/filter.d/sshd-ddos.conf
    [Definition]
    failregex = sshd(?:\[\d+\])?: Did not receive identification string from <host>$
    ignoreregex = 
    </host>[/COLOR]
    Строка failregex описывает, что искать, в ignoreregex значения которые должны игнорироваться. В одном файле может быть несколько таких строк. Кто хоть немного разбирается в регулярных выражениях, легко создаст свое правило, используя имеющиеся примеры. Для разборки лог файла демон вызывает утилиту fail2ban-regex, которую обычно применяют и для проверки нового фильтра. Например, в поставке нет правила для Asterisk или другого подобного сервера, но сегодня атаки на VoIP становятся более популярными, и в логах часто можно увидеть записи вроде:

    Код:
    [COLOR="green"]NOTICE[3309] chan_sip.c: Registration from 'sip:[email protected]' failed for '9.8.7.6' - No matching peer found[/COLOR]
    Вид в зависимости от конкретной версии чуть меняется, последняя строка указывающая на конкретную проблему также может принимать порядка 10 описаний – Wrong password, Device does not match ACL и т.д. Правило будет простое:

    Код:
    [COLOR="Green"]failregex = NOTICE.* .*: Registration from '.*' failed for '' - No matching peer found[/COLOR]
    И так для каждого случая. Проверяем:

    Код:
    [COLOR="green"]$ fail2ban-regex /var/log/asterisk.log 'NOTICE.* .*: Registration from '.*' failed for '' - No matching peer found'[/COLOR]
    Если все нормально, записываем фильтры в новый файл asterisk.conf, взяв за пример любой из каталога filter.d.
    С тем, что искать, разобрались, осталось указать, где искать, и что делать с находкой. Описание всех действий собраны в подкаталоге action.d, здесь несколько файлов под каждое приложение/задачу, как правило, там уже все настроено и менять ничего не требуется. Но чтобы новые фильтры увидел Fail2ban, необходимо объявить их в /etc/bail2ban/jail.conf, внутри которого находим несколько секций с описанием разных сервисов.

    Код:
    [COLOR="green"]$ sudo nano /etc/bail2ban/jail.conf
     
    [DEFAULT]
     
    # общие правила могут переопределяться в секциях
    # IP-адреса, которые не будут блокироваться, может быть подсеть или DNS имя
    ignoreip = 127.0.0.1
     
    # время блокировки узла, при отрицательном значении блокировка постоянная
    bantime = 600
     
    # промежуток времени и количество неудачных попыток, необходимых для блокировки
    maxretry = 3
    findtime = 600
     
    [asterisk-iptables]
     
    enabled = true # включили
    # в filter и action, по сути, прописываем имя файла без расширения из соответствующих подкаталогов, плюс дополнительные параметры
    filter = asterisk
    action = iptables-allports[name=ASTERISK, protocol=all]
    sendmail-whois[name=ASTERISK, dest=root, [email protected]]
    # логи Asterisk
    logpath = /var/log/asterisk/messages
    # переопределяем значение
    maxretry = 5
    bantime = 6000[/COLOR]
    Проверяем, запущены ли сервисы:

    Код:
    [COLOR="green"]$ sudo service iptables start
    $ sudo service fail2ban start[/COLOR]
    Работу Fail2ban можно отследить, просмотрев журнал /var/log/fail2ban.log или правила iptables.

    Код:
    [COLOR="green"]$ sudo iptables -L -v | grep fail2ban[/COLOR]

     
    1 человеку нравится это.