LLDAP trên Docker: Tập trung hóa đăng nhập cho HomeLab một cách gọn nhẹ

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Vấn đề “Quá nhiều mật khẩu”

Hầu hết các hệ thống HomeLab đều bắt đầu ở quy mô nhỏ. Bạn cài Jellyfin để xem phim, sau đó là Portainer để quản lý các container. Ở quy mô đó, việc tạo một hoặc hai tài khoản khá dễ dàng. Nhưng khi lab của bạn mở rộng thêm Nextcloud, Grafana, Gitea và một vài bảng điều khiển (dashboard), bạn sẽ gặp khó khăn. Tôi nhận ra mình đang phải quản lý 12 bộ thông tin đăng nhập khác nhau. Mỗi khi muốn cập nhật mật khẩu chính, tôi phải mất 30 phút đăng nhập vào từng giao diện web riêng biệt để thay đổi thủ công.

Đây không chỉ là một công việc vặt tẻ nhạt; nó còn là một lỗ hổng bảo mật. Nếu bạn quên xóa một tài khoản thử nghiệm trên một dịch vụ hiếm khi dùng, đó sẽ là một “cửa sau” (backdoor) vĩnh viễn vào mạng của bạn. Nhiều người đành phải sử dụng các mật khẩu yếu và giống hệt nhau chỉ để dễ nhớ. Tôi cần một cách để quản lý người dùng ở một nơi duy nhất, nhưng các giải pháp dành cho doanh nghiệp (enterprise) lại tạo cảm giác như dùng dao mổ trâu để giết gà.

Tại sao LDAP truyền thống lại quá rườm rà

Các ứng dụng thường lưu trữ dữ liệu người dùng trong cơ sở dữ liệu SQLite hoặc Postgres nội bộ của riêng chúng. Điều này tạo ra các “ốc đảo” dữ liệu. Để khắc phục, ngành công nghệ sử dụng LDAP (Lightweight Directory Access Protocol). Nó cho phép một ứng dụng hỏi máy chủ trung tâm: “Người dùng này có tồn tại không, và mật khẩu này có đúng không?”

Rắc rối ở chỗ việc triển khai LDAP truyền thống là một cơn ác mộng khi thiết lập. OpenLDAP rất mạnh mẽ nhưng đòi hỏi sự hiểu biết sâu sắc về các schema mơ hồ. FreeIPA là một lựa chọn khác, nhưng nó cực kỳ ngốn tài nguyên, cần ít nhất 2GB RAM chỉ để duy trì sự ổn định. Với một hệ thống HomeLab khiêm tốn chạy trên NUC hoặc Raspberry Pi, đó là một sự lãng phí tài nguyên khổng lồ.

So sánh các lựa chọn

Tôi đã thử nghiệm nhiều cách để tập trung hóa thông tin đăng nhập trước khi tìm ra giải pháp tối ưu. Dưới đây là sự so sánh giữa chúng:

  • OpenLDAP: Tiêu chuẩn ngành đã 40 năm tuổi. Nó hoạt động tốt, nhưng lộ trình học tập cực kỳ dốc. Quản lý qua dòng lệnh hoặc các công cụ lỗi thời như LDAP Account Manager (LAM) rất gây ức chế.
  • Authentik / Authelia: Đây là các nhà cung cấp định danh (Identity Providers – IdP) đầy đủ. Chúng rất tuyệt nếu bạn cần SAML hoặc OIDC, nhưng chúng rất nặng. Authentik thường yêu cầu nhiều container và vài gigabyte bộ nhớ.
  • LLDAP (Lightweight LDAP): Một máy chủ hiện đại được viết bằng Rust. Nó tập trung vào những thứ cơ bản: giao diện sạch sẽ, chiếm dụng tài nguyên cực nhỏ và dễ dàng tích hợp. Nó thường chỉ tiêu tốn khoảng 15-20MB RAM khi ở trạng thái nghỉ.

Giải pháp: LLDAP trên Docker

LLDAP là lựa chọn lý tưởng cho những người tự vận hành server (self-hosters). Nó cung cấp cho ứng dụng giao diện LDAP cần thiết trong khi mang lại cho bạn một bảng điều khiển web đơn giản. Tôi đã chạy thiết lập này hơn một năm để quản lý 15 dịch vụ khác nhau. Nó cực kỳ ổn định, xử lý mọi yêu cầu đăng nhập mà không gặp một lỗi đồng bộ hay sự cố nào.

