Quay lại danh sách
Tin tức công nghệ

Xây Dựng Hệ Thống Xác Thực Passwordless Self-Hosted Với Zitadel Trên VPS: Hướng Dẫn Chi Tiết Từ A-Z

28 tháng 5, 2026

Giới thiệu xu hướng Passwordless và Giải pháp Zitadel

Trong kỷ nguyên số hiện nay, an toàn thông tin không còn là một lựa chọn mà đã trở thành yếu tố sống còn đối với mọi doanh nghiệp. Phương thức đăng nhập truyền thống bằng mật khẩu (Password-based) ngày càng bộc lộ nhiều lỗ hổng nghiêm trọng như bị tấn công phishing, brute-force, hoặc người dùng đặt mật khẩu quá yếu. Để giải quyết triệt để vấn đề này, xu hướng Passwordless Authentication (Xác thực không mật khẩu) đã ra đời và nhanh chóng trở thành tiêu chuẩn mới.

Thay vì ghi nhớ những chuỗi ký tự phức tạp, người dùng có thể đăng nhập thông qua các cơ chế an toàn hơn như Passkeys, WebAuthn, Biometrics (FaceID/Fingerprint), hoặc YubiKey. Tuy nhiên, việc sử dụng các dịch vụ Cloud Identity (IDaaS) của bên thứ ba thường đi kèm với chi phí bản quyền đắt đỏ và rủi ro về quyền riêng tư dữ liệu (Data Privacy).

Chính vì vậy, giải pháp Self-Hosted Zitadel trên VPS (Virtual Private Server) là sự thay thế hoàn hảo. Zitadel là một nền tảng định danh mã nguồn mở (Open-source Identity Management) thế hệ mới, được tối ưu hóa cho kiến trúc Cloud-native, hỗ trợ đa tổ chức (Multi-tenancy) và đặc biệt mạnh mẽ trong việc triển khai cơ chế Passwordless.

Tại sao doanh nghiệp nên chọn Zitadel để Self-Host?

So với các đối thủ lâu đời như Keycloak hay các dịch vụ trả phí như Auth0, Zitadel nổi bật nhờ vào những lợi thế cốt lõi sau:

  • Kiến trúc hiện đại: Zitadel được viết bằng ngôn ngữ Go (Golang), mang lại hiệu năng cực cao, tiêu tốn ít tài nguyên phần cứng (RAM/CPU) hơn đáng kể so với Keycloak (chạy trên Java).
  • Hỗ trợ Passwordless vượt trội: Zitadel tích hợp sẵn chuẩn WebAuthn/Passkeys ngay từ lõi hệ thống, giúp việc cấu hình đăng nhập bằng vân tay hoặc nhận diện khuôn mặt trở nên vô cùng đơn giản.
  • Sẵn sàng cho mô hình B2B (Multi-tenancy): Zitadel cho phép quản lý nhiều tổ chức, doanh nghiệp con trên cùng một hệ thống duy nhất với các chính sách bảo mật độc lập.
  • Giao diện thân thiện: Bảng điều khiển (Console) của Zitadel được thiết kế hiện đại, trực quan, giúp các kỹ sư hệ thống dễ dàng làm quen và vận hành.
Lưu ý quan trọng: Khi tự triển khai (Self-host) hệ thống định danh, doanh nghiệp có toàn quyền kiểm soát dữ liệu người dùng, đáp ứng nghiêm ngặt các tiêu chuẩn an toàn như GDPR hoặc ISO 27001.

Chuẩn bị tài nguyên trước khi cài đặt

Để quá trình triển khai diễn ra mượt mà, bạn cần chuẩn bị một cấu hình VPS và môi trường cơ bản như sau:

1. Cấu hình phần cứng tối thiểu (Minimum Requirements)

  • CPU: 2 vCPU
  • RAM: 4 GB (Zitadel và CockroachDB cần dung lượng bộ nhớ đủ tốt để hoạt động ổn định)
  • Disk: 40 GB SSD/NVMe
  • Hệ điều hành: Ubuntu Server 22.04 LTS hoặc 24.04 LTS

2. Điều kiện tiên quyết về mạng và tên miền

  • Một tên miền (Domain Name) đã trỏ bản ghi A về địa chỉ IP Public của VPS (Ví dụ: auth.yourdomain.com).
  • Mở các cổng mạng cần thiết trên Firewall: 80 (HTTP), 443 (HTTPS).

Hướng dẫn các bước triển khai Zitadel trên VPS bằng Docker Compose

Zitadel hỗ trợ nhiều phương thức lưu trữ dữ liệu, trong đó CockroachDB là cơ sở dữ liệu được khuyến nghị nhờ khả năng phân tán và tính sẵn sàng cao. Chúng ta sẽ sử dụng Docker Compose để thiết lập toàn bộ stack công nghệ này.

Bước 1: Cài đặt Docker và Docker Compose

Truy cập vào VPS thông qua SSH và thực hiện cập nhật hệ thống, sau đó cài đặt Docker Engine:sudo apt update && sudo apt upgrade -y sudo apt install curl iptables -y curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh sudo sh get-docker.sh

Bước 2: Cấu hình file Docker Compose cho Zitadel

Tạo một thư mục làm việc mới và tạo file cấu hình docker-compose.yml:mkdir -p ~/zitadel && cd ~/zitadel nano docker-compose.yml

Sao chép nội dung cấu hình dưới đây vào file. Cấu hình này bao gồm một container chạy CockroachDB và một container chạy Zitadel Server:version: '3.8' services: crdb: image: cockroachdb/cockroach:v23.1.10 command: start-single-node --insecure --http-addr 0.0.0.0:8080 volumes: - crdb-data:/cockroach/cockroach-data ports: - "8080:8080" zitadel: image: ghcr.io/zitadel/zitadel:v2.42.0 command: start-from-init --masterkey "ChonMotChuoiMasterKeyThatBaoMat123!" --tlsMode disabled environment: - ZITADEL_DATABASE_COCKROACH_HOST=crdb - ZITADEL_DATABASE_COCKROACH_PORT=26257 - ZITADEL_DATABASE_COCKROACH_USER=root - ZITADEL_DATABASE_COCKROACH_SECURE=false - ZITADEL_EXTERNALSECURE=true - ZITADEL_EXTERNALDOMAIN=auth.yourdomain.com - ZITADEL_EXTERNALPORT=443 ports: - "8020:8020" depends_on: - crdb volumes: crdb-data:

Mẹo bảo mật: Hãy thay thế chuỗi ChonMotChuoiMasterKeyThatBaoMat123! bằng một chuỗi ngẫu nhiên dài để mã hóa dữ liệu trong database và thay đổi auth.yourdomain.com thành tên miền của bạn.

Bước 3: Khởi chạy hệ thống và lấy thông tin Quản trị viên

Thực hiện lệnh sau để tải các image và khởi chạy container ở chế độ chạy ngầm (detached mode):sudo docker compose up -d

Sau khi hệ thống khởi tạo xong (mất khoảng 1-2 phút), bạn cần kiểm tra log của container Zitadel để lấy mật khẩu đăng nhập ban đầu của tài khoản Admin:sudo docker compose logs zitadel | grep -i "Password:"

Hãy lưu lại thông tin tài khoản dạng ZITADEL_ADMIN và mật khẩu được sinh ra tự động để sử dụng ở bước sau.

Cấu hình Reverse Proxy Nginx và Cài đặt SSL Let's Encrypt

Vì cơ chế Passwordless (WebAuthn/Passkeys) bắt buộc phải hoạt động trên môi trường bảo mật HTTPS, chúng ta cần cấu hình Nginx làm Reverse Proxy để điều hướng lưu lượng và xử lý chứng chỉ SSL.

1. Cài đặt Nginx và Certbot

sudo apt install nginx certbot python3-certbot-nginx -y

2. Tạo cấu hình Nginx Virtual Host

Tạo file cấu hình mới cho tên miền của bạn:sudo nano /etc/nginx/sites-available/zitadel

Nhập cấu hình proxy hỗ trợ HTTP/2 (yêu cầu bắt buộc của Zitadel cho các kết nối gRPC):server { listen 80; server_name auth.yourdomain.com; location / { proxy_pass [http://127.0.0.1:8020](http://127.0.0.1:8020); proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Hỗ trợ gRPC và HTTP/2 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

Kích hoạt cấu hình và khởi động lại Nginx:sudo ln -s /etc/nginx/sites-available/zitadel /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx

3. Cấp phát chứng chỉ SSL miễn phí với Let's Encrypt

sudo certbot --nginx -d auth.yourdomain.com

Làm theo hướng dẫn trên màn hình để hoàn tất cấp cấu hình HTTPS tự động. Certbot sẽ tự động sửa đổi cấu hình Nginx để chuyển hướng toàn bộ lưu lượng từ HTTP sang HTTPS.

Thiết lập Passwordless Authentication trên Zitadel Console

Bây giờ, hệ thống của bạn đã sẵn sàng trực tuyến. Hãy truy cập vào đường dẫn [https://auth.yourdomain.com](https://auth.yourdomain.com) thông qua trình duyệt web.

Bước 1: Đăng nhập lần đầu và đổi mật khẩu

Sử dụng tài khoản quản trị viên tối cao (Super User) đã lấy từ lệnh log ở phần trước. Hệ thống sẽ yêu cầu bạn thay đổi mật khẩu ngay trong lần đăng nhập đầu tiên để đảm bảo an toàn.

Bước 2: Cấu hình Chính sách Đăng nhập (Login Policy)

  1. Tại menu điều hướng bên trái, chọn Organization hoặc truy cập vào Instance Settings.
  2. Tìm đến mục Login Policy (Chính sách đăng nhập).
  3. Trong phần MFA (Multi-Factor Authentication) hoặc Passwordless, chuyển trạng thái sang Allowed (Cho phép) hoặc Required (Bắt buộc).
  4. Chọn tích chọn vào mục WebAuthn / Passkey để kích hoạt tính năng xác thực không mật khẩu.

Bước 3: Trải nghiệm đăng ký Passkey cho người dùng

Khi một người dùng mới được tạo hoặc đăng nhập lần đầu, Zitadel sẽ hiển thị một luồng thiết lập (Onboarding flow) vô cùng mượt mà. Thay vì yêu cầu nhập mật khẩu phức tạp, hệ thống sẽ gọi API WebAuthn của trình duyệt, kích hoạt cửa sổ bảo mật của hệ điều hành (như Windows Hello, macOS Touch ID hoặc iOS/Android Biometrics).

Người dùng chỉ cần chạm vân tay hoặc quét khuôn mặt một lần duy nhất. Ở những lần đăng nhập tiếp theo, quá trình xác thực diễn ra chỉ trong vòng chưa đầy 2 giây mà không cần bất kỳ một ký tự mật khẩu nào.

Kết luận và Khuyến nghị bảo mật vận hành

Việc tự triển khai một Self-Hosted Passwordless Auth Server bằng Zitadel không chỉ giúp doanh nghiệp tối ưu chi phí hạ tầng, nâng cao trải nghiệm khách hàng/nhân viên, mà còn bảo vệ hệ thống trước 99% các cuộc tấn công đánh cắp danh tính thông thường. Để vận hành hệ thống này một cách an toàn dài hạn, bạn cần lưu ý một số nguyên tắc sau:

  • Thực hiện sao lưu (Backup) định kỳ: Luôn lên lịch backup định kỳ thư mục dữ liệu của CockroachDB (crdb-data) để tránh mất mát dữ liệu khi VPS gặp sự cố phần cứng.
  • Cập nhật phiên bản (Patching): Thường xuyên kiểm tra và cập nhật các bản vá bảo mật mới nhất từ kho lưu trữ Docker của Zitadel.
  • Giám sát hệ thống (Monitoring): Tích hợp các công cụ như Prometheus và Grafana để theo dõi hiệu năng hệ thống và phát hiện sớm các hành vi đăng nhập bất thường.

Chúc các bạn triển khai thành công hệ thống xác thực hiện đại này cho doanh nghiệp của mình!

Xây Dựng Hệ Thống Xác Thực Passwordless Self-Hosted Với Zitadel Trên VPS: Hướng Dẫn Chi Tiết Từ A-Z | DPTCloud