Come verificare rapidamente se il tuo sito web è protetto contro gli attacchi DoS?
L'obiettivo di questa rapida guida è spiegare come eseguire uno stress test sul tuo sito e vedere come si comporta sotto carico estremo. Lo strumento Open Source che utilizziamo per questo test è lo strumento di benchmarking HTTP wrk.
Cos'è un attacco (DoS) Denial-Of-Service:
Un Denial Of Service (DoS) è un tipo di attacco in cui l'aggressore impedisce agli utenti autorizzati di accedere a un servizio. Il metodo più comune di DoS prevede il sovraccarico del servizio con così tanto traffico o richieste di dati, che il servizio non sarebbe in grado di rispondere agli utenti legittimi fino a quando il flusso malevolo non è terminato. Utilizzeremo lo strumento di benchmarking HTTP, wrk, per emulare questo tipo di attacco.
In informatica, cos'è un benchmark:
Secondo wikipedia, benchmark è:
In informatica, un benchmark è l'atto di eseguire un programma per computer, un set di programmi o altre operazioni, al fine di valutare le prestazioni relative di un oggetto, normalmente eseguendo una serie di test e prove standard su di esso. Il termine benchmark è anche comunemente utilizzato per i programmi di benchmarking elaborati stessi.
Due caratteristiche chiave di un benchmark sono:
- Deve essere ripetibile.
- Deve essere quantificabile.
Cos'è wrk:
Per eseguire il test di carico sul nostro sito web stiamo utilizzando wrk, secondo la loro documentazione ufficiale:
wrk è uno strumento moderno di benchmarking HTTP in grado di generare un carico significativo quando eseguito su una singola CPU multi-core. Combina un design multithread con sistemi scalabili di notifica degli eventi come epoll e kqueue.
wrk è open source, ma prima di utilizzarlo, dai un'occhiata all'avviso sulla crittografia su https://github.com/wg/wrk#cryptography-notice
Come installare wrk
Ok, finalmente inizieremo i test. Assicurati di essere a tuo agio nell'eseguire comandi nel terminale, poiché al momento non esiste un'interfaccia grafica per eseguire wrk.
Come installare wrk su Mac
- Installa homebrew, esegui il seguente comando in un terminale:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Per installare wrk, esegui il seguente comando in un terminale:
brew install wrk
Come installare wrk sulla distribuzione Linux Ubuntu
sudo apt-get update
sudo apt-get install wrk
come installare wrk su windows
Gli utenti Windows dovranno prima installare Ubuntu tramite questo link ed eseguire successivamente i due comandi sopra.
Come stressare il tuo sito
L'uso base di wrk si presenta così:
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
Le opzioni della riga di comando valide sono:
-c, --connections: numero totale di connessioni HTTP da mantenere aperte con
ogni thread che gestisce N = connections/threads
-d, --duration: durata del test, ad es. 2s, 2m, 2h
-t, --threads: numero totale di thread da utilizzare
-s, --script: script LuaJIT, vedi SCRIPTING
-H, --header: intestazione HTTP da aggiungere alla richiesta, ad es. "User-Agent: wrk"
--latency: stampa statistiche dettagliate sulla latenza
--timeout: registra un timeout se una risposta non viene ricevuta entro
questo lasso di tempo.
Eseguirò un benchmark per 90 secondi, utilizzando 10 thread e mantenendo aperte 100000 connessioni HTTP.
wrk -t10 -c100000 -d90s https://davidloor.com --timeout 3s --latency -H 'Client: wrk terminal'
Breve spiegazione di ciò che sto facendo con le opzioni passate:
-t10: Usa dieci thread separati
-c100000: Apri 100000 connessioni
-d90s: Esegui il test per novanta secondi
https://davidloor.com Il sito web di destinazione
--timeout 3s: Definisci un timeout di tre secondi
--latency: stampa statistiche dettagliate sulla latenza
-H 'Client: wrk terminal': Passa un'intestazione Client
Quindi, possiamo dire che lo stress test sta cercando di emulare 100000 utenti che aprono la homepage del sito web più volte per 90 secondi.
Importante: Durante l'esecuzione dello stress test, apri il sito web e prova anche ad accedere (se il sito ha questa funzionalità), se il sito si carica velocemente come al solito, puoi presumere che sia protetto da semplici attacchi DoS e che il server sia in grado di gestire un carico significativo. Se il sito impiega del tempo per caricarsi, o visualizza un errore, hai un problema con il sito web e dovresti contattare il tuo provider di hosting. In alcuni casi il sito non sarà in grado di recuperare da solo e potrebbe essere necessario riavviare alcuni servizi.
Analizza l'Output
Dopo aver eseguito il comando ottengo questo:
Running 2m test @ https://davidloor.com
10 threads and 100000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 528.12ms 527.33ms 2.99s 87.92%
Req/Sec 20.30 16.93 116.00 74.75%
Latency Distribution
50% 356.27ms
75% 638.27ms
90% 1.20s
99% 2.62s
11662 requests in 1.50m, 735.63MB read
Socket errors: connect 97681, read 117, write 0, timeout 1581
Requests/sec: 129.43
Transfer/sec: 8.16MB
Fornisce un rapido riepilogo su quanto tempo è durato il test e il sito web (https://davidloor.com) che è stato testato. Mostra anche i parametri di distribuzione normale per latenza e Req/Sec. Indica che in 1,5 minuti, wrk ha effettuato 11662 richieste e trasferito 735,63 MB di dati.
I valori medi di Latenza e Req/Sec sono buoni? Dipende da ogni singola situazione. Dovremmo sempre cercare di mantenere la Latenza bassa e i Req/Sec alti, e dovresti tenere presente che maggiore è il numero di connessioni, minori saranno questi 2 valori.
Conclusioni
- Puoi stressare rapidamente il tuo sito con wrk. https://github.com/wg/wrk
- Il comando per eseguire uno stress test, dopo aver installato wrk, è: `wrk -t10 -c100000 -d90s https://davidloor.com –timeout 3s –latency -H ‘Client: wrk terminal’`
- Esegui il comando wrk e, contemporaneamente, prova a caricare il sito nel tuo browser e vedi se riscontri rallentamenti.
- Esistono risorse gratuite per migliorare le prestazioni del tuo sito web senza aggiungere più risorse al server, come l'utilizzo di una CDN gratuita, ad esempio cloudflare.
- Se hai una CDN, assicurati di sfruttarne appieno i vantaggi.
Disclaimer: Le informazioni disponibili in questo post del blog sono solo a scopo educativo. Non sono responsabile di come utilizzi le informazioni qui presenti.