Ga naar hoofdinhoud

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.

DoSDDoS
Waar komen de verzoeken vandaanéén computerheel veel computers
De eerste D staat voorDenialDistributed
Tegen te houden met een blokkade per computerjaveel lastiger

Allebei overspoelen ze de server met werk. Een DDoS is alleen groter en moeilijker te stoppen, want je kunt niet één boosdoener blokkeren.

Controlevraag
Je start test_verzoeken.py met range(500) in twee terminals tegelijk. Hoeveel verzoeken van je scripts wachten er bij je server hoogstens tegelijk op een antwoord?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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.