Vaultwarden: ระบบจัดการรหัสผ่านองค์กรที่ใช้แอป Bitwarden ได้
คำตอบสั้น ๆ: ติดตั้ง Vaultwarden ด้วย Docker Compose เป็นระบบจัดการรหัสผ่านของทีมที่ใช้แอป Bitwarden ได้ พร้อม HTTPS, ADMIN_TOKEN แบบ Argon2 ปิดการสมัครเอง และสำรองข้อมูล
คู่มือนี้อธิบาย Vaultwarden ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Vaultwarden คือเซิร์ฟเวอร์จัดการรหัสผ่านแบบโอเพนซอร์สที่เขียนด้วยภาษา Rust ใช้ทรัพยากรน้อย และรองรับแอป Bitwarden ทุกตัว ทั้ง browser extension, desktop และแอปมือถือ องค์กรจึงได้ระบบเก็บรหัสผ่านที่แชร์กันเป็นทีมผ่าน Organization และ Collection โดยข้อมูลทั้งหมดอยู่บนเซิร์ฟเวอร์ของตัวเอง (โครงการนี้พัฒนาโดยชุมชน ไม่ใช่ผลิตภัณฑ์ทางการของ Bitwarden)
เมื่อทำตามคู่มือนี้จบ คุณจะมี Vaultwarden ที่รันด้วย Docker Compose หลัง HTTPS, หน้า /admin ที่ป้องกันด้วยโทเคนแบบ Argon2, ปิดการสมัครเองแล้วเชิญผู้ใช้ทางอีเมลแทน และสคริปต์สำรองข้อมูลที่กู้คืนได้จริง
สิ่งที่ต้องเตรียม
Cloud VPS ที่ใช้ Ubuntu 24.04 พร้อม Docker Engine และ Compose plugin ขนาด 1 vCPU / RAM 1 GB เพียงพอสำหรับผู้ใช้หลักสิบคน (เป็นจุดเริ่มต้นโดยประมาณ)
ซับโดเมน เช่น vault.example.com ที่ชี้มาที่เซิร์ฟเวอร์แล้ว
Reverse proxy ที่ทำ HTTPS ได้ แนะนำ Nginx Proxy Manager พร้อมเครือข่าย Docker ชื่อ proxy หรือใช้ Nginx บนโฮสต์กับ Certbot
บัญชี SMTP สำหรับส่งอีเมลเชิญและยืนยันตัวตน และแพ็กเกจ sqlite3 บนโฮสต์สำหรับสำรองข้อมูล
HTTPS เป็นข้อบังคับ ไม่ใช่ตัวเลือก หน้า Web Vault เข้ารหัสข้อมูลในเบราว์เซอร์ด้วย Web Crypto API ซึ่งเบราว์เซอร์อนุญาตเฉพาะบนการเชื่อมต่อที่ปลอดภัย ถ้าเปิดผ่าน HTTP จะสร้างบัญชีหรือล็อกอินไม่ได้
แอป Bitwarden ทุกตัวคุยกับ Vaultwarden ผ่าน HTTPS และ WebSocket โดยข้อมูลเข้ารหัสตั้งแต่ฝั่งผู้ใช้
ขั้นตอนที่ 1: สร้าง ADMIN_TOKEN แบบ Argon2
อย่าใช้รหัสผ่านตรง ๆ เป็นโทเคนของหน้าแอดมิน ให้สร้างค่า hash ด้วยคำสั่งที่มากับ image ระบบจะถามรหัสผ่านสองครั้ง แล้วพิมพ์บรรทัด ADMIN_TOKEN='$argon2id$...' ออกมา
sudo install -d -o $USER /opt/vaultwarden
cd /opt/vaultwarden
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
คัดลอกทั้งบรรทัด ADMIN_TOKEN พร้อม single quote ไปใส่ในไฟล์ .env
รหัสผ่านที่พิมพ์คือสิ่งที่คุณจะใช้ล็อกอินหน้า /admin ส่วนค่า hash เก็บไว้ในเซิร์ฟเวอร์ ถ้าไฟล์ .env หลุด ผู้ไม่หวังดีก็ยังไม่รู้รหัสผ่านจริง
ขั้นตอนที่ 2: เขียนไฟล์ .env และ compose.yaml
สร้าง .env แล้ววางค่า hash ที่ได้ ครอบด้วยเครื่องหมาย ' (single quote) เพื่อไม่ให้ Docker Compose ตีความเครื่องหมาย $ ใน hash เป็นตัวแปร
DOMAIN=https://vault.example.com
SIGNUPS_ALLOWED=false
INVITATIONS_ALLOWED=true
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...ค่าที่ได้จากขั้นตอนที่ 1...'
SMTP_HOST=smtp.example.com
[email protected]
SMTP_PORT=587
SMTP_SECURITY=starttls
[email protected]
SMTP_PASSWORD=รหัสผ่านบัญชีอีเมล
TZ=Asia/Bangkok
chmod 600 .env
nano compose.yaml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
volumes:
- ./vw-data:/data
networks:
- proxy
networks:
proxy:
external: true
docker compose up -d
docker compose logs -f
ไฟล์นี้ไม่ publish พอร์ตใดเลย เพราะ Nginx Proxy Manager เรียกหาคอนเทนเนอร์ vaultwarden ผ่านเครือข่าย proxy ได้โดยตรง ถ้าใช้ Nginx บนโฮสต์แทน ให้ลบส่วน networks แล้วเพิ่ม ports: ["127.0.0.1:8080:80"] จากนั้นตั้ง proxy_pass http://127.0.0.1:8080;
ขั้นตอนที่ 3: เปิด HTTPS ด้วย Proxy Host
ใน Nginx Proxy Manager ไปที่ Proxy Hosts → Add Proxy Host กรอก Domain Names vault.example.com, Forward Hostname vaultwarden, Forward Port 80 เปิด Websockets Support เพื่อให้แอปที่เปิดค้างไว้ได้รับการซิงก์ทันทีเมื่อมีคนแก้รหัสผ่าน และเปิด Block Common Exploits จากนั้นในแท็บ SSL ขอใบรับรองใหม่ เปิด Force SSL และ HTTP/2
ไม่ควรครอบ Proxy Host นี้ด้วย Basic Auth เพราะแอปมือถือและ extension ของ Bitwarden จะเชื่อมต่อไม่ได้ ถ้าต้องการจำกัดการเข้าถึง ให้ใช้เฉพาะกฎ IP ของ VPN หรือสำนักงาน
ขั้นตอนที่ 4: เชิญผู้ใช้จากหน้าแอดมินของ Vaultwarden
เปิด https://vault.example.com/admin แล้วล็อกอินด้วยรหัสผ่านจากขั้นตอนที่ 1 ไปที่แท็บ Diagnostics ก่อน เพื่อตรวจว่าโดเมน เวลา และการเชื่อมต่อถูกต้อง จากนั้นไปที่แท็บ Users พิมพ์อีเมลในช่อง Invite User แล้วกด Invite เริ่มจากเชิญตัวคุณเอง
ปิด SIGNUPS_ALLOWED แล้วเพิ่มผู้ใช้ด้วยการเชิญทางอีเมลเท่านั้น (ภาพจำลอง)
ผู้ได้รับเชิญจะได้อีเมลพร้อมลิงก์สร้างบัญชีและตั้ง Master Password เมื่อบัญชีของคุณพร้อมแล้ว ให้สร้าง Organization ของบริษัท แยก Collection ตามแผนก เช่น IT, บัญชี, การตลาด แล้วเชิญพนักงานเข้า Organization พร้อมกำหนดสิทธิ์ราย Collection
ข้อควรรู้: ค่าที่บันทึกผ่านแท็บ Settings ของหน้าแอดมินจะถูกเก็บใน vw-data/config.json และมีผลเหนือค่าใน .env
ขั้นตอนที่ 5: เชื่อมแอป Bitwarden และเปิด 2FA
ในแอป Bitwarden ทุกตัว ที่หน้าล็อกอินให้เปลี่ยนตัวเลือกเซิร์ฟเวอร์จาก bitwarden.com เป็น Self-hosted แล้วใส่ Server URL เป็น https://vault.example.com ดาวน์โหลดแอปได้จาก หน้าดาวน์โหลดของ Bitwarden
กำชับให้ผู้ใช้ทุกคนเปิด Two-step Login ในหน้า Account settings → Security และจดรหัสกู้คืนไว้ในที่ปลอดภัย ผู้ดูแลระบบกู้ Master Password ให้ใครไม่ได้ เพราะข้อมูลถูกเข้ารหัสตั้งแต่ฝั่งผู้ใช้
ขั้นตอนที่ 6: สำรองข้อมูลและอัปเดต
ข้อมูลที่ต้องสำรองอยู่ใน vw-data/ ได้แก่ db.sqlite3 และโฟลเดอร์ attachments/ (จำเป็น), config.json และไฟล์ rsa_key* (แนะนำ) ใช้คำสั่ง .backup ของ sqlite3 ซึ่งคัดลอกฐานข้อมูลได้ขณะที่ระบบยังทำงาน รันคำสั่งต่อไปนี้ในโฟลเดอร์เดิม
sudo apt install -y sqlite3
sudo mkdir -p /var/backups/vw
STAMP=$(date +%F-%H%M)
sudo sqlite3 vw-data/db.sqlite3 ".backup '/var/backups/vw/db-$STAMP.sqlite3'"
sudo tar czf /var/backups/vw/files-$STAMP.tar.gz \
--exclude='db.sqlite3*' --exclude=icon_cache vw-data .env
ใส่คำสั่งข้างต้นในสคริปต์แล้วตั้ง cron รายวัน จากนั้นส่งไฟล์ออกนอกเครื่องแบบเข้ารหัสตามคู่มือ สำรองข้อมูลแบบเข้ารหัสด้วย restic และทดลองกู้คืนบนเครื่องทดสอบอย่างน้อยไตรมาสละครั้ง
อัปเดตด้วย docker compose pull && docker compose up -d หลังสำรองข้อมูลแล้ว อ่าน release notes ของรุ่นใหม่ก่อนทุกครั้ง และเมื่อตั้งค่าครบแล้ว จะลบ ADMIN_TOKEN ออกจาก .env เพื่อปิดหน้าแอดมินไว้จนกว่าจะต้องใช้อีกก็ได้
ปัญหาที่พบบ่อยเกี่ยวกับ Vaultwarden
เปิดหน้าเว็บแล้วสร้างบัญชีหรือล็อกอินไม่ได้ ขึ้นข้อความเรื่อง HTTPS?
Web Vault ต้องทำงานบน HTTPS เท่านั้น ตรวจว่าเปิดผ่าน https://vault.example.com ไม่ใช่ IP หรือพอร์ตตรง และค่า DOMAIN ใน .env ตรงกับ URL ที่ใช้จริงทุกตัวอักษร รวมถึง https://
แก้ค่าใน .env แล้วไม่มีผลเพราะอะไร?
มีสองสาเหตุ อย่างแรก docker compose restart ไม่อ่าน .env ใหม่ ต้องใช้ docker compose up -d เพื่อสร้างคอนเทนเนอร์ใหม่ อย่างที่สอง ถ้าเคยกด Save ในหน้าแอดมิน ค่าใน config.json จะทับค่าจาก .env ให้แก้ผ่านหน้าแอดมิน หรือลบคีย์นั้นออกจาก config.json
ผู้ใช้ลืม Master Password ผู้ดูแลกู้คืนให้ได้ไหม?
ไม่ได้ เซิร์ฟเวอร์เก็บเฉพาะข้อมูลที่เข้ารหัสแล้ว ผู้ดูแลทำได้เพียงลบบัญชีให้สมัครใหม่ ข้อมูลส่วนตัวเดิมจะหายทั้งหมด ข้อมูลใน Collection ขององค์กรยังอยู่ จึงควรเก็บรหัสผ่านงานไว้ใน Organization และเปิดใช้ Emergency Access สำหรับบัญชีสำคัญ
เว็บใช้ได้ แต่แอปมือถือเชื่อมต่อเซิร์ฟเวอร์ไม่ได้?
ตรวจว่าใบรับรองเป็นของ Let's Encrypt ที่ถูกต้อง ไม่ใช่ self-signed, Server URL ไม่มี /#/ ต่อท้าย และ Proxy Host ไม่ได้ครอบด้วย Basic Auth หรือ Access List ที่บล็อก IP ของเครือข่ายมือถือ อ่านตัวเลือกทั้งหมดได้ที่ Vaultwarden Wiki
ระบบจัดการรหัสผ่านคือกุญแจของทุกระบบ ตรวจรายการนี้ให้ครบก่อนชวนพนักงานมาใช้
ต้องการเซิร์ฟเวอร์สำหรับรัน Vaultwarden ที่สำรองข้อมูลได้ง่าย ดู Cloud VPS App Plus หรือ ติดต่อทีมงาน THAI DATA CLOUD เพื่อช่วยวางระบบจัดการรหัสผ่านขององค์กร
อ่านเพิ่มเติมเกี่ยวกับ Vaultwarden