비밀번호 관리 · KYC 없음
Vaultwarden를 해외 VPS에 호스팅
직접 관리하는 서버에서, 프라이버시 친화적 관할권에 Bitwarden 호환 비밀번호 볼트를 구축하세요. 신원 정보 없이 암호화폐로 결제합니다.
설명
Vaultwarden은 Rust로 작성된 경량 비공식 Bitwarden 서버로, Bitwarden과 동일한 API를 사용합니다. 그래서 브라우저 확장 프로그램, 데스크톱, iOS/Android, CLI 등 모든 공식 Bitwarden 클라이언트가 문제없이 동기화됩니다. 비밀번호, 패스키, TOTP 시드, 카드 정보, 보안 메모를 암호화된 볼트에 저장하며, 조직(Organizations) 기능, 첨부파일, 관리자 제어 기능을 갖추고 있으면서도 공식 스택 대비 아주 적은 RAM만 사용합니다.
왜 해외에서 호스팅해야 할까요
비밀번호 볼트는 당신이 가진 가장 민감한 자산이므로, 어떤 암호화를 쓰는지 못지않게 누가 서버를 운영하고 어떤 법의 적용을 받는지도 중요합니다. KYC 없이 암호화폐로 결제하는 VPS를 프라이버시 등급 지역(NL/CH/RO/IS)에 두면, 암호화된 볼트가 저장된 서버가 당신의 법적 신원과 연결되지 않고, 미국/영국의 소환장 대상이 되지 않으며, 결제 서비스가 당신을 강제 퇴출시켜 계정이 잠기는 일도 없습니다.
배포
실제로 작동하는 참고 설정
이 내용을 새 ChainVPS 인스턴스에 붙여넣으세요. 자리표시자를 실제 값으로 교체한 뒤 실행하세요.
# 1) DNS: vault.example.com -> ChainVPS IP로 연결 (A/AAAA 레코드)
# 2) Argon2 ADMIN_TOKEN 생성 (평문 문자열을 사용하지 마세요):
# docker run --rm -it vaultwarden/server /vaultwarden hash
# 결과로 나온 '$argon2id$...' 문자열을 아래 ADMIN_TOKEN에 붙여넣으세요 (.env에서는 작은따옴표로 감싸기)
# 3) docker-compose.yml로 저장하고, 아래 Caddyfile을 만든 뒤: docker compose up -d
services:
vaultwarden:
image: vaultwarden/server:1.32.7
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com" # must match the public URL exactly
SIGNUPS_ALLOWED: "false" # create your account, then keep this false
INVITATIONS_ALLOWED: "true"
ADMIN_TOKEN: "${ADMIN_TOKEN}" # Argon2 hash from step 2, kept in .env
WEBSOCKET_ENABLED: "true" # live sync (served on the main port)
SENDS_ALLOWED: "true"
ROCKET_PORT: "80"
volumes:
- ./vw-data:/data # vaults, attachments, sqlite db, keys
networks: [vw]
# no host port published: only Caddy talks to it over the internal network
caddy:
image: caddy:2
container_name: vaultwarden-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
networks: [vw]
depends_on: [vaultwarden]
networks:
vw:
# ---- Caddyfile (같은 디렉터리) ----
# vault.example.com {
# encode gzip
# reverse_proxy vaultwarden:80
# }
# Caddy는 Let's Encrypt 인증서를 자동으로 발급하고 갱신합니다. Bitwarden 클라이언트는
# WebCrypto를 사용하며, 이는 보안 origin에서만 동작하므로 HTTPS는 필수입니다.
방화벽
열어야 할 포트
| 포트 | 프로토콜 | 용도 |
|---|---|---|
| 443 | TCP | HTTPS 볼트 + 클라이언트 동기화 + WebSocket(Caddy 경유); 공개해야 하는 유일한 포트 |
| 80 | TCP | HTTP -> HTTPS 리다이렉트 및 ACME/Let's Encrypt 인증서 발급 |
| 443 | UDP | 선택 사항: 더 빠른 클라이언트 동기화를 위한 HTTP/3(QUIC) |
적정 규모 산정
필요한 요금제
VPS Nano/Small (1 vCPU, 1-2 GB RAM)
Vaultwarden은 SQLite 기준으로 유휴 시 약 15-30 MB RAM만 사용하므로 Nano 플랜으로도 충분합니다. 대용량 첨부파일을 저장하지 않는 한 저장 공간도 매우 작습니다.
VPS Pro (2 vCPU, 4 GB RAM)
동시 동기화, 첨부파일 처리, 그리고 같은 서버에서 Caddy와 fail2ban, 백업까지 함께 돌릴 여유가 있습니다.
VPS Pro (상위 티어) 또는 입문형 Dedicated
SQLite에서 Postgres/MySQL로 전환하고 첨부파일은 Storage 플랜이나 더 큰 디스크에 두세요. 전용 CPU를 사용하면 부하가 걸려도 동기화 지연이 일정하게 유지됩니다.
추천 로케이션: 볼트를 위한 ChainVPS 프라이버시 등급 지역을 선택하세요: 스위스(CH)와 아이슬란드(IS)는 데이터 보호와 프라이버시 전통이 강하고, 네덜란드(NL)는 EU 개인정보 보호법 하에서 뛰어난 연결성을 제공하며, 루마니아(RO)나 몰도바(MD)는 가장 강도 높은 감시 정보 공유 동맹 바깥에 위치합니다. 볼트는 어차피 클라이언트 측에서 암호화되므로, 지연 시간을 최소화하려면 본인과 사용자들이 위치한 곳에서 지리적으로 가장 가까운 지역을 선택하세요.
보안을 강화하세요
보안 강화 체크리스트
- 계정을 생성한 뒤에는 SIGNUPS_ALLOWED=false를 유지하고 INVITATIONS를 통해 사용자를 추가하세요. 공개 볼트에 열려 있는 가입 엔드포인트는 악용의 표적이 됩니다.
- ADMIN_TOKEN은 항상 'vaultwarden hash'로 생성한 Argon2 해시로 설정하세요(평문 문자열 절대 금지). 설정이 끝난 뒤 ADMIN_TOKEN을 다시 비워두는 방식으로 /admin 패널 자체를 완전히 비활성화하는 것도 고려하세요. /admin을 본인 IP로만 방화벽 제한하는 것도 권장합니다.
- HTTPS만 강제하고 Let's Encrypt 인증서 관리는 Caddy에 맡기세요. Bitwarden 클라이언트는 순수 HTTP에서는 암호화 동작을 거부하며, 유효한 인증서는 동기화 시 다운그레이드/MITM 공격을 방지합니다.
- ./vw-data 디렉터리(특히 rsa_key.pem, config.json, db.sqlite3, 첨부파일)를 ChainVPS Storage 플랜 같은 외부 위치에 정기적으로 백업하세요. rsa_key.pem을 잃어버리면 기존의 모든 세션/토큰이 무효화됩니다.
- Vaultwarden 로그(LOG_FILE + LOG_LEVEL)에 대해 fail2ban을 운영해 무차별 대입 로그인 시도를 차단하고, 모든 사용자에게 2FA 활성화를 의무화하세요. ufw/nftables로 80/443 포트만 열고 나머지는 모두 차단하세요.
질문
호스팅 Vaultwarden — FAQ
Vaultwarden은 Bitwarden과 같은 것인가요?
아닙니다. Bitwarden API를 구현한 별개의 경량 서버입니다. Bitwarden Inc.가 만든 것은 아니지만 공식 Bitwarden 앱과 확장 프로그램이 문제없이 작동하며, 볼트, 조직, 첨부파일, Sends, 패스키를 모두 지원합니다. 공식 서버 스택만큼의 리소스를 쓰지 않으면서 셀프 호스팅하려는 개인과 소규모 팀에 이상적입니다.
서버가 압수되거나 호스트가 침해당해도 제 데이터는 안전한가요?
볼트는 마스터 비밀번호에서 파생된 키로 클라이언트 측에서 암호화 및 복호화되므로, 서버에는 오직 암호문만 저장됩니다. 프라이버시 친화적 관할권의 KYC 없는 서버에서 호스팅하면 접근을 강제할 수 있는 주체가 줄어들지만, 그럼에도 강력한 마스터 비밀번호를 사용하고 2FA를 활성화하며 DOMAIN을 HTTPS로 유지해 로그인 과정 자체를 보호해야 합니다.
HTTPS가 꼭 필요한가요, 아니면 그냥 IP만 써도 되나요?
유효한 인증서와 도메인 이름을 갖춘 HTTPS가 필요합니다. Bitwarden 클라이언트는 브라우저의 WebCrypto API를 사용하며, 이는 보안 origin에서만 동작하므로 순수 http:// 또는 IP만 사용하는 설정은 동기화에 실패합니다. 포함된 Caddy 서비스가 무료 Let's Encrypt 인증서를 자동으로 발급하고 갱신합니다.
SQLite와 MySQL/Postgres 중 무엇을 써야 하나요?
기본값인 SQLite는 개인 용도와 수십 명 규모의 소규모 팀까지는 충분히 빠르고 적합합니다. 대규모 다중 조직 배포이거나 중앙 집중식 DB 백업과 복제가 필요할 때만 MySQL이나 PostgreSQL로 전환하고, 그에 맞게 DATABASE_URL을 설정하세요.
공개 가입을 열지 않고 사용자를 추가하려면 어떻게 하나요?
SIGNUPS_ALLOWED=false와 INVITATIONS_ALLOWED=true를 유지한 상태에서 조직(Organization)이나 /admin 패널을 통해 사용자를 초대하세요. 초대받은 사용자는 공개 가입이 닫혀 있어도 초대를 받아 등록할 수 있으므로, 엔드포인트가 악용되는 것을 막을 수 있습니다.
신원 정보를 제공하지 않고 VPS 비용을 결제할 수 있나요?
네. ChainVPS는 KYC 없이 암호화폐를 결제 수단으로 받으므로, 암호화된 볼트를 저장하는 서버가 당신의 법적 신원이나 계정을 동결할 수 있는 카드 결제사에 연결되지 않습니다.