
Proyecto dedicado a combatir DDoS de capa 7 con prueba de trabajo, con un WAF y controlador adicionales. Completado con un conjunto completo de características y contenerizado para un despliegue rápido y ligero.
PoW Shield proporciona protección DDoS en la capa de aplicación OSI actuando como un proxy que utiliza prueba de trabajo (proof of work) entre el servicio backend y el usuario final. Este proyecto busca ofrecer una alternativa a los métodos generales anti-DDoS como el ReCaptcha de Google, que siempre ha sido un problema de resolver. Acceder a un servicio web protegido por PoW Shield nunca ha sido más fácil: simplemente vaya a la URL y su navegador hará el resto de la verificación automáticamente.
PoW Shield tiene como objetivo proporcionar los siguientes servicios empaquetados en una sola aplicación web / imagen Docker:
(Nuevo) Artículo en LinkedIn
Presentado en Pentester Academy TV
Compatible con el controlador PoW Phalanx:
Implementación alternativa en Go PoW-Shield-Go (WIP) para pruebas de estrés y futura versión optimizada de producción.
Básicamente, PoW Shield funciona como un proxy delante de la aplicación/servicio web real. Realiza la verificación mediante prueba de trabajo y solo permite el tráfico autorizado hacia el servidor real. El proxy es fácil de instalar y es capaz de proteger aplicaciones de baja seguridad con un WAF.
Esto es lo que sucede detrás de escena cuando un usuario navega por un servicio web protegido por PoW Shield:
Puede configurar PoW Shield mediante los siguientes métodos.
# Clonar el repositorio
git clone https://github.com/RuiSiang/PoW-Shield.git
# Instalar dependencias
npm install
# Configurar ajustes
cp -n .env.example .env
# Editar .env
nano .env
# Transpilar
npm run build
#############################################
# Ejecutar con base de datos (redis), recomendado y más rápido #
# instalar redis primero #
# sudo apt-get install redis-server #
#############################################
npm start
#############################################
#############################################
# Ejecutar sin base de datos (redis simulado) #
#############################################
npm run start:standalone # linux
npm run start:standalone-win # windows
#############################################
# Probar funcionalidades (opcional)
npm test
####################################################
# Docker ejecutar con base de datos (redis), recomendado y más rápido #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -d ruisiang/pow-shield
####################################################
####################################################
# Docker ejecutar sin base de datos (redis simulado) #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -e NODE_ENV="standalone" -d ruisiang/pow-shield
####################################################
####################################################
# Docker Compose #
####################################################
# Copiar docker-compose.example.yaml
cp -n docker-compose.example.yaml docker-compose.yaml
# Editar docker-compose.yaml
nano docker-compose.yaml
# Iniciar el contenedor
docker-compose -f docker-compose.yaml up
####################################################
Nota: Esto solo funciona en la versión no contenedorizada de PoW Shield, y su sistema podría experimentar inestabilidad al ejecutar la prueba.
# Iniciar la prueba de estrés
npm run stress
# Si cambió la variable PORT en .env, también debe cambiar la variable target en el script de prueba de estrés
nano scripts/stress.sh
Las siguientes pruebas se realizan en un solo hilo de una CPU i7-10870H con un período de 60 segundos para cada parámetro concurrente.
A partir de la muestra anterior, podemos ver que la carga máxima estimada adecuada para PoW Shield es de alrededor de 512 conexiones concurrentes. Las tasas de error y las latencias se deterioran más allá de la aceptación normal a partir de ahí. Por lo tanto, en un entorno balanceado de carga en la máquina (1 instancia de PoW Shield en cada uno de sus 8 núcleos), debería poder manejar un máximo de aproximadamente 4096 conexiones concurrentes (clientes) con una tasa total de solicitudes de 32k solicitudes/segundo.
MIT
| Variable | Tipo | Valor por defecto | Descripción |
|---|
| PORT | General | 3000 | puerto en el que PoW Shield escucha |
| SESSION_KEY | General | clave secreta para firmar cookies, use una única por razones de seguridad, de lo contrario cualquiera podría falsificar sus cookies firmadas | |
| BACKEND_URL | General | ubicación a donde redirigir el tráfico autenticado, se aceptan IP y URL (acepta protocolo://url(:puerto) o protocolo://ip(:puerto)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | host del servicio redis |
| DATABASE_PORT | Redis | 6379 | puerto del servicio redis |
| DATABASE_PASSWORD | Redis | null | contraseña del servicio redis |
| POW | PoW | on | activa/desactiva la funcionalidad PoW (si no se desactiva temporalmente, ¿para qué usar este proyecto?) |
| NONCE_VALIDITY | PoW | 60000 | especifica el tiempo máximo en segundos que un nonce puede ser enviado al servidor después de su generación (se usa para forzar cambios de dificultad y filtrar nonces obsoletos) |
| DIFFICULTY | PoW | 13 | dificultad del problema, número de bits cero iniciales en el hash producido (0: extremadamente fácil ~ 256: imposible, 13 (predeterminado) tarda unos 5 segundos en calcularse en el navegador) |
| RATE_LIMIT | Rate Limit | on | activa/desactiva la funcionalidad de limitación de velocidad |
| RATE_LIMIT_SAMPLE_MINUTES | Rate Limit | 60 | especifica cuántos minutos hasta que se reinicien las estadísticas de sesión/IP |
| RATE_LIMIT_SESSION_THRESHOLD | Rate Limit | 100 | número de solicitudes que una sola sesión puede realizar hasta que se active la revocación del token |
| RATE_LIMIT_BAN_IP | Rate Limit | on | activa/desactiva la funcionalidad de baneo de IP |
| RATE_LIMIT_IP_THRESHOLD | Rate Limit | 500 | número de solicitudes que una sola sesión puede realizar hasta que se active el baneo de IP |
| RATE_LIMIT_BAN_MINUTES | Rate Limit | 15 | número de minutos que dura el baneo de IP |
| WAF | WAF | on | activa/desactiva la funcionalidad WAF |
| WAF_URL_EXCLUDE_RULES | WAF | reglas a excluir al escanear la URL de la solicitud. Use ',' para separar números de regla, use '-' para especificar un rango (ej: 1,2-4,5,7-10) | |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | reglas a excluir al escanear el encabezado de la solicitud. Use ',' para separar números de regla, use '-' para especificar un rango (ej: 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | reglas a excluir al escanear el cuerpo de la solicitud. Use ',' para separar números de regla, use '-' para especificar un rango (ej: 1,2-4,5,7-10) | |
| SSL | SSL | off | activa/desactiva la funcionalidad SSL |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | ruta al certificado SSL |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | ruta a la clave SSL |
| SOCKET | Socket | off | activa/desactiva la funcionalidad de socket |
| SOCKET_URL | Socket | ubicación del controlador PoW Phalanx, se aceptan IP y URL (acepta protocolo://url:puerto o protocolo://ip:puerto) | |
| SOCKET_TOKEN | Socket | token de suscripción para el controlador PoW Phalanx |
| Conexiones concurrentes | Latencia media | Tasa de error | Solicitudes/segundo |
|---|
| 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 |
| Conexiones concurrentes | Latencia media | Tasa de error | Solicitudes/segundo |
|---|
| 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 |