1P by neo 4달전 | favorite | 댓글 1개

WagWag의 주요 기능들

  • Wireguard에 MFA, 경로 제한, 장치 등록 기능 추가
    • MFA 인증이 필요한 경로나 항상 공개적으로 접근 가능한 경로 정의 가능
    • 새로운 클라이언트를 등록하기 위한 간단한 API 제공
    • 고가용성 지원
    • Webauthn, OIDC 등 다양한 MFA 옵션 제공
  • Aura Information Security에서 지원받아 개발됨

요구 사항

  • iptableslibpam이 설치되어 있어야 함
  • Wag는 iptableswireguard 장치를 관리하기 위해 root로 실행되어야 함
  • sysctl에서 포워딩이 활성화되어야 함
    sysctl -w net.ipv4.ip_forward=1
    
  • Wag는 커널이 wireguard를 지원하는 한 wg-quick 등이 필요하지 않음

설치 방법

바이너리 릴리스 (glibc 2.31+ 필요)

curl -L $(curl -s https://api.github.com/repos/NHAS/wag/releases/latest | jq -M -r '.assets[0].browser_download_url') -o wag
sudo ./wag gen-config
sudo ./wag start -config <generated_config_name>  

소스로부터 설치 (go1.19, npm, gulp, clang, llvm-strip, libbpf 필요)

git clone git@github.com:NHAS/wag.git
cd wag
make
cp example_config.json config.json
sudo ./wag start
  • 리버스 프록시 뒤에서 실행 중이라면 X-Forwarded-For를 설정해야 함

관리

루트 사용자는 아래와 같은 명령어로 wag 서버를 관리할 수 있음:

wag subcommand [-options]
  • 지원되는 하위 명령어들: start, cleanup, reload, version, firewall, registration, devices, users, webadmin, gen-config
  • 각 명령어에 대한 사용법 설명 제공

사용자 가이드

Wag 설치

  1. wag, config.json/opt/wag에 복사
  2. wg genkey로 wireguard 개인키 생성하여 예제 설정의 PrivateKey에 설정
  3. wag.service/etc/systemd/system/에 복사(또는 링크)하고 서비스를 시작/활성화

새 등록 토큰 생성

# ./wag registration -add -username tester

token,username
e83253fd9962c68f73aa5088604f3f425d58a963bfb5c0889cca54d63a34b2e3,tester

토큰 curl하기:

curl http://public.server.address/register_device/…

서비스가 완전한 형태의 응답을 반환함. 이를 config 파일로 저장 가능.

MFA 수행

사용자는 VPN 주소(예: 192.168.1.1:8080)에 접속하여 2FA 코드를 입력함. 설정 파일에서 세션 수명 지정 가능.

관리 콘솔에 로그인

ManagementUI.Enabledtrue로 설정하고 아래 명령어 실행:

sudo ./wag webadmin -add -username <your_username> -password <your-password-here>

관리용 리스닝 주소로 접속하여 인증 정보 입력. 웹 인터페이스로는 관리 사용자를 추가할 수 없음.

GN⁺의 의견

  • 클러스터링 기능을 통해 고가용성을 지원하는 것이 인상적이다. 재해 복구나 무중단 서비스에 유용할 것 같다.

  • 다양한 인증 방식을 지원하는 것도 좋은 점이다. TOTP, WebAuth, OIDC 등을 통해 기업의 인증 체계와 쉽게 통합할 수 있을 것 같다.

  • ACL 규칙을 유연하게 정의할 수 있어서, 세밀한 접근 제어가 가능해 보인다. 사용자/그룹별로 접근 가능한 IP, 포트, 프로토콜을 제한할 수 있다.

  • IPv6를 지원하지 않는 것이 아쉽다. 요즘은 IPv6 전환이 활발하니 빠른 지원이 필요해 보인다.

  • 리눅스에 특화된 VPN 솔루션을 찾는다면 좋은 선택지가 될 것 같다. 커널 5.9 이상의 최신 시스템에서 동작한다.

Hacker News 의견

요약:

  • 서버가 개인키를 생성하고 클라이언트에 전송하는 방식은 바람직하지 않음. 클라이언트가 개인키를 생성하고 공개키를 서버로 전송하는 것이 적절함.
  • 예제에서 HTTP 프로토콜을 사용하고 있는데, 보안상 적절하지 않으므로 HTTPS로 대체할 것을 제안함.
  • 세션 타임아웃 시 클라이언트가 이를 인지할 수 있는 방법이 필요함. 예를 들어 와이파이의 Captive Portal 감지 기능처럼 주기적으로 URL을 체크하여 상태를 확인하는 방법 등을 고려해 볼 수 있음.
  • WireGuard의 키는 영구 세션 키의 역할을 하므로, 완전한 VPN 서버 솔루션이 되기 위해서는 주기적인 세션 키 교체, 세션 종료, IP 주소 변경, 경로 설정, 필요시 인증 갱신 등의 추가 기능 구현이 필요함.
  • Head나 Tailscale과 유사한 점이 많은데, 기능 중복, 차이점, 구현 계획 등을 비교할 수 있는 자료가 있으면 좋겠음.
  • TOTP 코드에 대한 무차별 대입 공격(Brute-force Attack) 방지 대책이 마련되어야 함. 예를 들어 요청 속도 제한, 시도 횟수 제한 등의 방안을 고려해야 함.
  • WireGuard를 선택한 사이트라면 최신 설정을 사용할 것으로 예상되므로 IPv6의 ULA(Unique Local Address) 활용도가 높을 것임.