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/.
Czy są jakieś gotowe narzędzia, które mogą posłużyć do automatycznego banowania maszyn nawiązujących nowe połączenia z określonym kompem w sieci?
Póki co mi wpadł do głowy taki pomysł:
W konfiguracji rsysloga ustawić taką linijkę:
:msg,contains,"IPTABLES:" /var/log/iptables & stop
ona przekieruje wszystkie komunikaty zawierające IPTABLES: do oddzielnego pliku.
Na iptables ustawiłem sobie standardowy fw dla klientów i dodatkowo:
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j tcp iptables -t filter -A tcp -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -m limit --limit 30/m --limit-burst 10 -j LOG --log-level 4 --log-prefix "* IPTABLES: TCP_NEW * "
Te połączenia i tak będą zrzucane przez iptables tyle, że zostaną zalogowane.
Log wygląda jak poniżej:
Jun 6 07:40:15 morfikownia kernel: [ 6084.887465] * IPTABLES: TCP_NEW * IN=eth1 OUT= MAC=01:28:c4:39:24:b1:00:17:10:03:14:51:08:00 SRC=177.41.229.229 DST=172.163.24.91 LEN=52 TOS=0x00 PREC=0x00 TTL=50 ID=44147 DF PROTO=TCP SPT=39768 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0
mac i ip zmieniono.
Chodzi o to by wydobyć adres źródłowy z tego logu w oparciu o czas, np 3 zalogowane komunikaty w czasie 10min z tego samego ip, i ten adres dopisać do blacklisty ipseta + zapisanie go do pliku. W późniejszym czasie przy starcie systemu ta lista by była automatycznie ładowana z pliku. Dodatkowo ten skrypt miałby za zadanie porównać ip z logu pod kątem obecności na liście ipseta i jeśli brakuje, to by został dodany.
Sam ip set nie sprawi problemu ale ja niezbyt się czuje jeszcze na siłach by napisać pozostałą część skryptu.
Druga sprawa to jest podgląd tego co się odbywa na zaporze. Wiem, że można to zrobić przez kolejkę fifo, bo mam takie coś już zaimplementowane, tylko chodzi o to, że chciałbym sobie rozgraniczyć logi zawierające IPTABLES i przekierować je do, ja wiem, /dev/fw dajmy na to.
Ogólnie za te moje logi na pulpicie odpowiada poniższa linijka:
*.*;auth,daemon,kern,user -/dev/logi
Ale jak przesłać w taki sposób komunikaty zawierające IPTABLES: ?
To ma być swego rodzaju pułapka zastawiana w czasie kompletnego bezruchu sieciowego, która ma na celu wyłapać ludzi dobijających się do danej maszyny. Chyba, że istnieją inne lepsze sposoby na ogarnięcie tego problemu. W każdym razie podgląd logów przez /dev/fw bardzo by mi się przydał.
I jeszcze taka sprawa, jeśli na iptables tworzy się nowy łańcuch jak powyżej, to trzeba definiować te parametry dla reguł w tym łańcuchu, na podstawie których sam łańcuch został stworzony, czy można zwyczajnie pominąć połowę linijki?
Offline
Jeśli iptables ma banować coś, co zalogował sam iptables, to w ogóle nie potrzebujesz sysloga do tego interesu.
Tworzysz tablicę Ipseta, a potem:
iptables -I {tablica} {dopasowanie} -j SET {opcje_ipseta}
Sockety, Syslogi, i podobne ustrojstwa są dla usług demonów sieciowych (np Proftpd, Dovecot, Apache) i systemów IPS, jak Snort.
Ostatnio edytowany przez Jacekalex (2014-06-06 08:57:46)
Offline
Ok, chyba zrobiłem, choć nie wiem czy to jest choć w połowie profesjonalne ale efekt jest zamierzony. xD
Stworzony set:
ipset create autoban hash:net family inet maxelem 1000
Połączyłem ten -j SET z -m recent:
iptables -t filter -A tcp -m recent --set --name autoban iptables -t filter -A tcp -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -m recent --update --seconds 3600 --name autoban --hitcount 1 -j SET --add-set autoban src
+ logowanie
iptables -t filter -A tcp -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -m limit --limit 30/m --limit-burst 10 -j LOG --log-level 4 --log-prefix "* IPTABLES: TCP_NEW *
No i filtorwanie w oparciu o adresy ip dodane wyżej:
iptables -t raw -A PREROUTING -p all -m set --match-set autoban src -j DROP
Te wartości 1 połączenie na 1h są w celach testowych, ale jak sprawdzam:
# ipset list autoban Name: autoban Type: hash:net Revision: 4 Header: family inet hashsize 1024 maxelem 1000 Size in memory: 16888 References: 2 Members: 116.10.191.223 116.10.191.186 66.240.236.119
Adresy IP wpadają do listy ipseta, no i pierwszy log jest zapisywany w celach informacyjnych, że dany ip próbował się połączyć. Potem połączenia są blokowane w tablicy raw przy kolejnych próbach ale logu już nie wyrzuca. Czyli mógłbym sobie zapuścić to podczas bezruchu sieciowego i wyłapać wrednych ludzi, a potem ładować normlanie listę do ipseta z pliku. To tak ma wyglądać ta blokada?
Tylko taka sprawa, te listę trzeba manualnie zapisywać do pliku, czy jest jakaś opcja by to iptables/ipset z automatu zrobił?
Offline
Jest opcja zrzucania listy Ipseta do pliku, poszukaj w manie, chociaż moim zdaniem nie ma to większego sensu, poza robieniem gigantycznej listy, która zawsze trochę przymuli.
Lepiej pakować do Ipseta pacjentów z opcją timeout np 3600, wtedy wszelkie próby skanowania dostaną bana na godzinę,
a tablica Ipseta będzie miała zawsze w miarę rozsądną wielkość.
Potem jeszcze regułka odnawiająca bana w typie
iptables -t raw -I INPUT -m set --set --match-set dupa src -j SET --add-set dupa src --timeout 3600
Działa to wtedy podobnie do hashlimita, ale jest dużo elastyczniejsze w zastosowaniu, można np wywołaniem na port 22,23,113,445,1443 zaopatrzyć pacjenta w bana na cały albo dużo większy zakres portów. :D
W ten sposób klasycznych bootów nie zobaczysz nawet przez 200 lat. :D
EDIT:
[quote="ipset --help"]....
save [SETNAME]
Save the named set or all sets to stdout
restore
Restore a saved state
....[/quote]
Praktycznie tak samo, jak w iptables. ;)
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-06-06 10:21:19)
Offline
Póki co tylko 5 adresów wpadło, w porównaniu do tych list bt_level1 gdzie tam ich jest 250k czy coś, to nie jest dużo. xD
Pomonitoruję to sobie przez parę dni i zobaczę jak to będzie wyglądać, potem zaimplementuje zwykłego tempbana na godzinę przez -m recent tak jak jest wyżej tylko bez -j SET i jak ktoś będzie chciał wbić do mojej maszyny bez zezwolenia to będzie mu się ten ban ciągle przedłużał o następną godzinę. xD
Jeśli się to faktycznie będzie dość poważnie rozrastać to popatrzę na ten --timeout . Póki co, wszystko co zostanie złapane w przeciągu paru następnych dni dostanie dożywotniego bana. xD
Co do zrzucania listy, to jest
# ipset save autoban create autoban hash:net family inet hashsize 1024 maxelem 1000 add autoban 116.10.191.223 add autoban 116.10.191.186 add autoban 222.136.81.56 add autoban 66.240.236.119 add autoban 58.215.43.234
Tylko nie widzę nigdzie by to się robiło np. co 30min i to raczej trzeba załatwić zewnętrznym skryptem + cron ale to nie problem.
Offline
Jeśli się to faktycznie będzie dość poważnie rozrastać to popatrzę na ten --timeout . Póki co, wszystko co zostanie złapane w przeciągu paru następnych dni dostanie dożywotniego bana. xD[/quote]
Troszkę infantylne spojrzenie na rzeczywistość widzę w tym cytacie.
Np:Kod:
add autoban 116.10.191.223 add autoban 116.10.191.186Dwa sąsiednie kompy z jednej sieci.
Pewnie jeden dostał trojana z jakiejś sieci bootnetów, po czym zaraził drugiego, albo na obu ktoś instalował jakiś program z takiej samej instalki z trojanem.
Za kilka tygodni pewnie będzie albo aktualizacja antywira, albo reinstalacja, czy najszybsza naprawa Windy w warunkach domowych (przy pomocy format_C), i te adresy się zdezaktualizują.
W dodatku 95% użytkowników internetu w tym kraju ma adresy publiczne przyznawane dynamicznie na czas sesji, a te mogą się zmieniać nawet co godzinę.
Dlatego listę ipseta warto tworzyć, jeśli masz np tablicęKod:
bitmap:ip,macw której pisze, kogo wpuszczać.
Ale zapisywanie banowanych adresów IP do pliku ma znacznie mniej sensu, niż się pozornie wydaje.
Sens takiego zapisywania pojawi się prawdopodobnie dopiero przy IPv6, ale wtedy do takiej listy będziesz chyba potrzebował osobny dysk. xD
O wiele skuteczniej blokować NEW i INVALID, wpuszczać REALTED i ESTABHISHED, a jak coś wystawiasz na otwartym porcie, to tam hashlimit i ipset.Ostatnio edytowany przez Jacekalex (2014-06-06 11:07:13)
W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem para bellum ;) | Pozdrawiam :)
Offline
No może faktycznie lepiej jest pokonbinować coś z tym banem na godzinę czy cuś. Jeszcze sobie obadam tego bitmap:ip,mac .
Ja sobie tak patrzę, to już 7 adresów z tej sieci się próbowało wbić. Może tam wszyscy jadą na winxp? xD
Ostatnio edytowany przez morfik (2014-06-06 11:23:41)
Offline
[b]bitmap:ip,mac[/b] Ci się raczej nie przyda, to się stosuje w sieciach LAN, do prostego i szybkiego filtrowania IP/MAC na routerze,
bez zabawy w PPPOE czy inną autoryzację.
W dodatku te adresy, to nie jest koniecznie XP, jak myślisz,
że Seven nie łapie syfu, to możesz sobie myśleć dalej. xD
Ostatnio edytowany przez Jacekalex (2014-06-06 11:38:16)
Offline
A nie można by tego użyć na sieci 116.10.191.0/24 i zobczyć czy się im te ip zmieniają? xD No bo jeśli by się pojawił drugi mac przy tym samym ip, to ip się zmieniło komuś tam ale jak ciągle by mi próbowali na 22 port wbić z tej samej pary, to raczej można by bez problemu go zablokować. Czy się mylę?
Offline
iptables -t raw -I PREROUTING -p tcp --dport 22 -j SET --add-set dupa src --timeout 86400
i nie ma co kombinować więcej.
Masz pojęcie, ile klas adresowych ma np Neozdrada, albo jakiś inny duży operator?
Będziesz te wszystkie sieci operatorskie rożnych ISP z całego świata dodawał do konfiga?
Bo mam 99,9% pewności, że po dłuższym czasie w takim konfigu będziesz miał zaledwie 7 całych kontynentów. xD
Względnie możesz się pobawić Denyhostem, jak pojęcia "polityka domyślna firewalla" nie ogarniasz. xD
PS:
Kilka minut działania seta z regułką powyżej:
89.46.101.137 timeout 86333 116.10.191.168 timeout 86145
Ta sieć 116.10.191.0/24 jest dosyć pracowita...
xD
Ostatnio edytowany przez Jacekalex (2014-06-08 15:28:08)
Offline
Spróbowałem sobie zrobić taki testowy autoban w oparciu o ten timeout ale coś mi nie odświeża czasów w secie.
Przykładowo, chciałbym aby wszystko co mi pingnie maszynę (pingi ze stanem NEW) dostało bana na godzinę i nie tylko na pingi ale na jakąkolwiek komunikację z moim pc. Zrobiłem mniej więcej coś takiego:
iptables -t filter -A INPUT -p icmp -j icmp_in iptables -t filter -A icmp_in -p icmp -m conntrack --ctstate NEW -j LOG --log-prefix "* IPTABLES: ICMP_NEW * " iptables -t filter -A icmp_in -p icmp -m conntrack --ctstate NEW -j SET --add-set autoban src --timeout 3600 iptables -t filter -A icmp_in -p icmp -m icmp --icmp-type echo-request -m conntrack --ctstate NEW -j DROP -m comment --comment "echo-request" iptables -t raw -A PREROUTING -m set --match-set autoban src -j DROP
I to generalnie robi co trzeba ale nie mogłem w żaden sposób odnowić czasu bana. Nawet jak spróbowałem dodać przed tą ostatnią regułą czegoś na wzór:
iptables -t raw -A PREROUTING -m set --match-set autoban src -j SET --add-set autoban src --timeout 3600
Pakiet przechodzi przez nią ale nie odświeża licznika. Coś tu trzeba dodatkowego jeszcze zrobić?
Offline
U mnie przy teście grzecznie odświeżał licznik, także nie wiem, co u ciebie nie bangla, może coś przekombinowałeś?
EDIT:
mała poprawka:
iptables -S -t raw | grep autoban -A PREROUTING -m set --match-set autoban src -j SET --add-set autoban src --exist --timeout 7200 -A PREROUTING -p tcp -m multiport --dports 22,113,445,1433,1512,2175,2176,3306,5432 -j SET --add-set autoban src --timeout 3600
echo dupa | nc box 22 # G1 ### nie cze 08 14:38:51 localhost : ~ root ~> ipset list autoban Name: autoban Type: hash:net Revision: 2 Header: family inet hashsize 1024 maxelem 65536 timeout 3600 Size in memory: 16832 References: 3 Members: 127.0.0.1 timeout 3390 # G1 ### nie cze 08 14:38:58 localhost : ~ root ~> echo dupa | nc box 22 box [127.0.0.1] 22 (ssh) : Connection refused # G1 ### nie cze 08 14:39:04 localhost : ~ root ~> ipset list autoban Name: autoban Type: hash:net Revision: 2 Header: family inet hashsize 1024 maxelem 65536 timeout 3600 Size in memory: 16832 References: 3 Members: 127.0.0.1 timeout 7198
SOA#1
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2014-06-08 15:15:08)
Offline
U mnie też działa, nawet grzecznie ;)
iptables -S -t raw | grep wypad -A PREROUTING -m set --match-set wypad src -j SET --add-set wypad src --exist --timeout 86400 -A PREROUTING ! -i lo -p tcp -m multiport --dports 22,113,445,1433,1512,2175,2176,3306,5432 -j SET --add-set wypad src --timeout 3600 -A PREROUTING -m set --match-set wypad src -j DROP
ipset list wypad Name: wypad Type: hash:net Revision: 2 Header: family inet hashsize 1024 maxelem 65536 timeout 3600 Size in memory: 18848 References: 4 Members: 185.30.166.35 timeout 85983 62.231.75.133 timeout 81888 93.120.27.62 timeout 1105 117.41.235.15 timeout 119 124.248.195.227 timeout 3113 61.158.162.161 timeout 539 193.219.128.49 timeout 84425 37.48.83.75 timeout 83449 78.40.125.4 timeout 80618 149.156.124.222 timeout 80185
Byle tylko Nftables nie popieprzyli za bardzo, szkoda byłoby takiej eleganckiej zabawki, jak ipset timeout. :D
Ostatnio edytowany przez Jacekalex (2014-06-09 03:51:11)
Offline
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00090 | 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.23.103.216' WHERE u.id=1 |
0.00071 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.23.103.216', 1733046163) |
0.00043 | SELECT * FROM punbb_online WHERE logged<1733045863 |
0.00066 | SELECT topic_id FROM punbb_posts WHERE id=269264 |
0.00133 | SELECT id FROM punbb_posts WHERE topic_id=25944 ORDER BY posted |
0.00078 | 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=25944 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00098 | 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=25944 ORDER BY p.id LIMIT 0,25 |
0.00107 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=25944 |
Total query time: 0.00704 s |