Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Ostatnio zacząłem poznawać fail2bana i natknąłem na mały problem, przy przeglądaniu różnego rodzaju filtrów i chęci zastosowania jednego z nich natrafiłem na mały problem..
Jak coś to w jail.local, oraz w filter.d/ wszystko poprawnie założone jest, tylko wydaje mi się że coś może być nie tak z filtrem.
[Definition] failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*/(cgi-bin|admin|Admin|sql|mail|phpmyadmin|file:|php|pma|web|PMA|PMA2006|pma2006|sqlmanager|mysqlmanager|PMA2005|phpmyadmin-old|phpmyadminold|pma2005|phpmanager|mysql|myadmin|webadmin|sqlweb|websql|webdb|mysqladmin|mysql-admin|phpmyadmin2|phpMyAdmin2|phpMyAdmin-2|php-my-admin|cms|clan|site|seite|page|forum|wbb2|board|wbb|archive|forumv2|forumv1|b0ard|f0rum|wbb1|wbb3|wbblite|directforum|board23|board2|board3|WBB|WBB2|html|phpkit|page|phpkit_1.6.1|clan|myadmin|webadmin|sqlweb|websql|webdb|mysqladmin|mysql-admin|phpmyadmin2|php-my-admin|phpMyAdmin-2.2.3|phpMyAdmin-2.2.6|phpMyAdmin-2.5.1|phpMyAdmin-2.5.4|phpMyAdmin-2.5.6|phpMyAdmin-2.6.0|phpMyAdmin-2.6.0-pl1|phpMyAdmin-2.6.2-rc1|phpMyAdmin-2.6.3|phpMyAdmin-2.6.3-pl1|phpMyAdmin-2.6.3-rc1|padmin|datenbank|database|horde|horde2|horde3|horde-3.0.9|Horde|README|horde-3.0.9|adserver|phpAdsNew|phpadsnew|phpads|Ads|ads|xmlrpc|xmlsrv|blog|drupal|community|blogs|blogtest|appserver|roundcube|rc|mail|mail2|roundcubemail|rms|webmail2|webmail|wm|bin|roundcubemail-0.1|roundcubemail-0.2|roundcube-0.1|roundcube-0.2|roun|cube|wp-login.php|ucp.php|\.asp|\.dll|\.exe|\.pl) ignoreregex =
próbowałem prostszych wersji tj.
failregex = [[]client <HOST>[]] File does not exist: .*admin|phpmyadmin|Admin
ale nic nie pomaga.
PS: Fail2ban można bez problemu zrestartować.
wynik logu fail2ban.log
2014-06-01 16:59:04,046 fail2ban.jail : INFO Creating new jail 'apache-myadmin' 2014-06-01 16:59:04,048 fail2ban.jail : INFO Jail 'apache-myadmin' uses Gamin 2014-06-01 16:59:04,058 fail2ban.filter : INFO Added logfile = /var/log/apache2/error.log 2014-06-01 16:59:04,151 fail2ban.filter : ERROR No 'host' group in 'ignoreregex =' 2014-06-01 16:59:04,476 fail2ban.jail : INFO Jail 'apache-myadmin' started
wynik fail-regexa:
[root@bbb-server][log]# fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-myadmin.conf Running tests ============= Use regex file : /etc/fail2ban/filter.d/apache-myadmin.conf Use log file : /var/log/apache2/error.log No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' Cannot remove regular expression. Index 0 is not valid No 'host' group in 'ignoreregex =' ... ...
Ostatnio edytowany przez sqrtek (2014-06-01 22:59:47)
Offline
Fitrowanie do Admina|PhpMyAdmina zrób lepiej na serwerze WWW, możesz pochować te usługi pod innymi nazwami, w innych lokalizacjach, natomiast pod szukanymi przez booty typowymi nazwami daj coś w rodzaju pułapki, żeby wchodząc na taki adres automatycznie pacjent lądował na czarnej liście w ipsecie.
Najprościej z resztą zrobić logi na socket czy kolejkę fifo, i naskrobać własnego skrypta, aniżeli certolić się z falilbanem.
Będzie szybciej i prościej. ;)
Jako inspiracji radzę użyć httpd-guardian:
http://www.commandlineisking.com/2009/05/rate-limiting-and-dos-protection-in-mod.html
Albo:
http://www.chaotic.org/guardian/
Względnie tego skrypta:
http://www.debian.pl/entries/30-Implementacja-systemu-aktywnego-przeciwdzia%C5%82ania-intruzom-%28IPS%29-w-Pythonie-cz.-1
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-06-01 17:25:41)
Offline
[quote=Jacekalex]http://www.chaotic.org/guardian/[/quote]
Patrząc na ten skrypt to wydaje się on troche prymitywny ale przynajmniej prosty w zrozumieniu.
/sbin/iptables -I INPUT -s $source -i $interface -j DROP
Choć równie dobrze możnaby napisać skrypt który przeszukiwałby plik error.log, i ewentualnych sprawców blokować w /etc/hosts.deny. To chyba nie ma za dużej różnicy czy zablokuje kogoś za pomocą iptables czy hosts.deny, choć taką metodę działania ma chyba program portsentry który blokuje w hosts.deny.
PS: Ale i tak mnie ciekawi czemu nie chce mi się to uruchomić ten filtr z Fail2bana.. wiele ludzi tworzy te filtry w takiej postaci i to działa :/ nie wiem czemu u mnie to się nie uruchamia.. :/
Ostatnio edytowany przez sqrtek (2014-06-01 18:23:31)
Offline
Najprostszy przykład ipsa do serwera www:
ipset create dupa hash:net cat /var/log/lighttpd/access.log | grep -i admin | gawk '{print "add dupa " $1}' | ipset restore --exist
Czy weszło:
ipset list dupa Name: dupa Type: hash:net Revision: 2 Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16768 References: 0 Members: 127.0.0.1
Użycie ipseta?
np:
iptables -t raw -I PREROUTING -p tcp -m set --match-set dupa src -j DROP
Oczywiście przy działającym serwerze lepiej logi zbierać na jakimś sockecie (np /dev/ips jak tam wyżej w sznurku), zamiast parsować pliki logów, to jest dużo szybsze, jeśli się napisze skrypta działającego w trybie demona, który będzie wisiał na tym sockecie, czesał adresy IP regexem, i pakował jest w trybie natychmiastowym do ipseta.
Przeważnie taki skrypcio z wiązką regexów powinien się zmieścić w 30 linijkach perla, żadna magia.
Ostatnio edytowany przez Jacekalex (2014-06-01 18:33:01)
Offline
Dzięki za odpowiedź, szczerze to pierwszy raz słyszę o czymś takim jak ipset i będę musiał się z tym zaprzyjaźnić bliżej :D .
A co do fail2bana, to udało mi się stworzyć odpowiednie wyrażenie regularne aby filtr działał jak powinien.
Offline
Ipset ma też opcję timeout, która do każdego IP przypisuje okres "przydatności do użycia":
ipset create dupa hash:ip timeout 300 echo add dupa 88.212.57.151 | ipset restore -exist echo add dupa 151.132.17.121 timeout 1800 | ipset restore -exist
Rezultat:
ipset list dupa Name: dupa Type: hash:ip Revision: 0 Header: family inet hashsize 1024 maxelem 65536 timeout 300 Size in memory: 16640 References: 0 Members: 88.212.57.151 timeout 262 151.132.17.121 timeout 1795
Krótko pisząc, w porównaniu z guardian.pl potrzeba tylko połowę tamtego skrypta.
Timeout zapobiegnie przepełnieniu tablicy przy dużej liczbie bootów.
Do tego możesz dodawać adresy do tabeli Ipseta bezpośrednio poprzez regułki firewalla:
iptables -j SET --help ..... SET target options: --add-set name flags [--exist] [--timeout n] --del-set name flags add/del src/dst IP/port from/to named sets, where flags are the comma separated list of 'src' and 'dst' specifications.
Razem masz dynamiczny FW z morderczą skutecznością.
Przy okazji dużo łatwiej się go obsługuje, niż zabawy z failbanem.
Najskuteczniej możesz użyć wysyłania logów na kolejkę fifo:
mkfifo /dev/apachelog chown root:apache /dev/apachelog chmod 620 /dev/apachelog
Ptem kierujesz logi Apacha (kopię) na [b]|/dev/apachelog[/b], tam czeka skrypcik choćby tylko z grepem i awk, (choć napisany w perlu chodziłby szybciej), który pakuje adresy do ipseta.
Razem bardzo grzeczna, skuteczna i szybka w działaniu konstrukcja. :D
Jeśli do tego regułka iptables z dopasowaniem tablicą ipseta, będzie ponownie kierowała celem SET do tej samej tablicy, to pacjent po każdej próbie będzie miał odnowiony timeotut aż do emerytury :D
W porównaniu z taką konstrukcją Failban to lekka strata czasu.
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-06-02 08:53:42)
Offline
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00105 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.136.26.156' WHERE u.id=1 |
0.00066 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.136.26.156', 1732830682) |
0.00039 | SELECT * FROM punbb_online WHERE logged<1732830382 |
0.00074 | DELETE FROM punbb_online WHERE ident='85.208.96.199' |
0.00050 | SELECT topic_id FROM punbb_posts WHERE id=268833 |
0.00009 | SELECT id FROM punbb_posts WHERE topic_id=25919 ORDER BY posted |
0.00056 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=25919 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00156 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=25919 ORDER BY p.id LIMIT 0,25 |
0.00084 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=25919 |
Total query time: 0.00661 s |