2022년 LastPass 해킹 사건은 경각심을 일깨워 주었습니다. 암호화된 볼트(vault)를 사용하더라도 내 통제권 밖에 있는 서버에 볼트가 저장되어 있다면 여전히 위험할 수 있다는 사실을 깨달았습니다.
몇 년이 걸렸지만, 마침내 비밀번호 보호를 외부 서비스에 의존하지 않기로 결정했습니다. 저는 Vaultwarden을 선택하여 Linux Mint 서버에 비밀번호 관리자를 구축했습니다. 1시간도 채 걸리지 않은 이 작업은 디지털 보안을 바라보는 제 관점을 완전히 바꾸어 놓았으며, 흥미롭게도 추가 비용은 전혀 들지 않았습니다.
Vaultwarden 대 공식 Bitwarden 서버
대부분의 셀프 호스팅 설정에서 경량 옵션을 선택하는 이유
Bitwarden을 셀프 호스팅하는 방법에는 두 가지가 있으며, 둘 다 무료 오픈 소스이지만 각각 적합한 환경이 다릅니다.
공식 Bitwarden 서버를 가정에서 호스팅하는 것도 가능하지만, 이상적인 방법은 아닙니다. 이 버전은 엔터프라이즈급으로 설계되어 실제 인프라 환경을 전제로 합니다. 여러 동시 실행 서비스를 포함하는 .NET 스택을 사용하므로, 사양이 낮은 하드웨어에서는 속도가 느리고 복잡하여 단일 사용자에게는 과도합니다.
두 번째 옵션은 커뮤니티에서 구축한 Rust 기반의 Vaultwarden입니다. 비공식 빌드이지만 공식 Bitwarden 앱이 통신하는 것과 동일한 API를 제공합니다. 덕분에 자신의 서버에서 실행하면서도 모든 기기에서 완벽한 Bitwarden 경험을 누릴 수 있습니다.
또한 Vaultwarden은 긴급 액세스, TOTP 기반 2단계 인증, 암호화된 파일 첨부 등 일반적으로 Bitwarden 유료 티어에서만 제공되는 기능들을 기본으로 포함하고 있습니다.
개인 셀프 호스팅 환경에서 두 방식을 비교하면 다음과 같습니다.
| 기능 | Bitwarden 서버 (셀프 호스팅) | Vaultwarden |
|---|---|---|
| 비용 | 무료 | 무료 |
| RAM 요구 사항 | 2GB 이상 권장 | 약 100MB 사용 |
| 설정 복잡도 | 높음 (여러 서비스) | 보통 (단일 컨테이너) |
| 프리미엄 기능 | 대부분 무료 (클라우드 서비스는 구독 필요) | 무료 포함 |
| 최적의 대상 | 팀 및 조직 | 개인 또는 가족 사용 |
##### Vaultwarden
개발자 Daniel García
가격 모델 무료, 오픈 소스
Vaultwarden은 저사양 서버에서도 효율적으로 실행되도록 설계된, Bitwarden 클라이언트와 호환되는 경량 셀프 호스팅 비밀번호 관리자입니다.
시작하기 전에 실제로 필요한 것
대부분 이미 갖추고 있을 것입니다
Bitwarden 셀프 호스팅을 시작하기 전에는 필요한 사양을 과대평가했었습니다. 하지만 결과적으로 일반 Linux Mint 컴퓨터에서도 문제없이 작동했습니다. 512MB의 RAM만 있어도 무리 없이 호스팅할 수 있으며, Raspberry Pi에서도 충분히 가능합니다.
다행히 Docker 및 Docker Compose와 같은 로컬 셀프 호스팅 도구를 사용하면 Vaultwarden 인스턴스를 컨테이너화하여 실행할 수 있습니다. 이는 의존성 충돌을 줄이는 가장 이상적인 방법입니다.
그다음에는 볼트에 어떻게 접근할지 결정해야 합니다. 로컬 네트워크를 사용하는 것은 간단하고 안전하지만, 집 안에서만 볼트에 접근할 수 있습니다. Tailscale을 통한 VPN 액세스를 사용하면 서버를 공용 인터넷에 노출하지 않고도 원격 연결이 가능합니다. 마지막으로 공용 인터넷에 직접 노출하는 방법도 있습니다. 이 방법은 가장 편리하지만 보안 위험이 가장 큽니다.
선택하는 액세스 방식에 따라 설정 시 도메인 이름이 필요한지 결정됩니다. 로컬 및 VPN 액세스는 도메인 이름이 필요하지 않지만, 서비스를 공용 인터넷에 노출하여 유효한 HTTPS를 얻으려면 도메인이 필수입니다.
액세스 방식과 관계없이 HTTPS는 반드시 필요합니다. 저는 TLS 인증서를 자동으로 관리해 주는 리버스 프록시인 Caddy를 선호합니다.
관련 기사
Google 비밀번호 관리자를 그만두었습니다: 대신 사용하는 것은 이것입니다
아직도 Google 비밀번호 관리자를 사용하고 계신다면, 많은 것을 놓치고 계신 겁니다.
Vaultwarden 설정하기
제가 사용한 정확한 설정과 중요한 보안 단계
먼저 아래 명령어를 실행하여 ADMIN_TOKEN을 위한 안전한 Argon2id 해시를 생성했습니다. 생성된 해시는 관리자 패널의 열쇠가 되므로 잘 복사해 두었습니다.
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
그런 다음, 백업을 쉽게 하기 위해 홈 디렉토리에 전용 폴더를 만들었습니다.
mkdir ~/vaultwarden && cd ~/vaultwarden
mkdir vw-data
민감한 정보를 저장할 .env 파일을 생성했습니다. 아래 코드 스니펫을 복사하여 플레이스홀더를 자신의 해시로 바꾸면 됩니다.
# Change this to your actual domain
DOMAIN=https://vault.yourdomain.com
# Use the hash you generated in Step 1
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$YourHashHere'
# Set SIGNUPS_ALLOWED=true for the initial setup. After you create your admin account, change it to SIGNUPS_ALLOWED=false
SIGNUPS_ALLOWED=true
이 작업이 완료되면 docker-compose.yml 파일을 생성하고 아래 내용을 포함했습니다.
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8080:80" # Only accessible via the local machine/proxy
초기 단계 이후, Docker Compose 컨테이너는 로컬 머신의 8080 포트에서만 접근 가능합니다. 이를 해결하기 위해 Docker 컨테이너 앞에 리버스 프록시인 Caddy를 설치하여, HTTPS가 적용된 도메인을 통해 어떤 브라우저에서든 볼트에 접근할 수 있도록 했습니다. 다음 명령어를 사용하여 Caddy를 설치했습니다.
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
Caddy는 [Let’s Encrypt](https://letsencrypt.org/)를 사용하여 SSL 인증서를 자동으로 처리하므로, 수동으로 인증서를 생성하거나 갱신할 필요가 없습니다. 설치가 완료된 후 `sudo nano /etc/caddy/Caddyfile` 명령어로 Caddy 설정 파일을 열고, 아래 줄을 추가했습니다(도메인 부분은 본인의 도메인으로 변경하세요).
vault.yourdomain.com {
reverse_proxy localhost:8080
}
위 설정 파일을 통해 Caddy는 모든 들어오는 트래픽을 처리하여 Vaultwarden으로 전달하고, 도메인에 대한 새 SSL 인증서를 요청 및 갱신합니다. `sudo systemctl reload caddy` 명령어로 Caddy를 다시 로드하면 이제 Vaultwarden에 접속할 준비가 된 것입니다. 다음 단계를 그대로 따라 하세요. 도메인으로 이동하여 계정을 생성합니다. 처음에 생성한 .env 파일을 열고 `SIGNUPS_ALLOWED=true`를 `SIGNUPS_ALLOWED=false`로 변경합니다. `docker compose up -d –force-recreate` 명령어를 사용하여 컨테이너를 재시작합니다. vault.yourdomain.com/admin으로 이동하여 슈퍼 관리자 페이지에 접속한 뒤, 생성했던 Argon2id 해시를 비밀번호로 사용하여 로그인합니다. 이제 Vaultwarden을 본격적으로 사용할 준비가 모두 끝났습니다. ### 실제로 매일 사용해 본 소감 Bitwarden 클라우드 버전과 사용 경험이 매우 유사합니다. 동일한 앱과 확장 프로그램을 그대로 사용할 수 있기 때문에 차이를 거의 느끼지 못합니다. 하지만 가장 큰 장점은 모든 볼트 작업이 내 머신에서, 내 통제하에 이루어진다는 점입니다. 더 중요한 것은 Bitwarden 서비스에 장애가 발생하더라도 저는 전혀 영향을 받지 않는다는 것입니다. 물론 가동 시간과 업데이트는 직접 관리해야 합니다. 업데이트하려면 일반적으로 새 Docker 이미지를 가져와 컨테이너를 재시작하면 됩니다. 데이터에 대한 완전한 통제권 덕분에 이러한 추가적인 설정과 유지보수는 충분히 가치가 있습니다. Vaultwarden은 이제 제가 없어서는 안 될 필수 셀프 호스팅 서비스가 되었습니다.          