Fail2Ban — простой локальный сервис, который просматривает логи на предмет попытки подоброать пароли к ssh, ftp, http-сервисам. Если такие попытки найдены, fail2ban блокирует ip-адрес источника. Сервис очень гибко настраивается, способен оповещать по email, писать лог, сбрасывать блокировку через заданное время и прочее.
ADVERTISEMENT
1. Ставим:
1 | # cd /usr/ports/security/py-fail2ban && make install clean |
2. Добавляем в автозапуск:
1 | # ee /etc/rc.conf |
1 | fail2ban_enable= "YES" |
3. Правим кофиг /usr/local/etc/fail2ban/jail.conf. Вначале идут дефолтные настройки, которые можно
переопределить в отдельных секциях.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | [DEFAULT] ignoreip = 127.0.0.1 192.168.1.0/24 # время бана в секундах bantime = 600 # время проверки,за которое событие успеет повторится findtime = 900 # максимальное число правонарушений maxretry = 2 # метод парсинга логов backend = auto usedns= no [ssh-ipfw] enabled = true filter = bsd-sshd action = bsd-ipfw[table=50] # sendmail[name=ssh, dest=admin@example.com] logpath = / var /log/auth.log [proftpd-ipfw] enabled = true filter = proftpd action = bsd-ipfw[table=51] # sendmail[name=proftpd, dest=admin@example.com] logpath = / var /log/auth.log [postfix-ipfw] enabled = true filter = postfix action = bsd-ipfw[table=52] # sendmail[name=postfix, dest=admin@example.com] logpath = / var /log/maillog bantime = 604800 maxretry = 3 [wordpress] enabled = true filter = wordpress action = bsd-ipfw[table=53] # sendmail[name=wordpress, dest=admin@example.com] logpath = / var /log/auth.log |
4. Правим /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf
1 2 3 4 5 6 7 8 9 10 | [Definition] actionstart = actionstop = actioncheck = # actionban = ipfw table <table> add <ip> actionunban = ipfw table <table> delete <ip> [Init] localhost = 127.0.0.1 |
5. Ставим плагин WP fail2ban Cоздаём файл /usr/local/etc/fail2ban/filter.d/wordpress.conf
1 | touch /usr/local/etc/fail2ban/filter.d/wordpress.conf |
1 2 3 4 5 6 7 8 9 10 11 | [INCLUDES] # before = common.conf # [Definition] # _daemon = wordpress # failregex = ^%(__prefix_line)sAuthentication failure for .* from $ # ignoreregex = |
6. Правим /etc/rc.firewall
1 2 3 4 5 6 7 8 9 10 11 | #fail2ban table sshd_ban_table= "table(50)" proftpd_ban_table= "table(51)" postfix_ban_table= "table(52)" wordpress_ban_table= "table(53)" #fail2ban ${fw} add 10 deny tcp from ${proftpd_ban_table} to me 21 via ${LanOut} ${fw} add 11 deny tcp from ${sshd_ban_table} to me 22 via ${LanOut} ${fw} add 12 deny tcp from ${postfix_ban_table} to me 25 via ${LanOut} ${fw} add 13 deny tcp from ${wordpress_ban_table} to me 80 via ${LanOut} |
7. Скрипт получения DNS имен из IP в таблице ipfw. Создаём файл dns.sh
1 | touch dns.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/sh echo "Table 50 sshd" ipfw table 50 list|awk -F '/' '{ print $1 }' | nslookup $@ | grep "name =" | more echo -e "n" echo -e "n" echo "Table 51 proftpd" ipfw table 51 list|awk -F '/' '{ print $1 }' | nslookup $@ | grep "name =" | more echo -e "n" echo -e "n" echo "Table 52 postfix" ipfw table 52 list|awk -F '/' '{ print $1 }' | nslookup $@ | grep "name =" | more echo -e "n" echo -e "n" echo "Table 53 wordpress" ipfw table 53 list|awk -F '/' '{ print $1 }' | nslookup $@ | grep "name =" | more |