Te veel verzoeken: DoS en DDoS
In les 2 zag je dat je server per seconde een beperkt aantal verzoeken kan beantwoorden. Stuurt iemand er expres meer dan dat, dan raakt de server achter, en een echte bezoeker krijgt geen antwoord meer. De site ligt plat.
Dat is een DoS-aanval: Denial of Service, oftewel "dienst weigeren". De aanvaller breekt niet in, hij maakt de server zo druk dat hij niets nuttigs meer doet.
Lukt dat met één laptop?
Zet in test_verzoeken.py uit les 3 range(20) op range(500),
en in de laatste regel 20 op 500. Draai het script, en open intussen
http://127.0.0.1:8000/ in je browser. Het script doet er al gauw tien seconden
of langer over, veel langer dan de 500 per seconde uit les 2 doet denken:
httpx.get maakt bij elk verzoek eerst alles opnieuw klaar om te versturen, en
dat kost je laptop meer tijd dan je server het antwoord.
Verzoeken na elkaar zijn niet genoeg
Je script wacht bij elk verzoek op het antwoord. Het stuurt ze dus nooit sneller dan de server ze beantwoordt, en de server loopt nooit achter.
Daarom komen echte aanvallen van heel veel computers tegelijk. Dat heet DDoS: Distributed Denial of Service. De verzoeken zijn "verspreid" over duizenden machines, en samen sturen ze er veel meer dan de server aankan.
Eén computer kan een server wel te druk maken als hij niet netjes wacht: als hij veel verzoeken tegelijk stuurt, of steeds een endpoint kiest dat veel werk kost. Daarom telt de limiet in les 5 per computer.
Een botnet
De computers in een DDoS zijn meestal niet van de aanvaller zelf. Het zijn gekaapte computers, camera's en routers, samen een botnet. Er draait ongemerkt een programmaatje op dat op een teken van de aanvaller verzoeken begint te sturen. De eigenaren weten vaak niet eens dat hun apparaat meedoet.
| DoS | DDoS | |
|---|---|---|
| Waar komen de verzoeken vandaan | één computer | heel veel computers |
| De eerste D staat voor | Denial | Distributed |
| Tegen te houden met een blokkade per computer | ja | veel lastiger |
Allebei overspoelen ze de server met werk. Een DDoS is alleen groter en moeilijker te stoppen, want je kunt niet één boosdoener blokkeren.
Er gaat iets mis
KeyboardInterrupt
Je wacht het script niet af en stopt het met Ctrl+C. Er verschijnt een lange foutmelding die eindigt met:
KeyboardInterrupt
Oorzaak: Python laat zien op welke regel het script was toen je het onderbrak.
Oplossing: niets; zo stop je een script. Je server draait door in zijn eigen terminal.
Opdrachten
Opdracht 1: Predict - Een rekensom
Je server beantwoordt 500 verzoeken per seconde. Een botnet van 2000 camera's stuurt elk één verzoek per seconde.
Vraag: kan je server het bijhouden?
Tip
Reken uit hoeveel verzoeken er samen per seconde binnenkomen.
Antwoord
Nee. Samen zijn het 2000 verzoeken per seconde, vier keer zoveel als de server aankan. Elke camera stuurt maar één verzoek per seconde, dat valt nergens op. Pas samen zijn ze te veel.
Opdracht 2: Investigate - Waarom is DDoS lastiger?
Een DoS van één computer kun je tegenhouden door die ene computer te weigeren. Waarom werkt dat bij een DDoS niet?
Antwoord
Omdat er geen ene computer is. Elke camera uit het botnet stuurt zo weinig verzoeken dat hij eruitziet als een gewone bezoeker. Weiger je ze allemaal, dan weiger je ook je echte bezoekers, want je kunt ze niet uit elkaar houden. In les 7 zie je wat grote sites daar wel tegen doen.
Door naar les 5: een limiet met slowapi.