Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Ondřej Novák 22. 12. 2014, 23:57:19

Název: Ochrana DB proti přeplnění (web)
Přispěvatel: Ondřej Novák 22. 12. 2014, 23:57:19
Zdravím.

Řeším tu takový menší problém. Mám insert-only databázi - databáze, kam se jen zapisuje a její stav je odrazem všech zápisů a přepisů novými zápisy. Mazání je také zápis informace o tom, že se něco smazalo. Je tedy k dispozici kompletní historie změn.

Jak byste takovou databázi zabezpečili proti třeba DoS útoku založeném na přeplnění databáze prakticky "spamovými" zápisy? Jak případně takový spam řešíte?

Já si dokážu nějaký techniky vymyslet, ale snažil jsem se na google najít nějaké oficiální nebo známé způsoby a doporučení a moc jsem neuspěl.

- mohu všude mít captchu
- monitorovat zápisy každého uživatele (a poslat ho do háje, pokud překročí limit)?
- měřit rychlost bobtnání databáze a při překročení limitu začít všechny zápisy zdržovat?

Nebo je nějaký jiný lék?
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: aaaa 23. 12. 2014, 00:09:04
ano
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: Sten 23. 12. 2014, 00:11:02
Přeplnění databáze? V době, kdy synchronizovat běžné diskové pole trvá i týden v kuse?
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: Ondřej Novák 23. 12. 2014, 01:46:56
Dokážu si představit útok vedoucí k tomu, že databáze bude růst megabajt za sekundu. Nejen že výsledkem bude obrovský soubor plný nesmyslů, ale i polomrtvá služba zabíjená na I/O
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: tdvorak 23. 12. 2014, 07:40:22
Zápisy generují jen přihlášení uživatelé? Pak bych u registrace ponechal nějakou captchu a dál jen monitoroval, kolik zápisů generuje průměrný běžný uživatel. Podle toho pak nastavit limit pro nadměrné množství požadavků a začít třeba u každé akce nad limit zobrazovat captchu. Tak, aby to neomezovalo běžné uživatele a zkomplikovalo práci škodlivému učtu.

Ale píšeš "Dokážu si představit útok" - znamená to, že zatím řešíš jen nějaký krizový plán, co by, kdyby? Abys naopak nevytvořil úzké hrdlo celé aplikace logikou proti přetížení databáze. Možná by bylo lepší připravit se na řešení případných následků (pročistit databázi od škodlivého uživatele, zablokovat účet), nastavit monitoring a problém pak řešit ručně.

Pokud nastavíš limit požadavků za hodinu, bude útočník dělat požadavky pomaleji ale o to déle. Databázi zaplní tak jako tak a ty budeš mít falešný pocit bezpečí.
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: karel 23. 12. 2014, 10:35:19
Souhlasim s prizpevkem nademnou, pokud te nekdo chce dostat dostane te, a captcha ani nic jineho v tom nezabrani jen to zkomplikuje (prodrazi) utok,
spis byt tebou si priprav scenare pripadne rutiny co a jak kdyz k tomu dojde, blokovani daneho uctu pripadne smazani veskere jeho aktivity. Nezapominej ze cileny utok se muze odehravat pres x uctu v pripade ze nekdo zjisti jake jsou limity per ucet neni tak teske prizpusobit se. Otazkou je take proc by nekdo takovy utok delal a co by bylo cilem, pokud je to odstavit tvou sluzbu pravdepodobne uspeje.

Jeste jedno reseni, pri detekovani utoku na dany ucet necham na tobe jak to detekujes jesli pocet dotazu za cas ci neco jineho, proste prestan na dotazy reagovat, tj vypni pro dany ucet log ale i akce, muzes pouzit i sleep aby odezva byla podobna jako pri uzpesnych dotazech. Utok dal na ucet povede ale to te neboli a utocnik se dostane do schyzi kde je co spatne. 
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: hmmm 23. 12. 2014, 10:59:53
Ja se priznam, ze nevim. Ale jak to ma treba Wikipedie? Tam se taky loguje kazda editace. A editovat muze kdokoliv...
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: pičus 24. 12. 2014, 02:11:08
při akci která se loguje dej sleep(1000) a je to
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: Jimm 24. 12. 2014, 13:08:03
Děláš čest svému jménu ty šašku.
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: pičus 24. 12. 2014, 14:27:35
Hlavně že ty jsi piča
Název: Re:Ochrana DB proti přeplnění (web)
Přispěvatel: Bla 24. 12. 2014, 14:28:58
Captcha je zastaralá!
Po každém vložení zápisu do databáze tam přehraj tuhle reklamu: https://www.youtube.com/watch?v=TTUp6D9NzpU (https://www.youtube.com/watch?v=TTUp6D9NzpU)
Kdo to vydrží, MÁ SVATÉ PRÁVO na zápis.
App, já to vydržel 30 vteřin!

Jinak doporučuji další metody:
A) kontrolovat, kolik záznamů uživatel zadal - po vložení řádku vyvoláš trigr kontrolující počet zápisů tohoto uživatele vůči průměru a provedeš opatření (zdvojnásobíš čas přehrátí reklamy).

B) Měřit čas mezi posledním uložením záznamu do databáze, pokud je čas z dané IP menší než 15 vteřin, zápis neprovedeš.

C) Zobrazení obrázku pošle zápis do DB, že uživatel má právo na zápis jedné hodnoty, při zápisu do DB trigrem zkontroluješ, jestli je zápis oprávněný.