
Projet dédié à la lutte contre les DDoS de couche 7 avec preuve de travail, avec un WAF et un contrôleur supplémentaires. Complété avec un ensemble complet de fonctionnalités et conteneurisé pour un déploiement rapide et léger.
PoW Shield offre une protection contre les DDoS sur la couche application OSI en agissant comme un proxy qui utilise une preuve de travail (proof of work) entre le service backend et l'utilisateur final. Ce projet vise à fournir une alternative aux méthodes générales anti-DDoS telles que le ReCaptcha de Google qui a toujours été pénible à résoudre. Accéder à un service web protégé par PoW Shield n'a jamais été aussi simple : il suffit d'aller sur l'URL, et votre navigateur effectuera automatiquement le reste de la vérification pour vous.
PoW Shield vise à fournir les services suivants regroupés dans une seule application web / image Docker :
(Nouveau) Article sur LinkedIn
Pris en charge via le contrôleur PoW Phalanx :
Implémentation alternative en Go PoW-Shield-Go (en cours) à des fins de tests de charge et pour une future version de production optimisée.
En gros, PoW Shield fonctionne comme un proxy placé devant l'application/service web réel. Il effectue une vérification via une preuve de travail et ne transmet que le trafic autorisé au serveur réel. Le proxy est facilement installable et capable de protéger des applications à faible sécurité avec un WAF.
Voici ce qui se passe en coulisse lorsqu'un utilisateur navigue sur un service web protégé par PoW Shield :
Vous pouvez configurer PoW Shield via les méthodes suivantes.
| Variable | Type | Par défaut | Description |
|---|---|---|---|
| PORT | Général | 3000 | port sur lequel PoW Shield écoute |
| SESSION_KEY | Général | clé secrète pour les signatures de cookies, utilisez-en une unique pour des raisons de sécurité, sinon n'importe qui peut falsifier vos cookies signés | |
| BACKEND_URL | Général | emplacement vers lequel transmettre le trafic authentifié, IP et URL sont acceptés (accepte protocol://url(:port) ou protocol://ip(:port)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | hôte du service redis |
| DATABASE_PORT | Redis | 6379 | port du service redis |
| DATABASE_PASSWORD | Redis | null | mot de passe du service redis |
| POW | PoW | on | active/désactive la fonctionnalité PoW (si elle n'est pas temporairement désactivée, pourquoi utiliser ce projet ?) |
| NONCE_VALIDITY | PoW | 60000 | spécifie le nombre maximum de secondes pendant lesquelles un nonce peut être soumis au serveur après sa génération (utilisé pour imposer un changement de difficulté et filtrer les nonces obsolètes) |
| DIFFICULTY | PoW | 13 | difficulté du problème, nombre de bits zéro en tête dans le hachage produit (0 : extrêmement facile ~ 256 : impossible, 13 (défaut) prend environ 5 secondes pour que le navigateur calcule) |
| RATE_LIMIT | Limite de débit | on | active/désactive la fonctionnalité de limitation de débit |
| RATE_LIMIT_SAMPLE_MINUTES | Limite de débit | 60 | spécifie le nombre de minutes avant la réinitialisation des statistiques pour une session/IP |
| RATE_LIMIT_SESSION_THRESHOLD | Limite de débit | 100 | nombre de requêtes qu'une session unique peut effectuer avant de déclencher la révocation du jeton |
| RATE_LIMIT_BAN_IP | Limite de débit | on | active/désactive la fonctionnalité de bannissement IP |
| RATE_LIMIT_IP_THRESHOLD | Limite de débit | 500 | nombre de requêtes qu'une session unique peut effectuer avant de déclencher le bannissement IP |
| RATE_LIMIT_BAN_MINUTES | Limite de débit | 15 | nombre de minutes pendant lesquelles le bannissement IP persiste |
# 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
####################################################
Remarque : Ceci ne fonctionne que sur la version non conteneurisée de PoW Shield, et votre système pourrait devenir instable lors de l'exécution du 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
Les tests suivants sont effectués sur un seul thread d'un CPU i7-10870H avec une période de 60 secondes pour chaque paramètre de concurrence.
| Connexions simultanées | Latence moyenne | Taux d'erreur | Requêtes/seconde |
|---|---|---|---|
| 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 |
| Connexions simultanées | Latence moyenne | Taux d'erreur | Requêtes/seconde |
|---|---|---|---|
| 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 |
D'après l'échantillon ci-dessus, on peut voir que la charge maximale appropriée estimée pour PoW Shield est d'environ 512 connexions simultanées. Les taux d'erreur et les latences se dégradent au-delà de l'acceptation normale par la suite. Par conséquent, dans un environnement équilibré en charge sur la machine (1 instance PoW Shield sur chacun de ses 8 cœurs), il devrait pouvoir gérer un maximum d'environ 4096 connexions simultanées (clients) avec un débit total d'environ 32 000 requêtes/seconde.
MIT
| WAF |
| WAF |
| on |
| active/désactive la fonctionnalité WAF |
| WAF_URL_EXCLUDE_RULES | WAF | règles à exclure lors de l'analyse de l'URL de la requête, utilisez ',' pour séparer les numéros de règles, utilisez '-' pour spécifier une plage (ex : 1,2-4,5,7-10) |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | règles à exclure lors de l'analyse de l'en-tête de la requête, utilisez ',' pour séparer les numéros de règles, utilisez '-' pour spécifier une plage (ex : 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | règles à exclure lors de l'analyse du corps de la requête, utilisez ',' pour séparer les numéros de règles, utilisez '-' pour spécifier une plage (ex : 1,2-4,5,7-10) |
| SSL | SSL | off | active/désactive la fonctionnalité SSL |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | chemin vers le certificat SSL |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | chemin vers la clé SSL |
| SOCKET | Socket | off | active/désactive la fonctionnalité socket |
| SOCKET_URL | Socket | emplacement du contrôleur PoW Phalanx, IP et URL sont acceptés (accepte protocol://url:port ou protocol://ip:port) |
| SOCKET_TOKEN | Socket | jeton d'abonnement pour le contrôleur PoW Phalanx |