DoS támadások ellen védekezés

Fórumok

DoS támadások ellen védekezés

Hozzászólások

Ezt fölösleges beírni, de mindegy.
Tehát végül arra jutottam, hogy a legjobb megoldás az (legalábbis nekem, de ezen persze lehet vitatkozni...), hogy ha DoS-t észlelek (telik a LOG/sok kapcsolat megy felém/stb), akkor a gépet lekapcsolom a netről/csak 1 szolgáltatást engedek, de azt is csak bizonyos helyekről.
(pl csak ssh, és 22 helyett 2222-es portról, az x.x.x.x/24 tartományból)
Ezt persze lehet még finomítani...

Hát az elosztott DoS ellen tényleg nem véd az iplimit, de amikor egy gépről szimultán érkezik sok csomag, az ellen tökéletesen. Elosztott elllen meg ott a sima limit: mondjuk 8000/min, vagy akármi. Egy nagy portál akár 10.000 kérést is kiszolgálhat percenként. A saját géped terheltségétől függően állítsd be a számokat.

Azt hiszem meg lehetne nézni az iptables limit "burst" kapcsolóját is; ez még csökkenti a logolást... (ha már utalt rá vki akkor bocs) :)

[quote:b39bad83b2="szgabor"]Azt hiszem meg lehetne nézni az iptables limit "burst" kapcsolóját is; ez még csökkenti a logolást... (ha már utalt rá vki akkor bocs) :)

Csak linkben volt benne :)

-m limit --limit 3/min --limit-burst 8 -j ACCEPT

ezt icmp echo-ra próbáltam ki

működése az volt, hogy az első 8-at elfogadta, utána meg már csak 20 mp-enként egyet (folyamatos ping mellett), így percenként csak 3-at engedett.

Egyvalamit nem láttam még: a -m limit az teljesen jó, de ha csak a logot akarod kímélni, akkor pl érdemes a limitet és a -J LOG-ot együtt használni.

Ha nem terminális targettel használod a limitet, akkor is műxik, de a fennti kombó pl. csak a logbejegyzéseket limitálja:
[code:1:7f9f00eeae]
iptables -A INPUT -p tcp --dport 80 --syn -m limit --limit 3/min --limit-burst 10 -J LOG --log-prefix "Syn -> [HTTP]: "
[...]
iptables -A INPUT -p tcp --dport 80 -J ACCEPT
[/code:1:7f9f00eeae]

Ez pl. beír tizet, ebből látszik hogy valami sügér ráfeküdt az F5-re, aztán csak 20 s- ként egyet, ettől függetlenül az összes csomag bejön, és a szerver kezeli őket "ha akarja az apacs majd letiltja" alapon.

Üdv mindenkinek!

Tehát a kérdés/probléma az lenne, hogy van egy rendszerem (Debina sid), és ez serverként is üzemel, és emiatt annak rendje és módja szerint LOG-olok mindent (apache,postfix,ssh,.. és iptables). A gondom az, hogy már részese voltam (szándékosan) egy olyan támadásnak, ahol arra mentek, hogy a LOG-ot töltsék meg.
(Ez 512MB-s winyójú rendszeren történt, kb 250 MB volt szabad, és ez kb 3-5 óra alatt betellt).
Ez a támadás az iptables SSH-logját érintette csak, tehát ennél komplexebb módon is el lehet követni egy ilyet. A kérdésem: ez ellen hogyan lehetne védekezni?

[quote:0276ed4975="cemaq"]Üdv mindenkinek!

Tehát a kérdés/probléma az lenne, hogy van egy rendszerem (Debina sid), és ez serverként is üzemel, és emiatt annak rendje és módja szerint LOG-olok mindent (apache,postfix,ssh,.. és iptables). A gondom az, hogy már részese voltam (szándékosan) egy olyan támadásnak, ahol arra mentek, hogy a LOG-ot töltsék meg.
(Ez 512MB-s winyójú rendszeren történt, kb 250 MB volt szabad, és ez kb 3-5 óra alatt betellt).
Ez a támadás az iptables SSH-logját érintette csak, tehát ennél komplexebb módon is el lehet követni egy ilyet. A kérdésem: ez ellen hogyan lehetne védekezni?

