# Show HN: WireGuard용 Wag 다중 요소 인증 및 등록 시스템

> Clean Markdown view of GeekNews topic #14786. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14786](https://news.hada.io/topic?id=14786)
- GeekNews Markdown: [https://news.hada.io/topic/14786.md](https://news.hada.io/topic/14786.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-13T10:28:16+09:00
- Updated: 2024-05-13T10:28:16+09:00
- Original source: [github.com/NHAS](https://github.com/NHAS/wag)
- Points: 1
- Comments: 1

## Topic Body

### WagWag의 주요 기능들

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

### 요구 사항

- `iptables`와 `libpam`이 설치되어 있어야 함 
- Wag는 `iptables`와 `wireguard` 장치를 관리하기 위해 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:8080/register_device?key=e83253fd9962c68f73aa5088604f3f425d58a963bfb5c0889cca54d63a34b2e3
```

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

#### MFA 수행

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

#### 관리 콘솔에 로그인

`ManagementUI.Enabled`를 `true`로 설정하고 아래 명령어 실행:

```
sudo ./wag webadmin -add -username <your_username> -password &lt;your-password-here&gt;
```

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

### GN⁺의 의견

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

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

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

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

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

## Comments



### Comment 25187

- Author: neo
- Created: 2024-05-13T10:28:19+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40326615) 
요약:

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