SELF HOSTING

Hướng dẫn self-hosting Bitwarden: Quản lý mật khẩu an toàn ngay trên server của bạn

Thế giới online hiện nay buộc mỗi người dùng phải ghi nhớ hàng chục, thậm chí hàng trăm tài khoản khác nhau: email, mạng xã hội, ngân hàng, dịch vụ SaaS, hệ thống nội bộ,… Nếu vẫn còn dùng một vài mật khẩu “tủ” cho tất cả mọi thứ, đó là một quả bom nổ chậm đúng nghĩa.

Trình quản lý mật khẩu (password manager) là cách an toàn và tiện nhất để giải quyết vấn đề này: bạn chỉ cần nhớ một mật khẩu chính (master password), còn lại để phần mềm tự sinh và lưu trữ giúp. Bitwarden là một trong những giải pháp nổi bật nhất vì hỗ trợ đa nền tảng, mã hóa đầu-cuối (end-to-end), có client cho trình duyệt, desktop, mobile, CLI và đặc biệt là có tùy chọn self-host cho người dùng kỹ tính về quyền riêng tư.

Thông thường, người dùng sẽ dùng Bitwarden Cloud (dịch vụ đám mây do Bitwarden vận hành). Nhưng nếu bạn là người thích kiểm soát mọi thứ trên server của riêng mình – từ dữ liệu, cert SSL cho tới backup – self-hosting Bitwarden là lựa chọn cực kỳ hấp dẫn. Khi tự host, dữ liệu vault được lưu trên VPS, server tại nhà, hay hạ tầng nội bộ của chính bạn, thay vì nằm trên server của bên thứ ba.

Bài viết này sẽ hướng dẫn chi tiết cách triển khai Bitwarden self-host từ repo GitHub chính thức bitwarden/self-host, sử dụng Docker và Docker Compose. Mục tiêu là sau bài viết, bạn có thể tự tay dựng một server Bitwarden hoàn chỉnh trên Ubuntu, truy cập qua domain riêng, có HTTPS đầy đủ, sẵn sàng dùng cho cá nhân hoặc một team nhỏ.

Bitwarden và self-hosting

Bitwarden là gì?

Bitwarden là một trình quản lý mật khẩu hỗ trợ mã hóa đầu-cuối: tất cả dữ liệu (mật khẩu, ghi chú, TOTP…) được mã hóa trên thiết bị trước khi gửi lên server, và chỉ có master password của bạn mới giải mã được.

Một số điểm đáng chú ý:

  • Hỗ trợ đầy đủ: extension cho Chrome/Firefox/Edge, app desktop (Windows/macOS/Linux), app mobile (Android/iOS), web vault, CLI.
  • Mã nguồn mở cho phần lớn thành phần, cộng đồng lớn, được audit bảo mật nhiều lần.
  • Hỗ trợ tổ chức (Organization), chia sẻ vault cho nhóm, thư mục chia sẻ, policy… nếu muốn dùng cho team.

Self-hosting là gì?

Self-hosting đơn giản là “tự chạy dịch vụ trên server của mình” thay vì dùng cloud của nhà cung cấp. Với Bitwarden, self-host nghĩa là bạn dựng một server Bitwarden (chạy bằng Docker) trên VPS, máy chủ tại nhà (home lab), hay máy chủ on-premise trong công ty.

Lợi ích chính:

  • Toàn quyền kiểm soát dữ liệu: Database, file đính kèm, backup… đều nằm trong tay bạn.
  • Tăng quyền riêng tư: Không phụ thuộc vào server bên thứ ba; phù hợp với môi trường nhạy cảm hoặc yêu cầu tuân thủ (compliance).
  • Tùy biến linh hoạt: Tự cấu hình SMTP, reverse proxy, tích hợp SSO, cổng mạng, firewall, VPN,… phù hợp hạ tầng sẵn có.

Đổi lại, self-hosting cũng có rủi ro:

  • Bạn chịu trách nhiệm vận hành: cập nhật, vá lỗi bảo mật, sao lưu, giám sát.
  • Nếu cấu hình sai (mở port lung tung, không bật HTTPS, cấu hình SMTP yếu), có thể làm lộ dữ liệu hoặc tạo lỗ hổng cho attacker.

Yêu cầu hệ thống & công cụ