Indulásnak: http://iptables-tutorial.frozentux.net/iptables-tutorial.html
és pl percenként csak 3 csatlakozást engedélyezel:
[code:1:0276ed4975]$IPT -A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -j ACCEPT
$IPT -A input_ext -p tcp -m tcp --dport 22 -j DROP
[/code:1:0276ed4975]

[quote:07978ccee9="cemaq"]Üdv mindenkinek!

Tehát a kérdés/probléma az lenne, hogy van egy rendszerem (Debina sid), és ez serverként is üzemel, és emiatt annak rendje és módja szerint LOG-olok mindent (apache,postfix,ssh,.. és iptables). A gondom az, hogy már részese voltam (szándékosan) egy olyan támadásnak, ahol arra mentek, hogy a LOG-ot töltsék meg.
(Ez 512MB-s winyójú rendszeren történt, kb 250 MB volt szabad, és ez kb 3-5 óra alatt betellt).
Ez a támadás az iptables SSH-logját érintette csak, tehát ennél komplexebb módon is el lehet követni egy ilyet. A kérdésem: ez ellen hogyan lehetne védekezni?

talan ugy kikapcsolod az ostoba logolast es csak azt logolod ami muszaj

Köszi Panther az ötletet, de ha jól látom, akkor ez percenként csak 3 új kapcsolatot enged (IP-től függetlenül). Tehát az a bajom, hogy bizonyos servicek-re (pl apache) ez nemigazán jó (mert lehet egy percben x kérés is akár, de ez folyamatosan már igencsak terhelé a LOG-ot, és ha egy IP-ről jön, akkor egyértelmű, hogy mi.). Tehát nem tud valaki olyat, ami esetleg IP-ket megkülönböztetve csinálja ugyanezt? Bár ekkor a ip spoofing ellen védtelen vagyok, de legalább a támadó nem tud normális kapcsolatot se felépíteni... (Ill annak meg az lenne a baja, hogy sok memóriát fogyaszt, de hátha...)

UI: Ez már kukacoskodás tudom, de hátha van erre is valami "szép" megoldás. Mindezek ellenére Panther megoldása is nagyon jó.

Van így is ötletem, de lehet, hogy programot kell írni rá: QUEUE target, és userspace program kapja meg a csomagokat. Az iptables -j QUEUE -h nem mondott túl sokat.

Használhatóbb:
http://www.davidcoulson.net/writing/lxf/39/iptables.pdf

This adds CONFIG_IP_NF_MATCH_IPLIMIT
match allows you to restrict the number of
parallel TCP connections to a server per client
IP address (or address block).
Examples:
# allow 2 telnet connections per client host
iptables -p tcp --syn --dport 23 -m iplimit --iplimit-above 2 -j REJECT
# you can also match the other way around:
iptables -p tcp --syn --dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT
# limit the nr of parallel http requests to 16 per class C sized
# network (24 bit netmask)
iptables -p tcp --syn --dport 80 -m iplimit --iplimit-above 16 -plimit-mask 24 -j REJECT

[quote:d17072f134="cemaq"]Köszi Panther az ötletet, de ha jól látom, akkor ez percenként csak 3 új kapcsolatot enged (IP-től függetlenül).

Esetleg finomithatod tovabb ugy ezt a megoldast, hogy megfigyeled, h atlagosan hany uj kapcsolat letesul adott szolgaltatas portjara percenkent( { date && netstat -antp | grep :port ;} > service.txt, pl, cronbol percenkent meghivod), es ez alapjan allitod a limitet.

Egész jó téma lesz ebből...
Tehát akkor 2 megjegyzésem lenne:
1: A limit-es megoldás, ha jól gondolom, akkor saját DoS-hoz vezet, azaz azáltal, hogy a DoS-olót tiltom, azáltal magam is kizárom. Ez mondjuk lassú DoS-nál káros főleg.
2: A problémával ekvivalens kérdés: Hogyan lehetne a limit-es megoldást úgy korlátozni, hogy IP-hez illeszkedjen. Lehetséges megoldás: Meg kell nézni a csomag IP-jét, és ha nem láttuk (ismeretlen), akkor csinálunk egy láncot, kb így: [code:1:e811e97f7a]$IPT -A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -s IP -j ACCEPT [/code:1:e811e97f7a]
Ezt egyszerűen meg is lehet csinálni, úgy, hogy a vizsgálatot mindig akkor végezzük, ha a csomi az egyik láncre sem illett, és akkor az új láncot felülre rakjuk. Csak az IP-t hogyan szedem ki? Ennek persze a problámája az, hogy nagyon nagy lesz a listám, és ip spoofing esetén meghalok.

