Bráníme se útokům

28. dubna 2022

Útoky na weby nejsou nic nového. V minulém článku jsem popsal, jak najít útočníka a jak ho zablokovat. Teď se podíváme na to, co všechno se dá ještě udělat.

Minulý týden jsem řešil jeden takový útok, v podstatě DDoS, ale asi bych to tak úplně DDoS nenazval. Prostě se někdo rozhodl, že zneprovozní stránky jednoho nejmenovanéo letiště. Když shrnu parametry útoku, tak se nejednalo o nic děsivého. Útok byl veden z cca 1500 IP a ve špičce šlo o dva miliony přístupů během deseti minut a všechny požadavky byly směřovány přímo na homepage. Myslím, že neporuším GDPR zveřejněním 40 IP s největším množstvím požadavků ze kterých útok šel včetně počtu přístupů:

# bzcat 20.bz2 | awk '{print $2}' | sort | uniq -c | sort -n | tail -n 40
9289 185.255.47.59
9291 37.210.75.39
9291 77.238.79.111
9438 103.19.130.50
9556 190.14.232.167
9745 191.242.230.135
9788 197.232.82.243
10046 81.163.57.147
10223 185.12.69.174
10229 131.100.51.8
10270 192.162.192.148
10586 201.150.51.30
10587 103.159.200.3
10688 140.238.19.26
10727 186.0.176.147
11177 179.1.82.21
11523 181.65.241.164
11779 107.178.9.186
12045 5.160.91.130
12059 203.217.169.100
12310 88.255.102.120
12488 69.75.172.54
12525 200.39.136.134
12617 187.115.10.50
12874 177.93.38.238
13059 45.227.72.50
13772 194.44.104.242
14073 201.217.246.178
15299 110.164.126.166
15953 202.43.190.10
16315 201.157.254.26
16945 179.106.86.3
17129 181.49.23.78
18695 69.163.252.140
19065 51.254.228.133
33549 62.171.167.176
36069 121.156.109.108
45478 135.181.161.249
79496 59.124.224.205
105325 102.130.77.201

Jak jsem už psal minule, tohle je velmi snadno řešitelné. Můžeme vzít a zablokovat všechny IP, ze kterých jdou tisíce požadavků a rovnou je např. přidat do blackhole. Protože mám pořád ten stejný CustomLog formát, tak v prvním sloupci mám název domény, ve druhém IP. Řekněme, že normální uživatel nevytvoří víc jak 2000 požadavků procházením stránek. Takže použijeme awk a pokud se náš log bude jmenovat access.log, tak pak příkaz bude vypadat takhle:

cat access.log | awk '{print $2}' | sort | uniq -c | sort -n | awk '$1 > 2000 {print $2}'

No a ty IP rovnou přidáme do blackhole routingu:

cat access.log | awk '{print $2}' | sort | uniq -c | sort -n | awk '$1 > 2000 {print $2}' | xargs -n1 ip route add blackhole

Tím jsme dosáhli toho, že pro útočící stroje se náš stroj jeví jako nedostupný. Hurá, dosaženo cíle útoku. Jenže botnety takhle nefungují. Zastavíte 20 IP a přibude dalších 40.

Samozřejmě, že můžeme dát předchozí příkaz do cronu po minutě a neustále procházet logy, ale ony nám na Apache serveru zůstávají navázány stovky spojení a jejich IP se do logu zapíší, až se požadavek vyřídí. Protože se jedná o WordPress, tak vygenerování každé stránky znamená nějakou režii. Takže co s tím? Protože jde útok jenom na homepage, tak jsem před stránky toho letiště přidal proxy server postavený na OpenLiteSpeed. Protože ho mám na jiném serveru, přesměroval jsem DNS záznamy pro letiště na tu proxy a nastavil to podle článku.

Doplnil jsem k virtual host pro to letiště modul Cache a v konfiguraci serveru jsem omezil počet současných spojení z konkrétní IP.

Prohlédněte si dokumentaci.

Další možností, kterou OpenLiteSpeed nabízí je ReCaptcha. Sice to obtěžuje, ale máte jistotu že přístup dělá člověk.

Každopádně cache server si ze zbytkem útoku poradil bez problémů. Prakticky veškerý obsah šel z cache a ten zbytek už původní Apache web server zvládl.

Pokud by se jednalo o sofistikovanější útok, např. na vyhledávání ve WordPress generováním náhodných řetězců pro hledaný výraz, tak by nám cache moc nepomohla. Naštěstí většina cenově dostupných botnetů tohle neumí.

 

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *