
Layer 7 DDoS 방어를 위해 작업 증명(Proof of Work)을 사용하는 프로젝트로, 추가로 WAF 및 컨트롤러를 포함합니다. 전체 기능 세트를 갖추고 있으며 컨테이너화되어 빠르고 가벼운 배포가 가능합니다.
PoW Shield는 작업 증명(proof of work)을 활용하여 백엔드 서비스와 최종 사용자 간의 프록시 역할을 함으로써 OSI 애플리케이션 계층에서 DDoS 보호를 제공합니다. 이 프로젝트는 Google의 ReCaptcha와 같은 일반적인 안티-DDoS 방법에 대한 대안을 제공하는 것을 목표로 하며, ReCaptcha는 항상 해결하기 어려운 문제였습니다. PoW Shield로 보호되는 웹 서비스에 접속하는 것은 그 어느 때보다 쉬워졌습니다. URL로 이동하기만 하면 브라우저가 자동으로 나머지 인증을 수행합니다.
PoW Shield는 단일 웹앱/도커 이미지에 번들로 제공되는 다음 서비스를 제공하는 것을 목표로 합니다:
(신규) LinkedIn 게시글
PoW Phalanx 컨트롤러를 통해 지원:
Go로 구현된 대체 버전 PoW-Shield-Go (작업 중) – 스트레스 테스트 및 향후 최적화된 프로덕션 버전용.
기본적으로 PoW Shield는 실제 웹 앱/서비스 앞에서 프록시 역할을 합니다. 작업 증명을 통해 인증을 수행하고 인증된 트래픽만 실제 서버로 전달합니다. 프록시는 쉽게 설치할 수 있으며 WAF를 통해 보안 수준이 낮은 애플리케이션도 보호할 수 있습니다.
사용자가 PoW Shield로 보호되는 웹 서비스를 탐색할 때 백그라운드에서 일어나는 일은 다음과 같습니다:
다음 방법을 통해 PoW Shield를 구성할 수 있습니다.
# 저장소 복제
git clone https://github.com/RuiSiang/PoW-Shield.git
# 의존성 설치
npm install
# 설정 구성
cp -n .env.example .env
# .env 편집
nano .env
# 트랜스파일
npm run build
#############################################
# 데이터베이스(redis)와 함께 실행, 권장 및 더 빠름 #
# 먼저 redis 설치 #
# sudo apt-get install redis-server #
#############################################
npm start
#############################################
#############################################
# 데이터베이스 없이 실행 (mock redis) #
#############################################
npm run start:standalone # linux
npm run start:standalone-win # windows
#############################################
# 기능 테스트(선택 사항)
npm test
####################################################
# 데이터베이스(redis)와 함께 Docker 실행, 권장 및 더 빠름 #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -d ruisiang/pow-shield
####################################################
####################################################
# 데이터베이스 없이 Docker 실행 (mock redis) #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -e NODE_ENV="standalone" -d ruisiang/pow-shield
####################################################
####################################################
# Docker Compose #
####################################################
# docker-compose.example.yaml 복사
cp -n docker-compose.example.yaml docker-compose.yaml
# docker-compose.yaml 편집
nano docker-compose.yaml
# 컨테이너 시작
docker-compose -f docker-compose.yaml up
####################################################
참고: 이 기능은 컨테이너화되지 않은 버전의 PoW Shield에서만 작동하며, 테스트를 실행할 때 시스템이 불안정해질 수 있습니다.
# 스트레스 테스트 시작
npm run stress
# .env에서 PORT 변수를 변경한 경우 스트레스 테스트 스크립트에서 target 변수도 변경해야 합니다.
nano scripts/stress.sh
다음 테스트는 i7-10870H CPU의 단일 스레드에서 각 동시 매개변수에 대해 60초 기간 동안 수행되었습니다.
위 샘플에서 PoW Shield의 적절한 최대 부하 추정치는 약 512개의 동시 연결임을 알 수 있습니다. 이후 오류율과 지연 시간이 정상 허용 범위를 넘어 악화됩니다. 따라서 머신의 부하 분산 환경(8개 코어 각각에 1개의 PoW Shield 인스턴스)에서는 총 요청 속도 32k requests/second로 약 4096개의 동시 연결(클라이언트)을 최대로 처리할 수 있어야 합니다.
MIT
| 변수 | 유형 | 기본값 | 설명 |
|---|
| PORT | 일반 | 3000 | PoW Shield가 수신 대기하는 포트 |
| SESSION_KEY | 일반 | 쿠키 서명을 위한 비밀 키, 보안상 고유한 키를 사용하십시오. 그렇지 않으면 누구나 서명된 쿠키를 위조할 수 있습니다. | |
| BACKEND_URL | 일반 | 인증된 트래픽을 전달할 위치, IP와 URL 모두 허용 (protocol://url(:port) 또는 protocol://ip(:port) 형식) | |
| DATABASE_HOST | Redis | 127.0.0.1 | Redis 서비스 호스트 |
| DATABASE_PORT | Redis | 6379 | Redis 서비스 포트 |
| DATABASE_PASSWORD | Redis | null | Redis 서비스 비밀번호 |
| POW | PoW | on | PoW 기능 켜기/끄기 (일시적으로 끄지 않는다면 이 프로젝트를 사용할 이유가 없습니다?) |
| NONCE_VALIDITY | PoW | 60000 | 논스가 생성된 후 서버에 제출되어야 하는 최대 시간(밀리초)을 지정합니다. (난이도 변경을 강제하고 오래된 논스를 필터링하는 데 사용) |
| DIFFICULTY | PoW | 13 | 문제 난이도, 생성된 해시의 선행 0비트 수 (0:매우 쉬움 ~ 256:불가능, 기본값 13은 브라우저에서 계산하는 데 약 5초 소요) |
| RATE_LIMIT | 속도 제한 | on | 속도 제한 기능 켜기/끄기 |
| RATE_LIMIT_SAMPLE_MINUTES | 속도 제한 | 60 | 세션/IP 통계가 재설정될 때까지의 시간(분) |
| RATE_LIMIT_SESSION_THRESHOLD | 속도 제한 | 100 | 단일 세션이 토큰 철회를 유발할 때까지 수행할 수 있는 요청 수 |
| RATE_LIMIT_BAN_IP | 속도 제한 | on | IP 차단 기능 켜기/끄기 |
| RATE_LIMIT_IP_THRESHOLD | 속도 제한 | 500 | 단일 세션이 IP 차단을 유발할 때까지 수행할 수 있는 요청 수 |
| RATE_LIMIT_BAN_MINUTES | 속도 제한 | 15 | IP 차단이 지속되는 시간(분) |
| WAF | WAF | on | WAF 기능 켜기/끄기 |
| WAF_URL_EXCLUDE_RULES | WAF | 요청 URL을 검사할 때 확인하지 않을 규칙, 쉼표(,)로 규칙 번호를 구분하고, '-'로 범위를 지정 (예: 1,2-4,5,7-10) | |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | 요청 헤더를 검사할 때 확인하지 않을 규칙, 쉼표(,)로 규칙 번호를 구분하고, '-'로 범위를 지정 (예: 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | 요청 본문을 검사할 때 확인하지 않을 규칙, 쉼표(,)로 규칙 번호를 구분하고, '-'로 범위를 지정 (예: 1,2-4,5,7-10) | |
| SSL | SSL | off | SSL 기능 켜기/끄기 |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | SSL 인증서 파일 경로 |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | SSL 키 파일 경로 |
| SOCKET | 소켓 | off | 소켓 기능 켜기/끄기 |
| SOCKET_URL | 소켓 | PoW Phalanx 컨트롤러 위치, IP와 URL 모두 허용 (protocol://url:port 또는 protocol://ip:port 형식) | |
| SOCKET_TOKEN | 소켓 | PoW Phalanx 컨트롤러용 구독 토큰 |
| 동시 연결 수 | 평균 지연 시간 | 오류율 | 초당 요청 수 |
|---|
| 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 |
| 동시 연결 수 | 평균 지연 시간 | 오류율 | 초당 요청 수 |
|---|
| 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 |