개요

Warden은 Rust로 작성된 올인원 리눅스 서버 보안 · 관리 패널입니다. 단일 바이너리로 설치되며 약 15MB 메모리만으로 동작합니다. 웹 브라우저에서 https://서버IP:9443으로 접속하여 사용합니다.

웹 서버는 Nginx 전용으로 운영되며, Warden 자체 서비스 레이어에서 WAF(Web Application Firewall) 기능을 수행합니다. 악성 요청 탐지, IP 차단, 국가별 필터링 등 모든 보안 동작은 Nginx 앞단의 Warden 서비스 레이어에서 nftables 규칙으로 직접 처리되어 커널 수준에서 패킷을 차단합니다.

지원 환경: RHEL 8/9, Rocky Linux, AlmaLinux, CentOS Stream (x86_64). SELinux enforcing 환경 완벽 호환. 웹 서버는 Nginx만 지원합니다 (Apache 미지원).

디렉토리 구조

/WardenRoot/ ← Warden 루트 디렉토리 ├── warden ← 실행 바이너리 ├── config.toml ← 주 설정 파일 ├── data/ │ └── panel.db ← SQLite 데이터베이스 ├── logs/ ← 서비스 로그 ├── ssl/ ← TLS 인증서 ├── vhost/ ← 가상호스트 설정 │ ├── nginx/ │ ├── rewrite/ │ └── ssl_saved/ ├── geoip/ ← GeoIP 데이터 ├── wwwroot/ ← 웹 문서 루트 ├── wwwlogs/ ← 웹 접근/에러 로그 └── backup/ ← 사이트 백업 아카이브

최초 접속

설치 후 브라우저에서 아래 주소로 접속합니다:

https://서버_IP:9443

기본 관리자 계정은 설치 시 설정한 config.toml의 [admin] 섹션에 정의됩니다.

# /WardenRoot/config.toml [admin] username = "admin" password = "YOUR_PASSWORD"
보안 주의: 설치 후 반드시 기본 비밀번호를 변경하세요. 로그인 페이지에는 캡차(CAPTCHA)가 적용되어 브루트포스 공격을 차단합니다.

로그인 화면에서 계정과 비밀번호, 캡차를 입력하면 대시보드로 이동합니다. TLS 인증서가 자체 서명(self-signed)이므로 브라우저 경고가 나타날 수 있습니다.

대시보드

로그인 후 첫 화면에 서버 상태가 표시됩니다:

항목설명
CPU / 메모리실시간 사용률 (%). 메모리는 총 용량 대비 사용 중인 비율.
디스크루트 파티션 사용량 및 남은 공간.
네트워크수신(RX) / 송신(TX) 트래픽 누적량.
시스템 정보OS 버전, 커널, Warden 버전, 가동 시간(uptime).
방화벽 상태nftables 활성 여부, 차단된 IP 수.
서비스 상태Nginx, PHP-FPM, MariaDB 등 주요 서비스 동작 상태.

방화벽 관리

Warden은 자체 서비스 레이어에서 방화벽을 관리합니다. 외부 모듈이나 Nginx 플러그인에 의존하지 않고, Warden 프로세스가 직접 nftables 규칙을 생성·적용하여 커널 레벨에서 패킷을 차단합니다. 포트 열기/닫기, IP/CIDR 차단, 국가별 접근 제어를 웹 UI에서 설정하면 즉시 적용되며 서버 재시작 후에도 유지됩니다.

차단 구조: 악성 트래픽 → nftables(커널)에서 DROP → Nginx까지 도달하지 않음. 웹 애플리케이션 레벨이 아닌 네트워크 레벨 차단이므로 서버 리소스 소모가 극히 적습니다.

포트 제어

보안 메뉴 → 방화벽 탭에서 포트를 관리합니다.

동작설명
포트 열기번호, 프로토콜(TCP/UDP/BOTH), 메모를 입력 후 추가합니다. 범위 지정 가능(예: 8000-8100).
포트 닫기목록에서 해당 포트 삭제 버튼을 클릭합니다. 즉시 차단됩니다.
기본 열린 포트: 22(SSH), 80(HTTP), 443(HTTPS), 9443(Warden 패널). Warden 패널 포트(9443)를 닫으면 원격 접근이 차단되므로 주의하세요.

IP/CIDR 차단

특정 IP 또는 대역을 차단하거나 화이트리스트에 추가합니다.

# 차단 예시 단일 IP: 192.168.1.100 CIDR: 10.0.0.0/8 IPv6: 2001:db8::/32

화이트리스트에 등록된 IP는 블랙리스트 자동 등록에서 제외됩니다.

국가별 차단

GeoIP 데이터베이스를 기반으로 특정 국가의 접근을 차단합니다. 국가 코드(ISO 3166-1 alpha-2)를 선택하면 해당 국가의 모든 IP 대역이 차단됩니다.

주의: GeoIP 데이터는 100% 정확하지 않을 수 있습니다. VPN이나 프록시를 통한 접근은 차단되지 않습니다.

블랙리스트

자동 탐지 · 차단

Warden의 자체 서비스 레이어가 다양한 소스에서 악성 IP를 실시간으로 탐지하고, nftables 규칙에 자동 등록하여 커널 수준에서 차단합니다:

  • SSH 브루트포스 — 반복 로그인 실패 감지 (journalctl 실시간 모니터링)
  • 웹 공격 — Nginx 접근/에러 로그에서 악성 요청 패턴 탐지 (SQL Injection, XSS, 경로 탐색 등)
  • 포트 스캔 — 짧은 시간 내 다수 포트 접속 시도 감지
동작 방식: Warden 서비스가 로그를 실시간 감시 → 위협 탐지 → nftables blocklist set에 IP 추가 → 커널에서 즉시 DROP. Nginx 모듈이나 외부 WAF가 아닌 Warden 자체 엔진이 처리합니다.

블랙리스트에 등록된 IP는 보안 → 블랙리스트 탭에서 확인할 수 있습니다. 각 항목에는 IP, 국가, 사유, 히트 수, 최초/최종 탐지 시각이 표시됩니다.

외부 공유 API

블랙리스트를 다른 서버와 공유할 수 있습니다. config.toml의 [share] 섹션에서 활성화합니다:

# /WardenRoot/config.toml [share] enabled = true token = "64자리_헥스_토큰" allow_ingest = false # true: 외부에서 IP 수집 허용
엔드포인트설명
GET /api/v1/blacklist.txt평문(IP 한 줄씩) 피드. nftables/iptables에 바로 사용 가능.
GET /api/v1/blacklistJSON 형식. ?since=타임스탬프로 증분 조회.
POST /api/v1/blacklist외부 IP 수집 (Ingest). allow_ingest=true 필요.

인증: X-API-Key 헤더, Authorization: Bearer, 또는 ?token= 쿼리 파라미터.

# 다른 서버에서 블랙리스트 동기화 (cron 5분) $ curl -sH "X-API-Key:YOUR_TOKEN" \ https://warden-server:9443/api/v1/blacklist.txt \ | grep -v '^#' | while read ip; do nft add element inet filter blocklist {$ip} done

웹사이트 관리

좌측 메뉴의 사이트에서 Nginx 기반 웹사이트를 생성/관리합니다. 각 사이트는 독립된 Nginx vhost 설정으로 운영됩니다.

사이트 생성

  1. 사이트 목록 화면에서 사이트 추가 클릭
  2. 사이트 이름(영문), 도메인, 문서 루트 경로를 입력
  3. PHP 버전 선택 (선택사항, 설치된 PHP만 표시)
  4. 생성 버튼 클릭 → Nginx 설정 자동 생성 + 문법 검증 + reload
자동 처리: 문서 루트 디렉토리가 없으면 자동 생성되며, 기본 index.html 환영 페이지가 배치됩니다. 방화벽에 포트도 자동 등록됩니다.

SSL 인증서

사이트 관리 모달 → SSL 탭에서 관리합니다:

  • Let's Encrypt — acme.sh를 통한 자동 발급 (HTTP-01 검증)
  • DNS API — Cloudflare 등 DNS 제공자 API로 와일드카드 인증서 발급
  • 수동 업로드 — 인증서와 키 파일 직접 붙여넣기
  • HTTPS 강제 — HTTP → HTTPS 301 리다이렉트 활성화
  • HSTS — Strict-Transport-Security 헤더 설정

리버스 프록시

사이트 관리 → 리버스 프록시 탭에서 백엔드 서버 프록시를 설정합니다:

# 프록시 설정 예시 경로(Location): /api 대상 URL: http://127.0.0.1:3000

여러 개의 프록시 규칙을 추가할 수 있습니다. WebSocket 지원이 필요하면 추가 Nginx 설정에서 헤더를 지정합니다.

보안 설정

사이트별 보안 옵션을 관리합니다:

