
Progetto dedicato alla lotta contro gli attacchi DDoS di Layer 7 con proof of work, con un WAF e controller aggiuntivi. Completato con un set completo di funzionalità e containerizzato per una distribuzione rapida e leggera.
PoW Shield fornisce protezione DDoS a livello applicativo OSI agendo come proxy che utilizza la proof of work tra il servizio backend e l'utente finale. Questo progetto mira a fornire un'alternativa ai metodi anti-DDoS generali come Google ReCaptcha, che è sempre stato fastidioso da risolvere. Accedere a un servizio web protetto da PoW Shield non è mai stato così semplice: basta andare all'URL e il browser eseguirà automaticamente la verifica per te.
PoW Shield mira a fornire i seguenti servizi in un'unica webapp / immagine docker:
(Nuovo) Articolo su LinkedIn
Supportato tramite il controller PoW Phalanx:
Implementazione alternativa in Go PoW-Shield-Go (WIP) per scopi di stress test e futura versione ottimizzata di produzione.
In pratica, PoW Shield funge da proxy davanti all'effettiva web app/servizio. Esegue la verifica tramite proof of work e inoltra solo il traffico autorizzato al server reale. Il proxy è facilmente installabile ed è in grado di proteggere applicazioni a bassa sicurezza con un WAF.
Ecco cosa succede dietro le quinte quando un utente naviga su un servizio web protetto da PoW Shield:
Puoi configurare PoW Shield tramite i seguenti metodi.
| Variabile | Tipo | Default | Descrizione |
|---|---|---|---|
| PORT | Generale | 3000 | porta su cui PoW Shield ascolta |
| SESSION_KEY | Generale | chiave segreta per le firme dei cookie, usane una unica per motivi di sicurezza, altrimenti chiunque può falsificare i tuoi cookie firmati | |
| BACKEND_URL | Generale | posizione verso cui inoltrare il traffico autenticato, sono accettati sia IP che URL (accetta protocol://url(:port) o protocol://ip(:port)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | host del servizio redis |
| DATABASE_PORT | Redis | 6379 | porta del servizio redis |
| DATABASE_PASSWORD | Redis | null | password del servizio redis |
| POW | PoW | on | attiva/disattiva la funzionalità PoW (se non disattivata temporaneamente, perché usare questo progetto?) |
| NONCE_VALIDITY | PoW | 60000 | specifica il massimo di secondi entro cui un nonce deve essere inviato al server dopo la generazione (usato per imporre il cambio di difficoltà e filtrare nonce obsoleti) |
| DIFFICULTY | PoW | 13 | difficoltà del problema, numero di bit zero iniziali nell'hash prodotto (0:estremamente facile ~ 256:impossibile, 13(default) richiede circa 5 secondi al browser per il calcolo) |
| RATE_LIMIT | Rate Limit | on | attiva/disattiva la funzionalità di limitazione di velocità |
| RATE_LIMIT_SAMPLE_MINUTES | Rate Limit | 60 | specifica quanti minuti fino al reset delle statistiche per sessione/IP |
| RATE_LIMIT_SESSION_THRESHOLD | Rate Limit | 100 | numero di richieste che una singola sessione può effettuare prima di innescare la revoca del token |
| RATE_LIMIT_BAN_IP | Rate Limit | on | attiva/disattiva la funzionalità di ban IP |
| RATE_LIMIT_IP_THRESHOLD | Rate Limit | 500 | numero di richieste che una singola sessione può effettuare prima di innescare il ban IP |
| RATE_LIMIT_BAN_MINUTES | Rate Limit | 15 | numero di minuti per cui persiste il ban IP |
| WAF | WAF | on | attiva/disattiva la funzionalità WAF |
# Clone repository
git clone https://github.com/RuiSiang/PoW-Shield.git
# Install dependencies
npm install
# Configure settings
cp -n .env.example .env
# Edit .env
nano .env
# Transpile
npm run build
#############################################
# Run with db (redis), recommended & faster #
# install redis first #
# sudo apt-get install redis-server #
#############################################
npm start
#############################################
#############################################
# Run without db (mock redis) #
#############################################
npm run start:standalone # linux
npm run start:standalone-win # windows
#############################################
# Test functionalities(optional)
npm test
####################################################
# Docker run with db (redis), recommended & faster #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -d ruisiang/pow-shield
####################################################
####################################################
# Docker run without db (mock redis) #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -e NODE_ENV="standalone" -d ruisiang/pow-shield
####################################################
####################################################
# Docker Compose #
####################################################
# Copy docker-compose.example.yaml
cp -n docker-compose.example.yaml docker-compose.yaml
# Edit docker-compose.yaml
nano docker-compose.yaml
# Start the container
docker-compose -f docker-compose.yaml up
####################################################
Nota: Funziona solo sulla versione non containerizzata di PoW Shield e il sistema potrebbe diventare instabile durante l'esecuzione del test.
# Start the stress test
npm run stress
# If you changed the PORT variable in .env, you should also change the target variable in the stress test script
nano scripts/stress.sh
I seguenti test sono condotti su un singolo thread di una CPU i7-10870H con un periodo di 60 secondi per ogni parametro di concorrenza.
| Connessioni Concorrenti | Latenza Media | Tasso di Errore | Richieste/Secondo |
|---|---|---|---|
| 64 | 15.3ms | 0.0000 | 4188 |
| 128 | 30.2ms | 0.0000 | 4229 |
| 256 | 60.4ms | 0.0000 | 4235 |
| 512 | 122.6ms | 0.0142 | 4166 |
| 1024 | 261.7ms | 0.1766 | 3894 |
| 2048 | 1966.5ms | 0.4979 | 1027 |
| 4096 | 4685ms | 0.7179 | 838 |
| Connessioni Concorrenti | Latenza Media | Tasso di Errore | Richieste/Secondo |
|---|---|---|---|
| 64 | 15.6ms | N/A | 4094 |
| 128 | 31.5ms | N/A | 4058 |
| 256 | 61.5ms | N/A | 4159 |
| 512 | 129.5ms | N/A | 3945 |
| 1024 | 264.4ms | N/A | 3858 |
| 2048 | 592.1ms | N/A | 3407 |
| 4096 | 1212.6ms | N/A | 3322 |
Dal campione sopra, possiamo vedere che il carico massimo appropriato stimato per PoW Shield è di circa 512 connessioni concorrenti. I tassi di errore e le latenze peggiorano oltre l'accettazione normale successivamente. Quindi, in un ambiente bilanciato del carico sulla macchina (1 istanza PoW Shield su ciascuno degli 8 core), dovrebbe essere in grado di gestire un massimo di circa 4096 connessioni concorrenti (client) con un tasso totale di richieste di 32k richieste/secondo.
MIT
| WAF_URL_EXCLUDE_RULES |
| WAF |
| regole da escludere durante la scansione dell'URL della richiesta, usa ',' per separare i numeri delle regole, usa '-' per specificare un intervallo (es: 1,2-4,5,7-10) |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | regole da escludere durante la scansione dell'header della richiesta, usa ',' per separare i numeri delle regole, usa '-' per specificare un intervallo (es: 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | regole da escludere durante la scansione del corpo della richiesta, usa ',' per separare i numeri delle regole, usa '-' per specificare un intervallo (es: 1,2-4,5,7-10) |
| SSL | SSL | off | attiva/disattiva la funzionalità SSL |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | percorso verso la password del certificato SSL |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | percorso verso la chiave SSL |
| SOCKET | Socket | off | attiva/disattiva la funzionalità socket |
| SOCKET_URL | Socket | posizione del controller PoW Phalanx, sono accettati sia IP che URL (accetta protocol://url:port o protocol://ip:port) |
| SOCKET_TOKEN | Socket | token di sottoscrizione per il controller PoW Phalanx |