Để theo được hướng dẫn bên dưới, bạn cần:

  • Một VPS hoặc server chạy Ubuntu 20.04/22.04 LTS (hoặc distro Linux tương đương), tối thiểu khoảng 2 vCPU, 2 GB RAM, 20 GB disk (khuyến nghị).
  • Một domain hoặc subdomain, ví dụ vault.vnrom.net, trỏ A/AAAA record về IP server. Việc này cần thiết để script tự xin chứng chỉ SSL từ Let’s Encrypt.
  • Port 80 và 443 mở ra Internet tới server (hoặc qua reverse proxy/tunnel như Cloudflare Tunnel) để Let’s Encrypt hoạt động.
  • Đã cài Docker & Docker Compose (hoặc docker compose plugin).
  • Kiến thức cơ bản về dòng lệnh Linux, SSH và cách chỉnh sửa file cấu hình (nano/vim).

Chuẩn bị môi trường: Docker, Docker Compose, thư mục chạy Bitwarden

1. Cập nhật hệ thống & cài Docker

Ví dụ với Ubuntu 22.04:

sudo apt update && sudo apt upgrade -y

# Cài Docker & docker-compose (bản trong repo Ubuntu)
sudo apt install -y docker.io docker-compose git

# Cho phép chạy Docker không cần sudo (tùy chọn)
sudo usermod -aG docker $USER
newgrp docker

Bitwarden sử dụng Docker Compose để dựng toàn bộ stack (web, API, database, background jobs…) thông qua script bitwarden.sh trong kho bitwarden/self-host.

LƯU Ý BẢO MẬT:

Không nên chạy mọi thứ bằng root, hãy dùng user thường (có sudo) và cân nhắc tạo riêng user bitwarden để chạy dịch vụ để triển khai an toàn hơn.

2. Tạo thư mục cài đặt và clone repo bitwarden/self-host

Theo thông lệ, có thể đặt Bitwarden tại /opt/bitwarden:

sudo mkdir -p /opt/bitwarden
sudo chown $USER:$USER /opt/bitwarden

cd /opt
git clone https://github.com/bitwarden/self-host.git bitwarden
cd bitwarden

Repo này chứa script bitwarden.sh – đây là script “đa năng” dùng để cài đặt, cập nhật, start/stop các container và quản lý cấu hình Bitwarden self-host.