기능설명
HTTP 인증Basic Auth(아이디/비밀번호)를 사이트 전체 또는 특정 경로에 적용.
핫링크 방지외부 사이트에서 이미지/파일 직접 링크를 차단 (Referer 검증).
보안 헤더X-Frame-Options, X-Content-Type-Options, CSP 등 응답 헤더 설정.
open_basedirPHP 파일 접근 범위를 문서 루트로 제한.
실행경로 보호업로드 디렉토리에서 PHP 실행 차단.

백업/복원

사이트 관리 → 백업 탭에서 수동 백업을 생성합니다:

  • 사이트 전체 파일을 tar.gz로 압축 (/WardenRoot/backup/sites/사이트명/)
  • 백업 목록에서 다운로드 또는 복원 가능
  • 데이터베이스도 함께 관리 (MariaDB/MySQL 자동 감지)

소프트웨어 스토어

좌측 메뉴 소프트웨어에서 서버 소프트웨어를 소스 빌드로 설치/관리합니다.

설치 · 관리

분류소프트웨어
웹 서버Nginx
PHPPHP 7.4 ~ 8.3 (다중 버전 병렬 설치)
데이터베이스MariaDB, MySQL, PostgreSQL, Redis, Memcached, MongoDB
런타임Node.js, Python, Go, Java (OpenJDK)
도구phpMyAdmin, Pure-FTPd

설치 과정:

  1. 원하는 소프트웨어의 설치 버튼 클릭
  2. 버전 선택 (가용 버전 목록 표시)
  3. 백그라운드 소스 빌드 시작 (진행률 표시, DB 태스크 큐 사용)
  4. 빌드 완료 시 systemd 서비스 자동 등록 + 시작
빌드 의존성: 소스 빌드에는 gcc, make 등 개발 도구가 필요합니다. RHEL 계열에서는 CRB + EPEL 저장소 활성화가 필요합니다:
$ dnf config-manager --set-enabled crb $ dnf install -y epel-release $ dnf groupinstall -y "Development Tools"

성능 튜닝

설치된 소프트웨어의 설정 파일을 웹 UI에서 최적화합니다. 소프트웨어 관리 모달 → 성능조정 탭:

  • 현재값 확인 — 설정 파일의 현재 파라미터 값을 표시
  • 자동 권장값 — 서버 메모리/CPU 기반 최적 값 계산 후 제안
  • 개별 조정 — 각 파라미터를 직접 수정 가능
  • 저장 — 설정 파일 쓰기 → 문법 검증 → 서비스 reload (실패 시 자동 롤백)
소프트웨어주요 튜닝 항목
PHPmemory_limit, upload_max_filesize, max_execution_time, max_input_vars
Nginxworker_processes, worker_connections, keepalive_timeout, client_max_body_size
MariaDBinnodb_buffer_pool_size, max_connections, key_buffer_size, table_open_cache
Redismaxmemory, maxmemory-policy, maxclients, tcp-keepalive
안전 보장: 설정 적용 전 원본 파일이 .warden.bak으로 백업됩니다. 문법 검증 실패 시 원본으로 자동 롤백되므로 서비스 중단 없이 안전하게 튜닝할 수 있습니다.

프로젝트 배포

Node.js 프로젝트

좌측 메뉴 Node.js에서 프로젝트를 생성/관리합니다:

  1. 프로젝트 생성 — 이름, 경로, 포트, 실행 명령, 환경변수 입력
  2. 도메인을 지정하면 자동으로 사이트 + 리버스 프록시 생성
  3. systemd 서비스(warden-node-프로젝트명.service)로 등록
  4. 시작/중지/재시작 제어 + 로그 실시간 확인
# 자동 생성되는 systemd 서비스 예시 [Service] Environment=PORT=3000 Environment=NODE_ENV=production ExecStart=/bin/sh -lc "npm start" WorkingDirectory=/WardenRoot/wwwroot/myapp

Java 프로젝트

좌측 메뉴 Java에서 JAR 또는 Tomcat 프로젝트를 배포합니다:

모드설명
JAR 모드java [jvm_opts] -jar app.jar로 직접 실행
Tomcat 모드catalina.sh run으로 실행, WAR 자동 배치(webapps/ROOT.war)

Node.js와 동일하게 systemd 서비스로 관리되며, 도메인 연결 시 프록시가 자동 생성됩니다.

보안 센터

좌측 메뉴 보안에서 서버 보안 상태를 종합적으로 관리합니다.

악성코드 스캔

