Triển khai Keycloak Docker: Giải pháp SSO ‘tất cả trong một’ cho doanh nghiệp

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Chuyện đêm muộn: Khi 10 ứng dụng có 10 cái mật khẩu khác nhau

Đêm thứ Hai định mệnh, điện thoại mình rung bần bật báo tin nhắn khẩn. Một admin vừa nghỉ việc và mình cần thu hồi mọi quyền truy cập ngay lập tức. Ngồi rà soát lại, mình mới thấy hoảng. GitLab một tài khoản, Wiki một tài khoản, rồi Grafana, Jenkins đến cả đống Dashboard nội bộ. Mỗi chỗ là một database user riêng biệt.

Loay hoay login vào từng server để khóa account giữa đêm làm mình tỉnh ngộ. Không có hệ thống Identity Provider (IdP) tập trung, mình xác định sẽ còn thức trắng đêm dài dài. Đó là lý do mình tìm đến Keycloak.

Đặt lên bàn cân: Auth0, Okta hay tự “vận hành” Keycloak?

Khi giải bài toán quản lý định danh (IAM), chúng ta thường có 3 lựa chọn chính. Mình đã cân nhắc kỹ các yếu tố từ chi phí đến khả năng kiểm soát trước khi quyết định.

1. Database nội bộ (Cách truyền thống)

  • Ưu điểm: Triển khai siêu nhanh, chỉ cần thêm table users vào DB hiện có.
  • Nhược điểm: Không có tính năng Single Sign-On (SSO). Nhân viên phải nhớ hàng chục mật khẩu. Khi cần audit hoặc thu hồi quyền, bạn sẽ phải đi từng app một. Rất tốn sức.

2. Cloud IAM (Auth0, Okta, Firebase)

  • Ưu điểm: Cực kỳ mượt, bảo mật chuẩn quốc tế, không lo bảo trì server.
  • Nhược điểm: Ví bạn sẽ “khóc” khi số lượng user tăng. Auth0 chỉ miễn phí cho 7.000 user đầu tiên, sau đó chi phí tăng rất nhanh. Ngoài ra, nhiều công ty yêu cầu dữ liệu user không được rời khỏi hạ tầng nội bộ.

3. Self-hosted Open Source (Keycloak, Casdoor)

  • Ưu điểm: Kiểm soát 100% dữ liệu. Hỗ trợ đầy đủ OAuth2, OpenID Connect (OIDC) và SAML 2.0. Quan trọng nhất là không tốn phí license.
  • Nhược điểm: Bạn phải tự lo khâu backup và đảm bảo server không “ngỏm” giữa chừng.

Tại sao Keycloak là lựa chọn số 1?

Mình chốt Keycloak vì nó là dự án được Red Hat bảo trợ, cực kỳ uy tín. Nó có khả năng kết nối trực tiếp với LDAP hoặc Active Directory có sẵn của công ty. Nếu muốn user login bằng Google hay GitHub? Keycloak xử lý trong vài nốt nhạc.

Dù hơi tốn tài nguyên vì chạy trên Java (Quarkus), nhưng độ ổn định và tính năng của nó thì không có đối thủ trong phân khúc mã nguồn mở.

Triển khai nhanh với Docker Compose

Để chạy thực tế, mình dùng PostgreSQL làm database thay vì bản H2 mặc định. Dưới đây là cấu hình mình đang áp dụng, giúp hệ thống chịu tải tốt hơn.

version: '3.8'

services:
  postgres:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password_sieu_manh_o_day
    networks:
      - keycloak_network

  keycloak:
    image: quay.io/keycloak/keycloak:24.0
    command: start-dev
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: password_sieu_manh_o_day
      KC_HOSTNAME: sso.yourdomain.com
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin_password_sieu_cap
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    networks:
      - keycloak_network

networks:
  keycloak_network:
    driver: bridge

volumes:
  postgres_data:

Mẹo nhỏ: Đừng bao giờ đặt mật khẩu kiểu 123456. Mình thường dùng toolcraft.app/vi/tools/security/password-generator để tạo chuỗi 32 ký tự ngẫu nhiên. Công cụ này chạy hoàn toàn ở trình duyệt, cực kỳ an toàn cho anh em dev.

Cấu hình Realm và Client: Những khái niệm cần nắm

Sau khi lệnh docker-compose up -d hoàn tất, bạn sẽ vào giao diện quản trị. Hãy nhớ: tuyệt đối không dùng realm master cho ứng dụng khách.

Tạo Realm mới

Hãy coi Realm là một “vương quốc” riêng. Mỗi dự án hoặc mỗi khách hàng nên có một Realm để quản lý user độc lập, tránh nhầm lẫn dữ liệu.

Thiết lập Client

Đây là nơi khai báo ứng dụng kết nối. Ví dụ, app Dashboard của mình chạy tại https://dashboard.internal. Mình sẽ chọn Access Type là confidential để lấy Client Secret, giúp tăng tính bảo mật lên mức cao nhất.

Bài học thực chiến (Troubleshooting)

Vận hành Keycloak không phải lúc nào cũng trải đầy hoa hồng. Mình đã từng “ăn hành” với vài lỗi sau:

  1. Header Nginx: Nếu dùng Reverse Proxy, bạn buộc phải set X-Forwarded-Proto: https. Thiếu nó, Keycloak sẽ từ chối cấp token vì nghi ngờ kết nối không an toàn.
  2. RAM tối thiểu: Đừng cố chạy Keycloak trên VPS 512MB. Nó cần ít nhất 1GB RAM để khởi động mượt mà. Khi có khoảng 50 request login cùng lúc, mức chiếm dụng RAM có thể vọt lên 1.5GB.
  3. Lệch múi giờ: Nếu giờ server và database lệch nhau quá 5 phút, token OIDC sẽ hết hạn ngay khi vừa tạo. Hãy cài NTP để đồng bộ thời gian chuẩn xác.

Tổng kết

Keycloak không chỉ giúp mình nhàn hơn khi quản lý nhân sự. Nó còn giúp hệ thống chuyên nghiệp hơn hẳn. Việc kích hoạt bảo mật 2 lớp (MFA) cho toàn bộ ứng dụng bây giờ chỉ tốn đúng 2 cú click chuột.

Thay vì để mỗi app tự lo khâu đăng nhập, hãy giao việc đó cho một “chuyên gia” như Keycloak. Chúc bạn có những đêm ngon giấc, không còn nỗi lo thu hồi tài khoản thủ công.

Share: