воскресенье, 6 марта 2011 г.

Настройка Fail2Ban для ssh

   Автоматическая блокировка, с помощью Fail2Ban в Debian.

Fail2Ban программа, которая поможет защитить ssh соединение к серверу и сделать его устойчивым к перебору паролей. Применительно к sshd, программа будет анализировать лог файл /var/log/auth.log на предмет записей о не успешных попытках авторизации и дропать все соединения с удаленного хоста на наш сервер, по средствам iptables.
В Debian установка проходит не тривиальным образом, давайте установим программу используя apt-get:
  • sudo apt-get install fail2ban
  После установки, нам необходимо подредактировать конфигурационные файлы, которые находятся в /etc/fail2ban:
  • sudo nano -w /etc/fail2ban/jail.conf
  Приведу параметры которые необходимо подредактировать:
ignoreip = 127.0.0.1 192.168.0.0/16 #список адресов не подпадающих под правила
bantime  = 600 #время бана в секундах
maxretry = 3 #число попыток, после которых применяется правило
destemail = mail@example.com #почтовый адрес для отчетов
[ssh]
enabled = true
port    = ssh
filter  = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
#sendmail-whois - пошлет не просто адрес, а информацию предоставленную по whois.
            sendmail-whois[name=ssh, dest=mail@example.com, sender=fail2ban@localhost]
logpath  = /var/log/auth.log
maxretry = 2
bantime = 36000 
#время бана можно указать отдельно для каждого правила, ровно как и количество неудачных fail-ов
[ssh-ddos]
enabled = true
port    = ssh
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 2

  Сохраняем файл конфигурации jail (тюрьма), после чего запускаем службу:

  • sudo /etc/init.d/fail2ban start
  После того, как в логах будут появляться записи о ошибках авторизации входа по ssh, программа будет блокировать, создавая правило в цепочке iptables:
  • iptables -L

Chain fail2ban-sshd (1 references)
target     prot opt source               destination
DROP       all  --  217.107.186.88       anywhere
RETURN     all  --  anywhere             anywhere

   Следует заметить, что если при попытке соединения указывать имя существующего системного пользователя , то программа не реагирует, но если как только использовалось имя не существующего пользователя - правила будут срабатывать. Конечно, нужно запрещать пользователю root соединятся по ssh, но если злоумышленник знает точное имя другой учетной записи - то это позволит ему осуществить перебор паролей и не быть заблокированным. Давайте все таки разберемся почему не срабатывает правило блокирования, при неудачных попытках соединения из под root.  Для этого посмотрим в log файлы, вот что происходит при удачном соединении из под root :

Mar  6 20:25:40 proxy sshd[21964]: Accepted password for root from 179.241.68.47 port 1194 ssh2
Mar  6 20:25:40 proxy sshd[21964]: pam_unix(sshd:session): session opened for user root by (uid=0)
Вот, что появляется в log файле при не удачном соединении из под root
Mar  6 20:28:28 proxy sshd[22034]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.252  user=root
Mar  6 20:28:30 proxy sshd[22034]: Failed password for root from 179.241.68.47 port 44640 ssh2
А вот, что получаем, когда соединяемся из под несуществующего пользователя:
Mar  6 20:38:20 proxy sshd[22258]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.252
Mar  6 20:38:21 proxy sshd[22258]: Failed password for invalid user admin from 192.168.1.252 port 47258 ssh2
Чтобы понять почему такое происходит. необходимо посмотреть в фильтр, который применяется для ssh:
  • sudo nano -w /etc/fail2ban/filter.d/sshd.conf
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$
            
               ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
              ^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
              ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
              ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
              ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers$
              ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
             ^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
             ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
             ^%(__prefix_line)sAddress <HOST> .* POSSIBLE BREAK-IN ATTEMPT\s*$
Необходимо добавить еще один failregex, вот такой ^$(__prefix_line)sFailed password for .* from <HOST>(?: port \d*)?(?: ssh\d*)? . Проверить его работоспособность можно так:

  • fail2ban-regex /var/log/auth.log 'Failed password for .* from <HOST>(?: port \d*)?(?: ssh\d*)?'
В ответ должны получить количество совпадений и адреса, которые попадают под это регулярное выражение:

Running tests
=============
Use regex line : Failed password for .* from <HOST>
Use log file   : /var/log/auth.log
Results
=======
Failregex
|- Regular expressions:
|  [1] Failed password for .* from <HOST>
|
`- Number of matches:
   [1] 19 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:
Summary
=======
Addresses found:
[1]
    218.102.169.99 (Sun Mar 06 13:21:57 2011)
    218.102.169.99 (Sun Mar 06 13:22:04 2011)
    218.102.169.99 (Sun Mar 06 13:22:06 2011).............................................
Рестартим fail2ban

  • /etc/init.d/fail2ban restart
И всё ;)
    





6 комментариев:

  1. Ну забанить то мы забанили... А разбанить вручную как?

    ОтветитьУдалить
  2. Встречный вопрос: а как удалить правило в iptables? Блокирование происходит правилами iptables, поэтому нужно просто удалить правило.

    Либо подождать пока не выйдет время бана.

    ОтветитьУдалить
  3. Ну насчет iptables я понял сразу. Просто в комплекте с fail2ban идет утилита fail2ban-client, у которой есть ключ, например fail2ban-client set ssh delignoreip xxx.xxx.xxx.xxx
    По мануалу она то как раз и должна удалить айпи адрес в списке. А вот не удаляет, зараза.

    ОтветитьУдалить
  4. Да, действительно, у меня тоже ругается...
    У тебя какая версия? У меня 0.8.3, в 0.8.4 этот баг(?) тоже есть. В sid репозитории (у меня debian) последняя версия 0.8.5.
    Попробуй поставить последнюю версию пакета, либо установить из svn.

    http://sourceforge.net/tracker/?func=detail&aid=2988754&group_id=121032&atid=689044

    ОтветитьУдалить
  5. delignoreip не разбан делает
    есть параметр ignoreip туда добавляем доверенные айпишники на которые не реагирует fail2ban, соотвественно delignoreip удаляет доверенные айпишники, а не забаненые.

    ОтветитьУдалить
  6. третье правило делает тоже самое что и добавляемая строка

    3) ^%(__prefix_line)sFailed (?:password|publickey) for .* from (?: port \d*)?(?: ssh\d*)?$
    +) ^$(__prefix_line)sFailed password for .* from (?: port \d*)?(?: ssh\d*)?

    можете проверить fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
    в третьем пункте будут те же строчки что и при запуске в тест добавляемой строки

    ОтветитьУдалить