Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы

Содержание:

  • Настройка Fail2ban для защиты SSH
  • Fail2ban лучшая защита от атак
  • fail2ban - базовая настройка
  • Защита от брутфорса SSH средствами fail2ban на FreeBSD + немного полезностей
  • Защита UNIX сервера от подбора паролей
  • Настройка Fail2ban для защиты SSH

    Fail2ban — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей.

    Программа умеет бороться с различными атаками на все популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д.

    Но в первую очередь Fail2ban известен благодаря готовности «из коробки» к защите SSH–сервера от атак типа «bruteforce», то есть к защите SSH от перебора паролей.

    Настройка Fail2ban для защиты SSH

    Установка Fail2ban

    Готовые пакеты Fail2ban можно найти в официальных репозиториях всех популярных Linux дистрибутивов.

    Установка Fail2ban на Debian/Ubuntu:

    # apt-get install fail2ban

    Установка Fail2ban на CentOS/Fedora/RHEL:

    # yum install fail2ban

    Конфигурация Fail2ban

    На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию. Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже.

    У программы два основных файла конфигурации:

    1. /etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
    2. /etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd.

    Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:

    [DEFAULT]
    ignoreip = 127.0.0.1/8
    bantime  = 600
    maxretry = 3
    banaction = iptables-multiport
    
    [ssh]
    enabled  = true
    port     = ssh
    filter   = sshd
    logpath  = /var/log/auth.log
    maxretry = 6

    Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены.

    Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force».

    Подробнее по каждому из основных параметров файла jail.conf:

    ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера.

    bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.

    maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] — это число неудавшихся попыток логина, после которых происходит блокировка.

    enabled — значение true указывает что данный jail активен, false выключает действие изолятора.

    port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — 22, или его буквенное наименование — ssh.

    filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.

    logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл /var/log/auth.log.

    Рекомендации по настройке Fail2ban

    Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.

    Новая опция findtime — определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов.

    Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек jail.conf, для этого предусмотрены файлы с расширением *.local, которые автоматически подключаются и имеют высший приоритет.

    # nano /etc/fail2ban/jail.local
    [DEFAULT]
    ## Постоянный IP-адрес.
    ## Если не переопределить ignoreip здесь,
    ## то стоит закомментировать этот параметр в jail.conf.
    ignoreip = 57.66.158.131
    
    [ssh]
    ## если в течении 1 часа:
    findtime    = 3600
    ## произведено 6 неудачных попыток логина:
    maxretry    = 6
    ## то банить IP на 24 часа:
    bantime     = 86400

    Осталось перезапустить Fail2ban:

    # service fail2ban restart
    * Restarting authentication failure monitor fail2ban        [ OK ]
    # tail /var/log/fail2ban.log
    2013-01-20 22:00:35,911 fail2ban.jail   : INFO   Jail 'ssh' stopped
    2013-01-20 22:00:35,916 fail2ban.server : INFO   Exiting Fail2ban
    2013-01-20 22:00:36,257 fail2ban.server : INFO   Changed logging target to
    /var/log/fail2ban.log for Fail2ban v0.8.6
    2013-01-20 22:00:36,258 fail2ban.jail   : INFO   Creating new jail 'ssh'
    2013-01-20 22:00:36,259 fail2ban.jail   : INFO   Jail 'ssh' uses poller
    2013-01-20 22:00:36,271 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
    2013-01-20 22:00:36,271 fail2ban.filter : INFO   Set maxRetry = 6
    2013-01-20 22:00:36,272 fail2ban.filter : INFO   Set findtime = 3600
    2013-01-20 22:00:36,272 fail2ban.actions: INFO   Set banTime = 86400
    2013-01-20 22:00:36,298 fail2ban.jail   : INFO   Jail 'ssh' started

    Заключение

    В статье затронуты только базовые возможности Fail2Ban, применимые для защиты SSH на типовом Linux–сервере. Более подробную документацию по программе вы можете найти в официальной Wiki на авторском веб–сайте.

    Материал взят с сайта: http://putty.org.ru/articles/fail2ban-ssh.html

    Fail2ban лучшая защита от атак

    Сегодня я хочу предложить одну из самых лучших прог в этом секторе - это fail2ban., с этим может справится только fail2ban. Fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы: отслеживать изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные действия. Для поиска характерных признаков подбора пароля, используются регулярные выражения в файлах фильтров. Для выполнения действий используются action файлы. Так что будем устанавливать. Настраивать будем защиту sshd, proftpd, dovecot и может ещё какую службу. Для работы, естественно, потребуется включенный фаервол.

    Установка fail2ban

    Идём сюда:

    # cd /usr/ports/security/py-fail2ban

    запускаем инсталляцию:

    # make install clean

    Дальше идём сюда /usr/local/etc/fail2ban и наблюдаем следующую структуру каталога:

    папка action.d - содержит файлы действий
    папка filter.d - файлы фильтров
    файл fail2ban.conf - основной файл конфигурации
    файл jail.conf - файл настройки защиты конкретных сервисов

    Настройка fail2ban

    Чтобы в процессе конфигурации не натворить плохого, все файлы, которые мы будем править будем переименовывать из .conf в .local. В первую очередь копируем файл jail.conf в файл с именем jail.local.

    # cp /usr/local/etc/fail2ban/jail.conf /usr/local/etc/fail2ban/jail.local

    Основной файл конфигурации /usr/local/etc/fail2ban/fail2ban.conf здесь можно оставить всё по умолчанию, можно только установить уровень логирования на 4, чтобы мы могли видеть побольше сообщений. Далее идём в папку /usr/local/etc/fail2ban/action.d видим кучу фаерволов, нас интересует пока только bsd-ipfw.conf. Переименовываем его в bsd-ipfw.local. Оставляем в нём всё по умолчанию. Можно только внести строчку

    actionunban = ipfw table 1 delete

    что бы при выходе из fail2ban обнулялась таблица, иначе там зависнут все забаненные навечно. Добавляем в ipfw правило, блокирующее все IP адреса, находящиеся в таблице table 1:

    ${FwCMD} add deny all from table\(1\) to me

    Правило ставим сразу после вот этого правила

    ${FwCMD} add allow ip from any to any via lo0

    Переходим в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению ищут определенные строки в лог файлах. Нас интересуют sshd.conf и proftpd.conf и dovecot.conf, как и ранее копируем их в sshd.local, proftpd.local и dovecot.local соответственно. В файлах я все оставил как есть.

    А теперь мы дошли до самого вкусного, что есть в этой проге, чего нет ни в одной аналогичной проге. Проверить работоспособность того или иного фильтра с регулярными выражениями можно с помощью скрипта fail2ban-regex, идущего в поставке fail2ban. Например, проверяем фильтр proftpd.local, натравливая его на лог файл авторизаций:

    # fail2ban-regex /var/log/auth.log /usr/local/etc/fail2ban/filter.d/proftpd.local

    Данная команда выведет полную статистику, сколько строк из лог файла попадают под то или иное регулярное выражение, в отладке просто незаменимая вещь.

    С фильтрами вроде разобрались, теперь вернемся к файлу jail.local и приведем его к следующему виду:

    [ssh-iptables]
    
    enabled  = true
    filter   = bsd-sshd
    action   = bsd-ipfw
    mail-whois[name=SSH, dest=alex2@2gogo.ru]
    logpath  = /var/log/auth.log
    maxretry = 3
    bantime = 240
    findtime = 600
    ignoreip = 127.0.0.1
    backend = poller
    
    [proftpd-iptables]
    
    enabled  = true
    filter   = proftpd
    action   = bsd-ipfw
    mail-whois[name=ProFTPD, dest=alex2@2gogo.ru]
    logpath  = /var/log/auth.log
    maxretry = 3
    bantime = 240
    findtime = 600
    ignoreip = 127.0.0.1
    backend = poller
    
    [dovecot-iptables]
    
    enabled  = true
    filter   = dovecot
    action   = bsd-ipfw
    mail-whois[name=Dovecot, dest=alex2@2gogo.ru]
    logpath  = /var/log/dovecot-info.log
    maxretry = 3
    bantime = 240
    findtime = 600
    ignoreip = 127.0.0.1
    backend = poller
    

    Мне нужно было, чтобы fail2ban отправлял письма, поэтому я включил mail-whois и не забываем отредактировать соответствующий файл в директории action.d, в данном случае mail-whois.local, там все довольно просто. Ну вот вроед всё настроили, пора запускать fail2ban. Прописываем в /etc/rc.conf:

    fail2ban_enable="YES"

    и запускаем его

    # /usr/local/etc/rc.d/fail2ban start

    Если всё сделали правильно он запустится, если нет, разбирайтесь где накосячили. Если запустился, проверяем на бан, заходим со стороннего ip адреса, с неправильным паролем, должно забанить на время, которое вы указали.

    Ну вот! Вроде всё.

    Материал взят с сайта: http://www.ussr.kiev.ua/ru/fail2ban-luchshaya-zashchita-ot-atak

    fail2ban - базовая настройка

    fail2ban - утилита, которая парсит логи и выполняет определенные действия на некоторые повторяющиеся события в течении какого-то времени..
    Например за несколько неудачных попыток авторизоваться по ssh за некоторое время забанить источник.
    Очень полезна для предотвращения перебора паролей и различных зловредных действий.
    Методов блокировки также несколько: ipfw, iptables, hosts.deny .
    Есть уже много готовых примеров для ssh, exim, postfix,cyrus-imap, apache, lighttpd, named и тд (!!!).

    Можно их составлять и самим, для этого Вам понадобится некоторое знание регулярных выраженией в python. Сама настройка очень проста и логична.
    Рассмотрю базовую установку на FreeBSD и настройку блокировки брутфорса ssh.

    Итак приступим:
    Установка fail2ban (не забываем предварительно обновить порты)

    # cd /usr/ports/security/py-fail2ban
    make install clean
    Добавляем в /etc/rc.conf
    fail2ban_enable="YES"

    Настраиваем ротацию логов, добавляем в /etc/newsyslog.conf

    # FAIL2BAN
    /var/log/fail2ban.log                   600 7 200 * JC
    Настраиваем основной конфиг /usr/local/etc/fail2ban/jail.conf
    [DEFAULT]
    ignoreip = 127.0.0.1 10.0.0.1
    # "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  = 900
    
    # "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.
    # метод парсинга логов можно еще через Gamin, если он будет установлен
    backend = auto
    
    
    [ssh-ipfw]
    
    enabled  = true
    # использовать фильтр из примеров /filter.d/bsd-sshd.conf    
    filter   = bsd-sshd
    # использовать /action.d/bsd-ipfw.conf  
    # в квадратных скобках указываем значения переменных, в #данном случае указываем, что нужно добавить ip адрес в #таблицу 100 с tablearg 22 (я использую, как пометку причины бана)
    action   = bsd-ipfw[table=100, tablearg=22]
    logpath  = /var/log/auth.log
    maxretry = 3
    # банить на 7 суток
    bantime  = 604800
    Правим /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf
    actionban = /sbin/ipfw table <table> add <ip> <tablearg>
    actionunban = /sbin/ipfw table <table> delete <ip>
    Примечание: При рестарте fail2ban снимает все баны. Для того чтоб происходил бан, должено быть правило в фаерволе типа:
    ipfw add 10 deny ip from table'(100)' to any

    Мне также пришлось поменять регулярные выражения в /filter.d/bsd-sshd.conf, т.к. эти базовые регулярки не отрабатывали. Привел их к следующему виду:

    failregex = ^.* sshd.* (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from <HOST>\s*$
                ^.* sshd.* Did not receive identification string from <HOST>$
                ^.* sshd.* Failed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
                ^.* sshd.* ROOT LOGIN REFUSED.* FROM <HOST>\s*$
                ^.* sshd.* [iI](?:llegal|nvalid) user .* from <HOST>\s*$
                ^.* sshd.* User \S+ from <HOST> not allowed because not listed in AllowUsers$
                ^.* sshd.* authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
                ^.* sshd.* refused connect from \S+ \(<HOST>\)\s*$
                ^.* sshd.* reverse mapping checking getaddrinfo for .* \[<HOST>\] .* POSSIBLE BREAK-IN ATTEMPT!$

    Также у меня есть подсети, которые не используются.
    Если к ip из этих подсетей идет упорное обращение, то можно считать, что это происходит сканирование диапазона сети.
    В ipfw есть правило с логированием для блокировки обращения к таким подсетям.
    Таким образом можно отслеживать таких "разведчиков" и блокировать полностью эти ip. Добавляем новый раздел в файл jail.conf

    [ipfw-ban]
    enabled  = true
    # этот фильтр создадим позже /filter.d/ipfw-ban.conf   
    filter   = ipfw-ban
    action   = bsd-ipfw[table=100, tablearg=29999]
    # Направляем на логи ipfw (у меня вынесены в отдельный лог)
    # Можно направить на стандартный лог /var/log/security
    logpath  = /var/log/ipfw/ipfw.log
    maxretry = 5
    # банить на 7 суток
    bantime  = 604800

    Нам нужно составить регулярное выражение, по которому будет анализироваться файл логов. Можно тестировать сразу "на лету" и смотреть, что получается...
    Составим регулярное выражение для строки вида:

    Jul 26 11:30:10 hostname kernel: ipfw: 29999 Deny TCP 50.57.93.243:42222 не_используемый_ip_адресс:80 out via net2
    В простейшем виде будет вот такая регулярка:
    fail2ban-regex /var/log/ipfw/ipfw.log '^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$'
    Running tests
    =============
    
    Use regex line : ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
    Use log file   : /var/log/ipfw/ipfw.log
    
    
    Results
    =======
    
    Failregex
    |- Regular expressions:
    |  [1] ^.* ipfw: 29999 Deny \S* <HOST>\S* \S* out via net2$
    |
    `- Number of matches:
       [1] 228 match(es)
    
    Ignoreregex
    |- Regular expressions:
    |
    `- Number of matches:
    
    Summary
    =======
    
    Addresses found:
    [1]
        124.6.181.219 (Tue Jul 26 11:00:38 2011)
        124.6.181.219 (Tue Jul 26 11:00:39 2011)
    ...
        188.132.129.9 (Tue Jul 26 11:39:52 2011)
    
    Date template hits:
    473 hit(s): MONTH Day Hour:Minute:Second
    0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
    0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
    0 hit(s): Year/Month/Day Hour:Minute:Second
    0 hit(s): Day/Month/Year Hour:Minute:Second
    0 hit(s): Day/MONTH/Year:Hour:Minute:Second
    0 hit(s): Month/Day/Year:Hour:Minute:Second
    0 hit(s): Year-Month-Day Hour:Minute:Second
    0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
    0 hit(s): Day-Month-Year Hour:Minute:Second
    0 hit(s): TAI64N
    0 hit(s): Epoch
    0 hit(s): ISO 8601
    0 hit(s): Hour:Minute:Second
    0 hit(s): <Month/Day/Year@Hour:Minute:Second>
    
    Success, the total number of match is 228
    
    However, look at the above section 'Running tests' which could contain important
    information.
    Убедились, что регулярка отработала нормально, теперь ее можно добавлять в фильр /filter.d/ipfw-ban.conf
    [Definition]
    failregex = ^ipfw: 29999 Deny \S* .* out via net2$
    
    Перезапускаем fail2ban
    # /usr/local/etc/rc.d/fail2ban restart
    Shutdown successful
    2011-07-26 12:02:58,546 fail2ban.server : INFO   Starting Fail2ban v0.8.4
    2011-07-26 12:02:58,546 fail2ban.server : INFO   Starting in daemon mode

    Ссылки: fail2ban.org
    fail2ban на www.lissyara.su 
    Блокирование DNS DDoS при помощи пакета fail2ban
    Защита сервера Asterisk с помощью fail2ban

    Защита от брутфорса SSH средствами fail2ban
    на FreeBSD + немного полезностей

    Устанавливаем fail2ban

    # cd /usr/ports/secuity/py-fail2ban && make install clean
    Правим конфиг
    # ee /usr/local/etc/fail2ban/jail.conf
    У меня он выглядит так
    [DEFAULT]
    # Какие IP игнорировать
    ignoreip = 127.0.0.1
    # Время бана в секундах
    bantime  = 600
    # время проверки,за которое событие успеет повторится, чтоб отловить и забанить
    findtime  = 600
    # кол-во неверных попыток
    maxretry = 1
    backend = auto
    
    [ssh-ipfw]
    enabled  = true
    # использовать фильтр из примеров
    filter   = bsd-sshd
    # использовать /action.d/bsd-ipfw.conf
    action   = ssh-ipfw[localhost=78.24.219.97]
    # Уведомление в Jabber :))
    jabber-whois[name="SSH,IPFW", dest=mail@housecomputer.ru
    # Какой лог парсить
    logpath  = /var/log/auth.log
    # Какой Ip игнорировать
    ignoreip = 127.0.0.1
    
    [exim-ipfw]
    enabled  = true
    filter   = exim
    action   = exim-ipfw[localhost=78.24.219.97]
               jabber-whois[name="Exim,IPFW", dest=mail@housecomputer.ru
    logpath  = /var/log/exim/mainlog
    ignoreip = 127.0.0.1
    
    [nginx-ipfw]
    enabled  = true
    filter   = nginx
    action   = nginx-ipfw[localhost=127.0.0.1]
               jabber-whois[name="Nginx,IPFW", dest=mail@housecomputer.ru
    logpath  = /home/deathstar/www/deathstar.name.access.log
    ignoreip = 127.0.0.1

    Для уведомления в Jabber должен быть установлен и настроен sendxmpp ( о нем я писал в предыдущих статьях) Создаем файл /usr/local/etc/fail2ban/action.d/jabber-whois.conf с таким содержимым

    [Definition]
    actionstart = printf %%b "[Fail2Ban] : started
                  The jail  has been started successfully.\n
                  " | /usr/local/bin/sendxmpp ""
    
    actionstop = printf %%b "[Fail2Ban] : stopped
                             The jail  has been stopped.\n
                            " | /usr/local/bin/sendxmpp ""
    
    actioncheck = 
    
    actionban = printf %%b "[Fail2Ban] : banned 
                The IP  has just been banned by Fail2Ban after
                 attempts against .\n\n
                Here are more information about :\n
                `/usr/bin/whois `\n
                          " | /usr/local/bin/sendxmpp ""
    
    actionunban = printf %%b "[Fail2Ban] : unbanned 
                        The IP  has just been unbanned " | /usr/local/bin/sendxmpp ""
    
    [Init]
    name = default
    dest = root
    sender = fail2ban

    Создаем фильтры для sshd и exim,у меня они выглядят так Файл /usr/local/etc/fail2ban/filter.d/bsd-sshd.conf

    [INCLUDES]
    before = common.conf
    [Definition]
    _daemon = sshd
    failregex = (?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from \s*$
                Did not receive identification string from $
                Failed [-/\w]+ for .* from (?: port \d*)?(?: ssh\d*)?$
                ROOT LOGIN REFUSED.* FROM \s*$
                [iI](?:llegal|nvalid) user .* from \s*$
                User \S+ from  not allowed because not listed in AllowUsers$
                authentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=(?:\s+user=.*)?\s*$
                refused connect from \S+ \(\)\s*$
                reverse mapping checking getaddrinfo for .* \[\] .* POSSIBLE BREAK-IN ATTEMPT!$
    ignoreregex =
    

    Файл /usr/local/etc/fail2ban/filter.d/exim.conf

    
    [Definition]
    failregex = \[\] .*(?:rejected by local_scan|Unrouteable address)
    ignoreregex =

    Ну и в довесок боремся с HTTP-флудом на NGINX средствами IPFW написал фильтр для nginx Файл /usr/local/etc/fail2ban/filter.d/nginx.conf

    [Definition]
    failregex =  .*(?:"-" "-")
    ignoreregex =

    Теперь создаем действия бана Файл /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf

    [Definition]
    actionstart =
    actionstop =
    actioncheck =
    actionban = ipfw table 1 add 
    actionunban = ipfw table 1 delete 
    [Init]
    localhost = 127.0.0.1

    Файл /usr/local/etc/fail2ban/action.d/exim-ipfw.conf

    [Definition]
    actionstart =
    actionstop =
    actioncheck =
    actionban = ipfw table 2 add 
    actionunban = ipfw table 1 delete 
    [Init]
    localhost = 127.0.0.1

    Файл /usr/local/etc/fail2ban/action.d/nginx-ipfw.conf

    [Definition]
    actionstart =
    actionstop =
    actioncheck =
    actionban = ipfw table 3 add 
    actionunban = ipfw table 1 delete 
    [Init]
    localhost = 127.0.0.1

    Пишем правила для ipfw,у меня они в файле /etc/firewall

    #!/bin/sh
    ipfw='/sbin/ipfw -q'
    ${ipfw} flush
    ${ipfw} pipe flush
    ${ipfw} add check-state
    ${ipfw} table 1 flush
    ${ipfw} table 2 flush
    ${ipfw} table 3 flush
    # Ban SSH
    ${ipfw} add deny ip from table\(1\) to me ssh
    # Ban Exim
    ${ipfw} add deny ip from table\(2\) to me 25,110,143
    #Ban Nginx
    ${ipfw} add deny ip from table\(3\) to me 80,443
    ${ipfw} add allow all from any to any

    Добавляем в /etc/rc.conf

    firewall_enable="YES"
    firewall_script="/etc/firewall"
    fail2ban_enable="YES"
    и запускаем
    # sh /etc/firewall && /usr/local/etc/rc.d/fail2ban start
    Материал взят с сайта: https://deathstar.name/zashhita-ot-brutforsa-ssh-sredstvami-fail2ban-na-freebsd-nemnogo-poleznostej/

    Защита UNIX сервера от подбора паролей

    Ранее, я уже рассказывал о защите Unix сервера от подбора паролей (bruteforce). Речь шла об SSH и программе sshguard, фиксирующей неудачные попытки входа в систему по данному протоколу. Здесь хотелось-бы рассказать о более комплексном решении, для защиты практически любого сервиса - программе Fail2ban.

    Собственно fail2ban, это небольшой набор скриптов, написанных на python. Принцип работы прост, отслеживать изменения в лог файлах различных сервисов и по определенным сигнатурам, выполнять определенные действия. Для поиска характерных признаков подбора пароля, используются регулярные выражения в файлах фильтров. Для выполнения действий используются action файлы.

    На Linux с настройкой данной программы вообще никаких трудностей не возникает, на сервере FreeBSD всплыли некоторые специфические моменты.

    Итак, операционная система FreeBSD 8.2 amd64, настраивать будем защиту sshd и фтп сервера proftpd. Для работы естественно потребуется включенный фаервол, во FreeBSD штатным является ipfw.

    # cat /usr/local/etc/clamd.conf | grep -v ^# | grep -v ^$
    LogFile /var/log/clamav/clamd.log

    Установка fail2ban

    # cd /usr/ports/security/py-fail2ban
    # /usr/ports/security/py-fail2ban# make install clean

    После установки, которая длится меньше минуты, идем по адресу /usr/local/etc/fail2ban, наблюдаем следующую структуру каталога:

    • папка action.d - содержит файлы действий
    • папка filter.d - файлы фильтров
    • файл fail2ban.conf - основной файл конфигурации
    • файл jail.conf - файл настройки защиты конкретных сервисов

    Настройка fail2ban

    В первую очередь копируем файл jail.conf в файл с именем jail.local, что-бы файл по умолчанию у нас оставался нетронутым, все настройки лучше делать в jail.local.

    # cp /usr/local/etc/fail2ban/jail.conf /usr/local/etc/fail2ban/jail.local

    Для начала заглянем в основной файл конфигурации:

    [Definition]
    
    loglevel = 4 # На время настройки я ставлю 4, максимально подробный уровень логгирования
    logtarget = /var/log/fail2ban/fail2ban.log # лог файл fail2ban, имейте в виду, если вы указываете свое расположение файла логов, как я в данном случае, нужно что-бы директория, где он будет расположен, была доступна на запись только пользователю root, иначе fail2ban не запустится.
    socket = /var/run/fail2ban/fail2ban.sock # файл сокета для связи клиентской и серверной части программы, оставляем по умолчанию

    Тут я изменил только расположение файла логов, как мне удобней и поднял уровень логгирования на время отладки.

    Далее настроим взаимодействие с фаерволом ipfw. Идем в папку action.d, как видите фаерволы тут представлены в ассортименте, поскольку мы используем FreeBSD с ipfw, нас интересует файл bsd-ipfw.conf, вообще можно создать и свой с произвольным именем, главное не забыть это учесть при дальнейшей настройке в jail.local. По аналогии с файлом jail.conf, копируем его с именем bsd-ipfw.local.

    Здесь можно оставить по умолчанию но я предпочитаю дописать в actionstop, команду для обнуления таблицы с забаненными IP адресами, при выключении fail2ban. Если сравнить этот файл, например с iptables.conf (для стандартного фаервола в linux дистрибутивах — iptables), можно заметить некоторые отличия, поскольку данные фаерволы устроены по разному и принципы организации правил фильтрации у них тоже разные.

    Файл после моей правки выглядит так:

    [Definition]
    actionstart = # команда выполняемая при старте fail2ban
    actionstop = pfw table 1 flush # команда выполняемая при остановке, обнуляем блокирующую таблицу
    actioncheck = # команда проверки
    actionban = ipfw table 1 add # забанить IP адрес, при срабатывании, IP добавляется в таблицу 1 ipfw
    actionunban = ipfw table 1 delete # обратное действие, удалить IP из таблицы

    все остальное я закомментировал

    Что-бы данный вариант работал, нужно руками добавить в ipfw правило, блокирующее все IP адреса, находящиеся в таблице table 1:

    # ipfw add 100 deny all from table\(1\) to me
    # ipfw show
    00100     0        0 deny ip from table(1) to me # правило которые мы только что добавили
    65535 65255 15896158 allow ip from any to any

    Есть еще один вариант, можно поступить например так:

    в actionstart прописать команду автоматического создания правила:

    actionstart = ipfw add 100 deny all from table\(1\) to me

    а в actionstop, вдобавок к обнулению таблицы, дописать еще и команду удаления, например так:

    actionstop = ipfw -q delete `ipfw -q show | grep "table(1)" | awk '{ print $1;}'`	      ipfw table 1 flush

    обе команды сработают по очереди. Но у ipfw есть такая особенность, в него можно добавлять кучу одинаковых правил с одним и тем-же номером, без каких-либо сообщений об ошибке. Срабатывать при этом будет только первое из них.

    Получится следующая ситуация, мы прописали команду в actionstart, как я привел парой строк выше, а мониторить собираемся например 3 сервиса, sshd, proftpd и dovecot, значит при инициализации fail2ban, файл bsd-ipfw.local, будет прочитан 3 раза, соответственно команда:

    # ipfw add 100 deny all from table\(1\) to me
    

    тоже будет выполнена трижды, и соответственно у нас в фаерволе появится 3 одинаковых правила, и 2 из них не будут выполнять никаких функций, лишь мозолить глаза и сбивать с толку:

    # ipfw show
    00100     9      522 deny ip from table(1) to me # 1 работающее правило
    00100     0        0 deny ip from table(1) to me # 2
    00100     0        0 deny ip from table(1) to me # 3
    65535 67537 16429215 allow ip from any to any
    

    если вас это не смущает, можете сделать так, никаких негативных моментов это не несет, не считая конечно некоторой путаницы с правилами.

    В общем я предпочитаю первый вариант, с ручным созданием основного правила.

    Далее перейдем в каталог filter.d. Тут у нас лежат фильтры, которые по регулярному выражению ищут определенные строки в лог файлах. Нас интересуют sshd.conf и proftpd.conf, как и ранее копируем их в sshd.local и proftpd.local соответственно.

    В файле sshd.local, я все оставил как есть. В proftpd.local пришлось внести некоторые незначительные изменения. Вот содержимое измененного файла:

    [Definition]
    failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[\S+\] to \S+:\S+.*$
                \(\S+\[<HOST>\]\)[: -]+ USER \S+ \(Login failed\): Incorrect password\..*$
                \(\S+\[<HOST>\]\)[: -]+ SECURITY VIOLATION: \S+ login attempted\..*$
                \(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \(\d+\) exceeded.*$
    
    ignoreregex = # Сюда можно вписать регулярные выражения строк, которые нужно игнорировать
    

    Дело в том, что регулярные выражения прописанные тут по умолчанию, ничего не находили в лог файле. Проверить работоспособность того или иного фильтра с регулярными выражениями можно с помощью скрипта fail2ban-regex, идущего в поставке fail2ban. Например проверяем фильтр proftpd.local, натравливая его на лог файл авторизаций:

    # fail2ban-regex /var/log/auth.log /usr/local/etc/fail2ban/filter.d/proftpd.local
    

    Данная команда выведет полную статистику, сколько строк из лог файла попадают под то или иное регулярное выражение, в отладке очень полезная штука.

    Я никогда не сталкивался с python, тем более с его регулярными выражениями, хотя они и похожи на Perl, тем не менее различия есть. Попробовав разные вариант, дописал в конец каждого выражения ".*", после чего прогнал проверку через fail2ban-regex, все что нужно, находится.

    С фильтрами вроде закончили, вернемся к файлу jail.local и приведем его к следующему виду:

    [DEFAULT]
    
    [ssh-ipfw]
    enabled  = true # включить мониторинг
    ignoreip = 127.0.0.1 192.168.50.200 # IP адреса которые нужно игнорировать
    filter   = sshd # какой файл фильтра использовать, то есть по сути это название файла в папке filter.d, только без расширения
    action   = bsd-ipfw # какой действие использовать, название аналогично фильтру
    logpath  = /var/log/auth.log # анализируемый лог файл
    bantime  = 60 # продолжительность блокировки, подбираем на свое усмотрение
    maxretry = 2 # количество неудачных авторизаций с IP, значение подбирается по ситуации/нагрузке на сервис в рамках данной машины
    findtime  = 600 # время, в течении которого нужно фиксировать maxretry, то есть у нас получается 2 ошибки в течении 10 минут
    backend = poller # способ получения информации о модификации лог файла, можно поставить auto или gamin
    
    [proftpd-ipfw] # тут все аналогично
    enabled  = true
    filter   = proftpd
    action   = bsd-ipfw
    logpath  = /var/log/auth.log
    ignoreip = 127.0.0.1 192.168.50.200
    bantime  = 60
    maxretry = 2
    findtime  = 600
    backend = poller

    В добавок к уже прописанному действию, можно добавить уведомление по почте на нужный адрес, например так:

    action = bsd-ipfw
                      mail-whois[name=ProFTPD, dest=admin@domain.com]

    и отредактировать соответствующий файл в директории action.d, в данном случае mail-whois.local, там все довольно просто:

    [Definition]
    actionstart =
    actionstop =
    actioncheck =
    actionban = printf %%b "Hi,\n
                The IP  has just been banned by Fail2Ban after
                 attempts against .\n\n
                Here are more information about :\n
                `whois `\n
                Regards,\n
                Fail2Ban"|mail -s "[Fail2Ban] : banned " 
    
    actionunban =
    [Init]
    name = default
    dest = admin@domain.com

    На этом с настройками вроде закончили, можно запускать и проверять.

    Запуск и проверка fail2ban

    Мне удобней просматривать лог в режиме realtime, в отдельном окне консоли или в отдельном окне, оконного менеджера для терминала — screen, делаем:

    # tail -f /var/log/fail2ban/fail2ban.log
    

    теперь в этом окне у нас будут вылезать на экран все строки попадающие в лог, по мере их поступления.

    Если запуск прошел успешно, проверяем блокировку. Я поступаю просто, со стороннего сервера запускаю:

    # ssh 192.168.50.200
    

    и жму на ентер, или ввожу значения от балды и жму на ентер), наблюдая за логом fail2ban, при loglevel = 4, там буду фиксироваться все изменения наблюдаемого файла, так же найденные IP адреса и действия производимые с ними.

    В течении нескольких секунд после достижения порога неудачных логинов к ssh, IP адрес блокируется путем добавления его в таблицу table 1 фаервола, по истечении времени блокировки, адрес будет автоматически удален. Аналогично проверяется и ftp.

    На Linux все настраивается аналогично, разве что может чуть попроще, с использованием соответствующих фаерволу, action файлов.

    Вроде ничего не упустил.

    Материал взят с сайта: http://webcache.googleusercontent.com/search?q=cache:kS55UNzgFikJ:vds-admin.ru/freebsd/zashchita-unix-servera-ot-podbora-parolei+&cd=4&hl=ru&ct=clnk

    Настройка и использование Fail2ban на Linux

    Главная > Программы