사이트 관리 → 스캔 탭에서 웹 루트 디렉토리의 악성 파일을 검사합니다:

  • CMS 식별 — WordPress, Drupal, Joomla, Magento, Laravel, ThinkPHP 자동 감지 + 버전 추출
  • 웹셸 스캔 — 26종의 악성 코드 시그니처 패턴 매칭
  • 대상: .php, .js, .html 등 실행 가능 파일
  • 최대 30,000 파일 / 파일당 3MB / 결과 300건 제한 (심볼릭 링크 무시)

보안 점수

서버 보안 설정을 자동으로 분석하여 100점 만점의 점수를 산출합니다. 도넛 차트로 시각화되며, 점수에 따라 색상이 변경됩니다:

점수등급색상
80 ~ 100안전녹색
60 ~ 79양호파랑
40 ~ 59주의주황
0 ~ 39위험빨강

로그 모니터링

좌측 메뉴 로그에서 각종 시스템 및 서비스 로그를 확인합니다:

  • Warden 로그 — 패널 자체 접근/오류 로그
  • 시스템 로그 — journalctl 기반 시스템 메시지
  • Nginx 로그 — 사이트별 접근/에러 로그 실시간 확인
  • 서비스 로그 — PHP-FPM, MariaDB 등 서비스별 로그

로그 파일은 /WardenRoot/logs/ 및 /WardenRoot/wwwlogs/에 저장됩니다.

설정 파일

config.toml

Warden의 주 설정 파일은 /WardenRoot/config.toml에 위치합니다. 수정 후 서비스를 재시작해야 적용됩니다.

# /WardenRoot/config.toml 주요 설정 # 패널 기본 설정 [server] host = "0.0.0.0" # 바인딩 주소 port = 9443 # HTTPS 포트 # 관리자 계정 [admin] username = "admin" password = "변경하세요" # TLS 인증서 (빈 값이면 자체 서명 사용) [tls] cert = "" key = "" # 방화벽 (nftables) [firewall] enforce = true # 방화벽 규칙 강제 적용 # 블랙리스트 공유 [share] enabled = false token = "" allow_ingest = false # GeoIP 데이터 경로 [geoip] path = "" # 빈 값이면 /WardenRoot/geoip/ 사용

서비스 관리

Warden은 systemd 서비스(warden.service)로 실행됩니다:

# 서비스 상태 확인 $ systemctl status warden # 서비스 재시작 (설정 변경 후) $ systemctl restart warden # 부팅 시 자동 시작 설정 $ systemctl enable warden # 로그 확인 $ journalctl -u warden -f # 업데이트 (새 바이너리 교체) $ systemctl stop warden $ cp /tmp/warden-new /WardenRoot/warden $ restorecon /WardenRoot/warden # SELinux $ systemctl start warden
SELinux 필수: /WardenRoot/warden 바이너리는 기본 default_t 컨텍스트라 systemd 실행 시 Permission denied가 발생합니다. 반드시 bin_t 레이블을 적용하세요:
$ semanage fcontext -a -t bin_t /WardenRoot/warden $ restorecon -v /WardenRoot/warden

문제 해결

증상원인 · 해결
패널 접속 불가 systemctl status warden으로 서비스 상태 확인.
방화벽에서 9443 포트가 열려 있는지 확인: nft list ruleset | grep 9443
203/EXEC 오류 SELinux 컨텍스트 문제. semanage fcontext -a -t bin_t /WardenRoot/warden 후 restorecon /WardenRoot/warden 실행.
인증서 발급 실패 도메인이 서버 IP를 가리키는지 확인. 80 포트가 열려 있어야 HTTP-01 검증 가능. acme.sh --issue -d 도메인 --debug로 상세 로그 확인.
소프트웨어 빌드 실패 -devel 패키지 누락 가능성. CRB/EPEL 저장소 활성화 확인: dnf config-manager --set-enabled crb && dnf install epel-release
Nginx reload 실패 nginx -t로 설정 문법 검증. Warden은 실패 시 자동 롤백하므로 원본 설정이 유지됩니다. 로그: /WardenRoot/wwwlogs/
블랙리스트 공유 403 config.toml [share]에서 enabled = true, 토큰이 설정되어 있는지 확인. 요청 시 토큰 전달 방식 확인.
비밀번호 분실 config.toml의 [admin] 비밀번호를 직접 수정 후 systemctl restart warden으로 재시작.
추가 도움이 필요하면: journalctl -u warden --since "1 hour ago"로 최근 로그를 확인하거나, GitHub Issues에 로그와 함께 문의하세요.