Bước 1: Chuẩn bị môi trường

Docker Compose là cách tốt nhất để triển khai vì nó giúp cấu hình của bạn có tính di động cao. Hãy bắt đầu bằng việc tạo một thư mục riêng cho dữ liệu LLDAP.

mkdir -p ~/homelab/lldap/data
cd ~/homelab/lldap

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

Tạo một tệp docker-compose.yml. Mặc dù LLDAP hỗ trợ Postgres, nhưng SQLite là quá đủ cho một HomeLab với vài chục người dùng. Nó biến toàn bộ cơ sở dữ liệu của bạn thành một tệp duy nhất, dễ dàng di chuyển.

services:
  lldap:
    image: lldap/lldap:latest
    container_name: lldap
    ports:
      - "17170:17170" # Giao diện Web
      - "3890:3890"   # Cổng LDAP
    environment:
      - LLDAP_LDAP_BASE_DN=dc=homelab,dc=local
      - LLDAP_LDAP_USER_PASS=MatKhauAdminSieuBaoMat
      - LLDAP_SERVER_KEY_SEED=su-dung-mot-chuoi-ngau-nhien-dai-tai-day
      - LLDAP_DATABASE_URL=sqlite:///data/users.db
    volumes:
      - ./data:/data
    restart: unless-stopped

Mẹo nhỏ: Hãy đổi dc=homelab,dc=local thành tên miền của riêng bạn. Ngoài ra, hãy đảm bảo LLDAP_SERVER_KEY_SEED là một chuỗi thực sự ngẫu nhiên để giữ cho các token phiên làm việc của bạn được an toàn.

Bước 3: Khởi chạy và thiết lập ban đầu

Đưa container vào hoạt động chỉ với một câu lệnh:

docker compose up -d

Truy cập http://[IP-Server-Của-Bạn]:17170 và đăng nhập với tên người dùng admin. Giao diện rất tối giản và nhanh chóng. Nhiệm vụ đầu tiên của bạn nên là tạo một nhóm như “users” hoặc “admins” và thêm tài khoản cá nhân của bạn vào đó.

Bước 4: Kết nối các dịch vụ của bạn

Khi LLDAP đã chạy, bạn có thể trỏ các ứng dụng của mình về đó. Dù là Gitea, Nextcloud hay Jellyfin, cấu hình thường sẽ trông như thế này:

  • LDAP Host: 192.168.1.50 (IP của máy chủ Docker)
  • Port: 3890
  • Bind DN: uid=admin,ou=people,dc=homelab,dc=local
  • User Search Base: ou=people,dc=homelab,dc=local
  • Group Search Base: ou=groups,dc=homelab,dc=local
  • User Filter: (uid=%s)

Ngay khi bạn nhấn “Lưu”, bạn có thể đăng nhập vào ứng dụng đó bằng thông tin LLDAP của mình. Bạn sẽ không bao giờ phải tạo tài khoản thủ công trên dịch vụ đó nữa.

Bảo trì và Sao lưu

Việc sao lưu rất đơn giản vì LLDAP rất nhẹ. Vì mọi thứ đều nằm trong tệp users.db, tôi chỉ cần đưa thư mục ~/homelab/lldap/data vào bản sao lưu Restic hàng đêm của mình. Nếu máy chủ gặp sự cố, tôi có thể khôi phục thư mục duy nhất đó sang máy mới và hoạt động trở lại trong chưa đầy 60 giây.

Về bảo mật, hãy để LLDAP bên trong mạng nội bộ của bạn. Mặc dù nó hỗ trợ LDAPS (LDAP mã hóa), nhưng việc đặt nó sau tường lửa hoặc truy cập qua VPN như Tailscale thường là đủ cho hầu hết người dùng gia đình. Nếu bạn bắt buộc phải mở nó ra internet, chắc chắn hãy thiết lập chứng chỉ SSL.

Lời kết

Chuyển sang LLDAP là nâng cấp đáng giá nhất cho trải nghiệm sử dụng máy chủ của tôi. Nó loại bỏ sự phiền toái khi thử nghiệm phần mềm mới vì tôi không còn e ngại quá trình thiết lập tài khoản nữa. Nó nhanh, gọn và hầu như không tốn RAM. Nếu bạn đang quản lý nhiều hơn ba dịch vụ, hãy ngừng việc loay hoay với đống mật khẩu và để LLDAP gánh vác công việc đó.

Share: