Fail2Ban — простой локальный сервис, который просматривает логи на предмет попытки подоброать пароли к ssh, ftp, http-сервисам. Если такие попытки найдены, fail2ban блокирует ip-адрес источника. Сервис очень гибко настраивается, способен оповещать по email, писать лог, сбрасывать блокировку через заданное время и прочее.
1. Ставим:
# cd /usr/ports/security/py-fail2ban && make install clean
2. Добавляем в автозапуск:
# ee /etc/rc.conf
fail2ban_enable="YES"
3. Правим кофиг /usr/local/etc/fail2ban/jail.conf. Вначале идут дефолтные настройки, которые можно
переопределить в отдельных секциях.
[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, [email protected]] logpath = /var/log/auth.log [proftpd-ipfw] enabled = true filter = proftpd action = bsd-ipfw[table=51] # sendmail[name=proftpd, [email protected]] logpath = /var/log/auth.log [postfix-ipfw] enabled = true filter = postfix action = bsd-ipfw[table=52] # sendmail[name=postfix, [email protected]] logpath = /var/log/maillog bantime = 604800 maxretry = 3 [wordpress] enabled = true filter = wordpress action = bsd-ipfw[table=53] # sendmail[name=wordpress, [email protected]] logpath = /var/log/auth.log
4. Правим /usr/local/etc/fail2ban/action.d/bsd-ipfw.conf
[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
touch /usr/local/etc/fail2ban/filter.d/wordpress.conf
[INCLUDES] # before = common.conf # [Definition] # _daemon = wordpress # failregex = ^%(__prefix_line)sAuthentication failure for .* from $ # ignoreregex =
6. Правим /etc/rc.firewall
#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
touch dns.sh
#!/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