Автоматическая блокировка, с помощью Fail2Ban в Debian.
Fail2Ban программа, которая поможет защитить ssh соединение к серверу и сделать его устойчивым к перебору паролей. Применительно к sshd, программа будет анализировать лог файл /var/log/auth.log на предмет записей о не успешных попытках авторизации и дропать все соединения с удаленного хоста на наш сервер, по средствам iptables.
Fail2Ban программа, которая поможет защитить ssh соединение к серверу и сделать его устойчивым к перебору паролей. Применительно к sshd, программа будет анализировать лог файл /var/log/auth.log на предмет записей о не успешных попытках авторизации и дропать все соединения с удаленного хоста на наш сервер, по средствам iptables.
В Debian установка проходит не тривиальным образом, давайте установим программу используя apt-get:
- sudo apt-get install fail2ban
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 - пошлет не просто адрес, а информацию предоставленную по whois.
sendmail-whois[name=ssh, dest=mail@example.com, sender=fail2ban@localhost]
logpath = /var/log/auth.log
maxretry = 2
bantime = 36000
#время бана можно указать отдельно для каждого правила, ровно как и количество неудачных fail-ов
#время бана можно указать отдельно для каждого правила, ровно как и количество неудачных fail-ов
[ssh-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 2
Сохраняем файл конфигурации jail (тюрьма), после чего запускаем службу:
Сохраняем файл конфигурации jail (тюрьма), после чего запускаем службу:
- sudo /etc/init.d/fail2ban start
- 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Рестартим fail2ban
=============
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).............................................
- /etc/init.d/fail2ban restart
Ну забанить то мы забанили... А разбанить вручную как?
ОтветитьУдалитьВстречный вопрос: а как удалить правило в iptables? Блокирование происходит правилами iptables, поэтому нужно просто удалить правило.
ОтветитьУдалитьЛибо подождать пока не выйдет время бана.
Ну насчет iptables я понял сразу. Просто в комплекте с fail2ban идет утилита fail2ban-client, у которой есть ключ, например fail2ban-client set ssh delignoreip xxx.xxx.xxx.xxx
ОтветитьУдалитьПо мануалу она то как раз и должна удалить айпи адрес в списке. А вот не удаляет, зараза.
Да, действительно, у меня тоже ругается...
ОтветитьУдалитьУ тебя какая версия? У меня 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
delignoreip не разбан делает
ОтветитьУдалитьесть параметр ignoreip туда добавляем доверенные айпишники на которые не реагирует fail2ban, соотвественно delignoreip удаляет доверенные айпишники, а не забаненые.
третье правило делает тоже самое что и добавляемая строка
ОтветитьУдалить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
в третьем пункте будут те же строчки что и при запуске в тест добавляемой строки