Przeciwdziałanie wirusom w sieci LAN
Stronę dedykuję tym, którzy ostanimi czasy dostają komunikat podczas wysyłania poczty np. z konta na wp.pl:
Odpowiedź serwera: 550 [IP:x.x.x.x] Twoj adres IP znajduje sie na publicznej czarnej liscie CBL - zobacz strone http://cbl.abuseat.org/lookup.cgi?ip=x.x.x.x oraz http://profil.wp.pl/polityka_antyspamowa.html / your IP address is blacklisted - see http://cbl.abuseat.org/lookup.cgi?ip=x.x.x.x and http://profil.wp.pl/bulk_email_policy.html
Według tych instrukcji należy odwirusować własne sieci i zabezpieczyć je. Stanowczo odradzam zawracanie gitary maintainerom listy CBL, bo i tak nic nie wskóracie
Te wszystkie fajne nowoczesne wirusy mają własne silniki do rozsyłania się, rozsyłania spamu, skanowania portów innych kompów oraz inne ciekawe rzeczy np. DDOSowanie.
Jest to to bardzo trudne aby utrzymać wszystkie komputery w sieci LAN czyste (pomijając fakt, że niektóre wirusy trzeba rozpakować z zipa podając hasło - a to już musi zrobić blondynka).
Ale jest pewien sposób: dzięki regułkom iptables można znacznie ograniczyć rozprzestrzenianie się wirusów poza sieć LAN, oraz w miarę szybko wykrywać zawirusowanie któregoś z kompów. Poniżej podaję kawałek mojego skryptu budującego firewalla.
$pub to nazwa interfacju zewnetrznego (eth0,eth1,ppp...)
zmienne *_DENY_FORWARD zawierają listę portów, ktore wypadałoby blokować - należy zaglądać na strony antywirusowe i uaktualniać je.
SMTP_SERVERS="tu podajemy IP serwerow SMTP rozdzielone spacjami, używanych przez userów np. poczta.onet.pl, mail.lemat.priv.pl"
TCP_DENY_FORWARD="135:139 445 1080 3127 3128 6588 8080 194 529 994 6665:6669 3531 2745 1025 6129 17300 901"
UDP_DENY_FORWARD="135:139 445"iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
for port in ${TCP_DENY_FORWARD} ; do
iptables -A FORWARD -p tcp -o ${pub} --dport ${port} -j DROP
done
for port in ${UDP_DENY_FORWARD} ; do
iptables -A FORWARD -p udp -o ${pub} --dport ${port} -j DROP
done# zakladamy lancuch do logowania poczty wychodzacej
iptables -N ESEMTEPE 2> /dev/null
iptables -F ESEMTEPEiptables -A FORWARD -p tcp -s ${net} -o ${pub} --dport 25 -j ESEMTEPE
iptables -A ESEMTEPE -m limit --limit 12/minute --limit-burst 12 -j LOG --log-level info --log-prefix "smtp "
for adr in ${SMTP_SERVERS} ; do
iptables -A ESEMTEPE -d ${adr} -m limit --limit 2/minute --limit-burst 2 -j ACCEPT
done
iptables -A ESEMTEPE -j DROP
Jak widać na załączonym obrazku, taki skrypt zręcznie wkomponowany w istniejące regułki firewalla na ruterze linuxowym zabrania połączeń z niektórymi portami - tymi portami, które są używane przez wirusy np. jako backdoory.
Dodatkowo robiąc listę serwerów poczty pozwalamy na wysyłanie poczty przez te serwery i ograniczamy rozsyłanie poczty gdzie popadnie.
Dzięki temu oszczędzamy pasmo (!) a dzięki regułce logującej możemy zaobserwować w logach kto w LANie ma zawirusowanego kompa. Siedzimy sobie wygodnie na czterech literach i ze 2 razy dziennie zaglądamy w logi.
Natomiast jeżeli mamy dużo userów i nie mają oni stałej listy serwerów SMTP to można zastosowac trick z modułem recent - podobnie jak w moim artykule opisującym blokowanie skanowania ftp.
modprobe ipt_recent ip_list_tot=32
iptables -A FORWARD -m state --state RELATED, ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp --dport 25 -m recent --name SMTP --seconds 60 --update -j DROP
iptables -A FORWARD -p tcp --dport 25 -m limit --limit 1/second --limit-burst 5 -j LOG --log-level info --log-prefix "smtp "
iptables -A FORWARD -p tcp --dport 25 -m recent --name SMTP --set -j ACCEPT
powyższe regułki ograniczają wysyłanie mejli do jednego na 60s przy czym, jeżeli w trakcie tych 60 sekund będzie znowu próba połączenia się to czas jest liczony od nowa - w ten sposób wirusy będą w stanie nawiązać tylko jedno (pierwsze) połączenie a reszta będzie DROPowana.
Środkowa regułka loguje nam do /var/log/kernel/info wszystkie próby połączenia do serwerów SMTP. Zawartość pliku /proc/net/ipt_recent/SMTP powie nam, który komp w sieci LAN prawdopodobnie jest zarażony.
Często tu zaglądają ludzie, co to postawili już ruter/NAT i nagle urodzili się z ręką w nocniku - po kilku dniach spokoju ktoś z ich sieci załapał wirusa, który teraz się rozsyła. Gorzej - dzwoni do nich Tepsa, mówiąc, że jak nie przestanie (on) wysyłać wirusów to mu odetną łącze (zgodnie z regulaminem - tak te małe literki co to się podpisywało pod nimi) ;)
Jak wykryć wirusa we własnej sieci mając dostęp (administracyjny) do rutera?:
iptables -I FORWARD -p tcp --dport 25 --syn -m limit --limit 1/second --limit-burst 5 -j LOG --log-level info --log-prefix "smtp "
następnie należy się wygodnie rozsiąść i obserwować logi. Interesuje nas źródłowy IP - ten pochodzący z naszej sieci. Po namierzeniu gościa:
iptables -I FORWARD -p tcp --dport 25 -s $IP -j DROP
ewentualnie:
iptables -I FORWARD -s $IP -j DROP
w tym drugim przypadku za ~5 sekund będziemy mieć go na linii ;)
Ważna uwaga (by Jacek Zapala): użytkownicy mogą używać portu 587 albo połączenia szyfrowanego (port 465) zamiast 25. Oczywiście ich serwery pocztowe muszą to wspierać.
Komentarze:
mam pytanie do którego pliku pisze log?
sterowaniem jakie zdażenie jest logowanie do jakiego pliku zajmuje się syslog lub rsyslog
domyślnie (zależnie od dystrybucji) będzie to syslog, messages lub kern.log
Czy aby to działało w obecnej epoce używania portu 587 wystarczy powielić linie od 3 do 5 i zmienić w nich port z 25 na 587 czy więcej czarów tak jak to opisywałeś w przypadku postfixa?
Pozdrawiam i proszę o jakąś poradę dla linuksiarza lamera