
Projeto dedicado a combater DDoS na camada 7 com prova de trabalho, com um WAF e controlador adicionais. Completo com conjunto completo de funcionalidades e containerizado para implantação rápida e leve.
O PoW Shield fornece proteção contra DDoS na camada de aplicação OSI atuando como um proxy que utiliza prova de trabalho entre o serviço de backend e o utilizador final. Este projeto visa oferecer uma alternativa aos métodos gerais anti-DDoS, como o ReCaptcha do Google, que sempre foi um incómodo de resolver. Aceder a um serviço web protegido pelo PoW Shield nunca foi tão fácil, basta ir ao URL e o seu navegador fará o resto da verificação automaticamente.
O PoW Shield pretende fornecer os seguintes serviços agrupados numa única aplicação web / imagem docker:
(Novo) Artigo no LinkedIn
Apresentado no Pentester Academy TV
Suportado através do controlador PoW Phalanx:
Implementação alternativa em Go PoW-Shield-Go (WIP) para fins de teste de stress e futura versão de produção otimizada.
Basicamente, o PoW Shield funciona como um proxy à frente da aplicação/serviço web real. Ele realiza a verificação através de prova de trabalho e apenas encaminha o tráfego autorizado para o servidor real. O proxy é facilmente instalável e é capaz de proteger aplicações de baixa segurança com uma WAF.
Aqui está o que acontece nos bastidores quando um utilizador navega num serviço web protegido pelo PoW Shield:
Pode configurar o PoW Shield através dos seguintes métodos.
# 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: Isto só funciona na versão não contentorizada do PoW Shield, e o seu sistema poderá sofrer instabilidade durante a execução do teste.
# 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
Os seguintes testes são realizados num único thread de uma CPU i7-10870H com um período de 60 segundos para cada parâmetro de concorrência.
Pela amostra acima, podemos ver que a estimativa de carga máxima adequada para o PoW Shield é de cerca de 512 conexões concorrentes. As taxas de erro e latências deterioram-se para além da aceitação normal depois disso. Portanto, num ambiente com balanceamento de carga na máquina (1 instância do PoW Shield em cada um dos seus 8 núcleos), deverá ser capaz de lidar com um máximo de aproximadamente 4096 conexões concorrentes (clientes) a uma taxa total de pedidos de 32k pedidos/segundo.
MIT
| Variável | Tipo | Padrão | Descrição |
|---|
| PORT | Geral | 3000 | porta em que o PoW Shield escuta |
| SESSION_KEY | Geral | chave secreta para assinaturas de cookies, use uma única por razões de segurança, caso contrário qualquer pessoa pode forjar os seus cookies assinados | |
| BACKEND_URL | Geral | localização para encaminhar tráfego autenticado, aceita IP e URLs (aceita protocolo://url(:porta) ou protocolo://ip(:porta)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | host do serviço redis |
| DATABASE_PORT | Redis | 6379 | porta do serviço redis |
| DATABASE_PASSWORD | Redis | null | palavra-passe do serviço redis |
| POW | PoW | on | ativa/desativa a funcionalidade PoW (se não for temporariamente desligada, porque usar este projeto?) |
| NONCE_VALIDITY | PoW | 60000 | especifica o tempo máximo em segundos que um nonce pode ser submetido ao servidor após a geração (usado para forçar alteração de dificuldade e filtrar nonces obsoletos) |
| DIFFICULTY | PoW | 13 | dificuldade do problema, número de bits zero à esquerda no hash produzido (0:extremamente fácil ~ 256:impossível, 13(padrão) leva cerca de 5 segundos para o navegador calcular) |
| RATE_LIMIT | Limite de Taxa | on | ativa/desativa a funcionalidade de limite de taxa |
| RATE_LIMIT_SAMPLE_MINUTES | Limite de Taxa | 60 | especifica quantos minutos até as estatísticas serem reiniciadas para sessão/IP |
| RATE_LIMIT_SESSION_THRESHOLD | Limite de Taxa | 100 | número de pedidos que uma única sessão pode fazer até desencadear a revogação do token |
| RATE_LIMIT_BAN_IP | Limite de Taxa | on | ativa/desativa a funcionalidade de banimento de IP |
| RATE_LIMIT_IP_THRESHOLD | Limite de Taxa | 500 | número de pedidos que uma única sessão pode fazer até desencadear o banimento do IP |
| RATE_LIMIT_BAN_MINUTES | Limite de Taxa | 15 | número de minutos que o banimento do IP persiste |
| WAF | WAF | on | ativa/desativa a funcionalidade WAF |
| WAF_URL_EXCLUDE_RULES | WAF | regras a excluir ao verificar o URL do pedido, use ',' para separar números de regras, use '-' para especificar um intervalo (ex: 1,2-4,5,7-10) | |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | regras a excluir ao verificar o cabeçalho do pedido, use ',' para separar números de regras, use '-' para especificar um intervalo (ex: 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | regras a excluir ao verificar o corpo do pedido, use ',' para separar números de regras, use '-' para especificar um intervalo (ex: 1,2-4,5,7-10) | |
| SSL | SSL | off | ativa/desativa a funcionalidade SSL |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | caminho para a palavra-passe do certificado SSL |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | caminho para a chave SSL |
| SOCKET | Socket | off | ativa/desativa a funcionalidade socket |
| SOCKET_URL | Socket | localização do controlador PoW Phalanx, aceita IP e URLs (aceita protocolo://url:porta ou protocolo://ip:porta) | |
| SOCKET_TOKEN | Socket | token de subscrição para o controlador PoW Phalanx |
| Conexões Concorrentes | Latência Média | Taxa de Erro | Requisições/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 |
| Conexões Concorrentes | Latência Média | Taxa de Erro | Requisições/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 |