Cấu trúc cơ bản sau khi cài sẽ có thêm thư mục bwdata nằm cạnh bitwarden.sh, nơi chứa:

  • File môi trường (./bwdata/env/*.env)
  • Cấu hình Docker Compose
  • Dữ liệu database, file đính kèm, cert SSL…

Cài đặt Bitwarden từ GitHub: Từng bước chi tiết

Bước 1: Chạy script cài đặt ban đầu

Từ thư mục /opt/bitwarden:

cd /opt/bitwarden
./bitwarden.sh install

Script sẽ:

  • Kiểm tra môi trường Docker/Docker Compose (docker compose hoặc docker-compose).
  • Tải về các script phụ trợ và template cấu hình (run.sh, file Docker Compose, env…).
  • Hỏi bạn một loạt câu hỏi để cấu hình server.

Các câu hỏi quan trọng thường gặp (có thể thay đổi nhẹ theo phiên bản, nhưng ý tưởng chung giống nhau):

  1. Enter the domain name for your Bitwarden instance:
    Nhập domain/subdomain, ví dụ:
    vault.vnrom.net
  2. Do you want to use Let’s Encrypt to generate a free SSL certificate? (y/n)
    Nếu server truy cập trực tiếp từ Internet và bạn đã trỏ DNS đúng, nên chọn y để script tự xin cert từ Let’s Encrypt và cấu hình Nginx/SSL giúp bạn.
  3. Enter the e-mail address for Let’s Encrypt / admin contact:
    Dùng email mà bạn có thể nhận thông báo về cert hoặc vấn đề liên quan.
  4. Enter your installation id / key (tùy từng phiên bản):
    Một số phiên bản yêu cầu Installation ID/Key nếu bạn dùng license trả phí, tổ chức,… Nếu chỉ dùng bản miễn phí cá nhân, thường có thể bỏ qua hoặc làm theo hướng dẫn thêm của Bitwarden.

Sau khi trả lời xong, script sẽ sinh toàn bộ cấu hình trong thư mục ./bwdata và sẵn sàng cho bước tiếp theo.

Bước 2: Hiểu và chỉnh sửa file .env quan trọng

Bitwarden không dùng một file .env duy nhất, mà chia thành nhiều file trong thư mục ./bwdata/env. File quan trọng nhất là global.override.env – nơi bạn có thể override các biến môi trường mặc định cho instance của mình.

Ví dụ, mở file:

cd /opt/bitwarden
nano ./bwdata/env/global.override.env

Một số biến hay dùng:

# URL truy cập chính của vault
globalSettings__baseServiceUri__vault=https://vault.vnrom.net

# Email dùng để gửi mail hệ thống (reply-to)
[email protected]

# Cấu hình SMTP để Bitwarden gửi mail (mời thành viên, reset mật khẩu, cảnh báo…)
globalSettings__mail__smtp__host=smtp.mailgun.org
globalSettings__mail__smtp__port=587
globalSettings__mail__smtp__ssl=false
[email protected]
globalSettings__mail__smtp__password=mat_khau_smtp_cua_ban

Các biến này được Bitwarden khuyến nghị khi self-host tổ chức, đặc biệt nếu dùng tính năng Organization, mời người dùng qua email, policy,…

Sau khi chỉnh sửa global.override.env, cần restart stack để áp dụng:

./bitwarden.sh restart

Bước 3: Khởi động Bitwarden (Docker Compose)

Khi cài đặt xong, để khởi động tất cả container Bitwarden:

cd /opt/bitwarden
./bitwarden.sh start

Lệnh này sẽ gọi Docker Compose để up -d toàn bộ stack (web, API, identity, mssql, jobs, nginx reverse proxy…).

Bạn có thể kiểm tra trạng thái container:

docker ps
# hoặc
docker compose ps  # nếu dùng docker compose plugin

Theo mặc định, Bitwarden sẽ lắng nghe trên:

  • HTTP port 80
  • HTTPS port 443

Các port này có thể được điều chỉnh trong file cấu hình (ví dụ bwdata/config.yml hoặc file Docker Compose) nếu cần chạy sau reverse proxy khác hoặc trên port không chuẩn, nhưng cách đơn giản nhất là để 80/443 rồi dùng firewall/nginx ở lớp ngoài.

Bước 4: Cấu hình SSL với Let’s Encrypt (nếu chưa làm lúc cài)

Nếu ở bước ./bitwarden.sh install bạn chọn dùng Let’s Encrypt, script sẽ tự:

  • Xin chứng chỉ từ Let’s Encrypt (qua port 80/443).
  • Cấu hình Nginx dùng cert đó.

Trong trường hợp bạn muốn thay đổi từ HTTP sang HTTPS sau này, hoặc muốn dùng cert của riêng mình, có thể:

  1. Cập nhật domain/URL trong global.override.env (đảm bảo dùng https://).
  2. Đặt cert/key vào thư mục tương ứng trong ./bwdata/nginx/ theo hướng dẫn chính thức của Bitwarden.
  3. Chạy lại: bash./bitwarden.sh restart

Ở môi trường phức tạp hơn (ví dụ dùng Cloudflare Tunnel, Traefik, Nginx riêng), bạn có thể tắt SSL trong Bitwarden stack và offload SSL ở lớp reverse proxy bên ngoài – tuy nhiên khi đó cần hiểu rõ mô hình mạng nội bộ của bạn.

Bước 5: Truy cập web vault và tạo tài khoản admin

Khi tất cả container đã lên, mở trình duyệt và truy cập:

https://vault.vnrom.net

Nên thấy giao diện đăng nhập của Bitwarden. Ở lần đầu:

  1. Chọn Create Account và tạo tài khoản với email/mật khẩu mạnh.
  2. Đây sẽ là tài khoản “owner” trong môi trường self-host, bạn có thể dùng để tạo Organization, mời user khác,…
  3. Đăng nhập web vault và thiết lập 2FA (OTP, WebAuthn…) cho tài khoản admin để tăng bảo mật.

Sau khi web vault chạy ổn, bạn có thể:

  • Cài extension Bitwarden trên trình duyệt và trỏ về server self-host (vào phần Settings → Server URL).
  • Cài app mobile/desktop và cấu hình server URL giống vậy (https://vault.vnrom.net).

Mẹo nâng cao: Backup, cập nhật, tích hợp

Backup dữ liệu Bitwarden self-host

Bitwarden khuyến nghị sao lưu định kỳ toàn bộ thư mục ./bwdata – đây là nơi chứa tất cả dữ liệu quan trọng: env, database, file đính kèm, khóa bảo vệ…

Cách đơn giản:

cd /opt/bitwarden
./bitwarden.sh stop

# Nén toàn bộ thư mục bwdata
tar -czf bitwarden-backup-$(date +%Y%m%d).tar.gz bwdata/

./bitwarden.sh start

Đưa file backup .tar.gz sang nơi an toàn: ổ cứng ngoài, server backup khác, storage offsite,…

Ngoài ra, Bitwarden cũng có script backup riêng cho container database MSSQL:

docker exec -i bitwarden-mssql /backup-db.sh

Lệnh này tạo bản backup database bên trong container; tuy nhiên để khôi phục hoàn chỉnh sau thảm họa, backup toàn bộ bwdata vẫn là lựa chọn an toàn nhất.

Cập nhật Bitwarden self-host

Định kỳ (ví dụ mỗi tháng một lần), bạn nên cập nhật Bitwarden để nhận bản vá bảo mật và tính năng mới. Cách cập nhật phổ biến là dùng script bitwarden.sh:

cd /opt/bitwarden

# Cập nhật chính script cài đặt
./bitwarden.sh updateself

# Cập nhật image Docker & cấu hình
./bitwarden.sh update

Trước khi update, nên tạo một bản backup bwdata như ở bước trên để có thể rollback nếu gặp sự cố.

Tích hợp với các dịch vụ khác

Một vài ý tưởng tích hợp:

  • SMTP chuyên nghiệp: dùng Mailgun, SendGrid, SES… để đảm bảo email mời người dùng, reset password không rơi vào spam.
  • SSO/LDAP: với môi trường doanh nghiệp, có thể cấu hình thêm SSO (SAML/OIDC) và LDAP/AD trong global.override.env để đồng bộ user.
  • Giám sát & logging: đưa log container vào stack giám sát (Prometheus, Loki, ELK…) để theo dõi trạng thái server.
  • VPN nội bộ: nếu muốn Bitwarden chỉ truy cập được qua VPN (không public Internet), có thể bind port nội bộ và dùng WireGuard/OpenVPN để vào mạng nội bộ.

Tự host Bitwarden mang lại một cảm giác “yên tâm” đặc biệt: vault của bạn không nằm trên server của bất kỳ ai khác, mọi thứ – từ database, backup cho tới đường đi của traffic – đều nằm trong tầm kiểm soát của bạn. Đối với cá nhân kỹ tính về bảo mật hoặc các doanh nghiệp nhỏ có yêu cầu tuân thủ dữ liệu, đây là một lợi thế lớn so với việc phụ thuộc 100% vào cloud.

Tuy nhiên, đi kèm với đó là trách nhiệm: bạn phải cập nhật server thường xuyên, vá lỗi bảo mật hệ điều hành, giám sát dung lượng disk, kiểm tra backup định kỳ và đảm bảo chỉ mở những port cần thiết (thường là 80/443 hoặc port reverse proxy bạn dùng). Hãy đặt mật khẩu quản trị thật mạnh, bật 2FA, và không chia sẻ tài khoản admin cho nhiều người.

Nếu đây là lần đầu self-host, nên bắt đầu bằng một VPS nhỏ, triển khai theo đúng các bước cơ bản trong bài, test kỹ mọi thứ (đăng nhập, đăng ký, gửi mail, backup/restore thử) trước khi đưa vào sử dụng cho team. Và quan trọng nhất: hãy coi security là một quá trình liên tục, không phải “cài xong là xong”.

Nếu bạn thấy hướng dẫn này hữu ích, hãy thử dựng một instance Bitwarden self-host cho riêng mình, và chia sẻ lại kinh nghiệm dưới bình luận nhé 😀

Duy Nghiện
Hãy làm khán giả, đừng làm nhân vật chính :)

You may also like

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Mới nhất
Cũ nhất Nhiều like nhất
Phản hồi nội tuyến
Xem tất cả bình luận