
Projekt zur Bekämpfung von Layer-7-DDoS mit Proof-of-Work, mit zusätzlicher WAF und Controller. Ausgestattet mit einem vollständigen Funktionsumfang und containerisiert für schnelle und leichte Bereitstellung.
PoW Shield bietet DDoS-Schutz auf der OSI-Anwendungsschicht, indem es als Proxy fungiert, der Proof of Work zwischen dem Backend-Dienst und dem Endbenutzer einsetzt. Dieses Projekt zielt darauf ab, eine Alternative zu allgemeinen Anti-DDoS-Methoden wie Googles ReCaptcha zu bieten, die schon immer eine Qual waren. Der Zugriff auf einen durch PoW-Shield geschützten Webdienst war noch nie einfacher: Einfach die URL aufrufen, und der Browser erledigt den Rest der Verifizierung automatisch für Sie.
PoW Shield zielt darauf ab, die folgenden Dienste in einer einzigen Webapp/Docker-Images zu bündeln:
(Neu) Artikel auf LinkedIn
Unterstützt über den PoW Phalanx-Controller:
Alternative Implementierung in Go PoW-Shield-Go (WIP) für Stresstestzwecke und zukünftige optimierte Produktionsversion.
Im Grunde genommen fungiert PoW Shield als Proxy vor der eigentlichen Web-App/dem eigentlichen Dienst. Es führt eine Verifikation mittels Proof of Work durch und leitet nur autorisierten Verkehr an den tatsächlichen Server weiter. Der Proxy ist einfach installierbar und kann Anwendungen mit geringer Sicherheit durch eine WAF schützen.
Folgendes passiert im Hintergrund, wenn ein Benutzer einen durch PoW Shield geschützten Webdienst aufruft:
Sie können PoW Shield über die folgenden Methoden konfigurieren.
| Variable | Typ | Standard | Beschreibung |
|---|---|---|---|
| PORT | Allgemein | 3000 | Port, den PoW Shield abhört |
| SESSION_KEY | Allgemein | Geheimer Schlüssel für Cookie-Signaturen; aus Sicherheitsgründen einen eindeutigen verwenden, sonst kann jeder Ihre signierten Cookies fälschen | |
| BACKEND_URL | Allgemein | Zielort für authentifizierten Verkehr; IPs und URLs werden akzeptiert (akzeptiert protocol://url(:port) oder protocol://ip(:port)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | Redis-Dienst-Host |
| DATABASE_PORT | Redis | 6379 | Redis-Dienst-Port |
| DATABASE_PASSWORD | Redis | null | Redis-Dienst-Passwort |
| POW | PoW | on | Schaltet PoW-Funktionalität ein/aus (wenn nicht vorübergehend ausgeschaltet, warum dieses Projekt überhaupt verwenden?) |
| NONCE_VALIDITY | PoW | 60000 | Maximale Sekunden, die eine Nonce nach Generierung an den Server gesendet werden kann (zur Durchsetzung von Schwierigkeitsänderungen und Herausfiltern veralteter Nonces) |
| DIFFICULTY | PoW | 13 | Problem-Schwierigkeit, Anzahl führender Nullbits im erzeugten Hash (0: extrem einfach ~ 256: unmöglich, 13 (Standard) dauert etwa 5 Sekunden für den Browser) |
| RATE_LIMIT | Ratenbegr. | on | Schaltet Ratenbegrenzungsfunktionalität ein/aus |
| RATE_LIMIT_SAMPLE_MINUTES | Ratenbegr. | 60 | Minuten, bis Statistiken für Sitzung/IP zurückgesetzt werden |
| RATE_LIMIT_SESSION_THRESHOLD | Ratenbegr. | 100 | Anzahl der Anfragen, die eine einzelne Sitzung stellen kann, bevor der Token-Widerruf ausgelöst wird |
| RATE_LIMIT_BAN_IP | Ratenbegr. | on | Schaltet IP-Sperrfunktionalität ein/aus |
| RATE_LIMIT_IP_THRESHOLD | Ratenbegr. | 500 | Anzahl der Anfragen, die eine einzelne Sitzung stellen kann, bevor die IP-Sperre ausgelöst wird |
| RATE_LIMIT_BAN_MINUTES | Ratenbegr. | 15 | Minuten, die die IP-Sperre bestehen bleibt |
| WAF | WAF | on | Schaltet WAF-Funktionalität ein/aus |
| WAF_URL_EXCLUDE_RULES |
# 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
####################################################
Hinweis: Dies funktioniert nur mit der nicht-containerisierten Version von PoW Shield, und Ihr System könnte bei der Ausführung des Tests instabil werden.
# 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
Die folgenden Tests wurden auf einem einzelnen Thread einer i7-10870H CPU mit einem 60-Sekunden-Zeitraum für jeden gleichzeitigen Parameter durchgeführt.
| Gleichzeitige Verbindungen | Durchschn. Latenz | Fehlerrate | Anfragen/Sekunde |
|---|---|---|---|
| 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 |
| Gleichzeitige Verbindungen | Durchschn. Latenz | Fehlerrate | Anfragen/Sekunde |
|---|---|---|---|
| 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 |
Aus obigem Beispiel wird ersichtlich, dass die angemessene maximale Lastschätzung für PoW Shield bei etwa 512 gleichzeitigen Verbindungen liegt. Fehlerraten und Latenzen verschlechtern sich danach über die normale Akzeptanz hinaus. Daher sollte es in einer lastverteilten Umgebung auf der Maschine (1 PoW Shield-Instanz auf jedem der 8 Kerne) in der Lage sein, maximal etwa 4096 gleichzeitige Verbindungen (Clients) bei einer Gesamtanforderungsrate von 32k Anfragen/Sekunde zu bewältigen.
MIT
| WAF |
| Ausschlussregeln beim Scannen der Anfrage-URL; ',' zur Trennung von Regelnummern, '-' für einen Bereich (z.B. 1,2-4,5,7-10) |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | Ausschlussregeln beim Scannen des Anfrage-Headers; ',' zur Trennung von Regelnummern, '-' für einen Bereich (z.B. 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | Ausschlussregeln beim Scannen des Anfragekörpers; ',' zur Trennung von Regelnummern, '-' für einen Bereich (z.B. 1,2-4,5,7-10) |
| SSL | SSL | off | Schaltet SSL-Funktionalität ein/aus |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | Pfad zum SSL-Zertifikat |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | Pfad zum SSL-Schlüssel |
| SOCKET | Socket | off | Schaltet Socket-Funktionalität ein/aus |
| SOCKET_URL | Socket | Ort des PoW Phalanx-Controllers; IPs und URLs werden akzeptiert (akzeptiert protocol://url:port oder protocol://ip:port) |
| SOCKET_TOKEN | Socket | Abonnement-Token für den PoW Phalanx-Controller |