[quote:8e29d715a8="cemaq"]
2: A problémával ekvivalens kérdés: Hogyan lehetne a limit-es megoldást úgy korlátozni, hogy IP-hez illeszkedjen.

-m iplimit kettővel feljebb. Write only voltál!

:oops: Tényleg nem figyeltem, sorry.
Azért köszönök mindent!

Szerkesztés:
Tényleg nem figyeltem, de azért hadd kötekedjek: Ez a restrict the number of parallel TCP connections
De egy IP-ről a egyszerre csak egy kapcsolatot kapok (nem párhozamosan kapcsolódnak.) De azért mégegyszer kösz az infokat.

Nem kifejezetten DoS támadás, de talán ide sorolható leginkább.
Adva van egy apache webszerver, rajta sok virtualhost. Néhány weboldal bizonyos php fájljait rosszindulatú emberek belinkelték a saját oldalukba (nem ezen a szerveren hostolnak). Amikor látogatják az oldalukat, meghivódnak a mi php fájljaink is. Ahogy nő látogatottságuk, egyre többször hivódik meg. Az oldalukon semmi nem látszik, mert img src taggal szúrták be.

IP-t tiltani nem lehet, hiszen a látogatók otthoni gépéről jönnek a kérések.
Írtam egy scriptet ami átnézve a logokat, kiszűri a gyanúsan sokszor előforduló referer oldalakat, igy azokat egy statikus lapra irányitom. Ezzel sok erőforrást nyertem. Legalább a PHP & MySQL nem pörög.
Azonban nagyon sok apache szálat lefoglalnak, hiába emeltem kétszeresére, még mindig koppon jár.
300-ról 600-ra állítottam, magasabbra nem merem, mert ha megváltoztatják a refererként szolgáló fájl nevét, nem veszem észre időben, lerohasztják a szervert. (Képesek voltak már mind a 4 CPU magot 100%-on hajtani....)

Szóval, hogy lehetne tehermentesíteni az apache-ot ezektől a kéretlen kérésektől?
Legjobb lenne iptablessel, de ugye csak a refererrel tudnám megfogni őket, ami ott nem használható:(

Kinek milyen ötlete van?
Előre is köszönöm.

Ilyesmi igen, konkrétan:
A problémás vhostokban már rég ott volt egy ilyen :


RewriteEngine on
RewriteMap emap txt:/etc/apache2/refer.txt
RewriteCond %{HTTP_REFERER} !^-$
RewriteCond ${emap:%{HTTP_REFERER}} ^-$
RewriteCond %{REQUEST_FILENAME} (.*)$
RewriteRule ^(.*)$ http://x.x.x.x/hiba.html [R,L]

Az default vhostba (ip) egy ilyet szúrtam : KeepAliveTimeout 1 (0-val végtelen lett nálam)

Global apache.confban pedig a korábbi 15-ről 5-re vettem. (Az 5 nem túl kevés?)
Az egyidejű kapcsolódások és az apache processzek száma is a harmadára csökkent.

A referer.txt tartalma:
http://csunyadomain.hu -
http://csunyadomain2.hu -

Tehát annyi változtatás történt, hogy a timeout 1 -es vhostba zavarom át a kéretlen kéréseket. Igy nem tartja fent a kapcsolatot, elvéve a többiek elől.

Ezúton is köszönet errotan kollégának a a timeout ötletért:)

A többieknek is köszönöm a segítséget, megnézem a lehetőségeket. Főleg a fastcgi-t tervezem.

Connor, ezzz mekkora ötlet, tényleg! Visszaküldeni a feladónak:)) Gáz, hogy még csak meg sem fordult a fejemben.
Köszönöm!:)

ui. csak aztán nehogy ő is refererből visszaküldje aztán eljátszadozzunk egymással:)
ui2. Tovább gondolva a dolgot, nem a legetikusabb a szolgáltatójával szemben. Egyébként is tetszett viktor1983 javaslata, azt hiszem megfogadom és felkeresem a rendszergazdákat.