Loading...

SAML / Azure AD (Entra ID) Integration trên FortiGate

1. Liên hệ thực tế

Công ty khách hàng chuyển sang dùng Microsoft 365 và Entra ID (tên mới của Azure Active Directory) làm nơi quản lý danh tính tập trung. Sếp yêu cầu: nhân viên đăng nhập SSL-VPN bằng chính tài khoản Microsoft 365 của họ, kèm MFA đã cấu hình sẵn trên Entra ID — không muốn phải bật thêm FortiToken riêng.

Anh Nam định dùng LDAP như đã học, nhưng chị Lan chỉ ra: "Entra ID không mở cổng LDAP ra ngoài Internet như AD on-premise. Muốn tích hợp, mình phải dùng SAML — FortiGate đóng vai Service Provider (SP), Entra ID đóng vai Identity Provider (IdP). Người dùng đăng nhập ngay trên trang của Microsoft, FortiGate chỉ nhận kết quả đã được ký số xác nhận."

Bài này trình bày cách thiết lập SAML SSO giữa FortiGate và Entra ID cho SSL-VPN, các khái niệm SP/IdP, Entity ID, ACS URL, và cách debug khi đăng nhập báo lỗi assertion.


2. Kiến thức cốt lõi

2.1 Vai trò SP và IdP trong SAML

SAML (Security Assertion Markup Language) là giao thức trao đổi thông tin xác thực dựa trên XML, có hai vai trò chính:

  • Service Provider (SP) — bên cần xác thực người dùng để cấp quyền truy cập, ở đây là FortiGate.
  • Identity Provider (IdP) — bên thực sự lưu trữ và xác thực danh tính, ở đây là Entra ID.

Khác với LDAP/RADIUS (FortiGate chủ động hỏi server để xác thực), SAML hoạt động theo mô hình redirect: FortiGate không bao giờ thấy password của người dùng — trình duyệt được chuyển hướng sang trang đăng nhập thật của Entra ID, sau khi xác thực thành công (bao gồm cả MFA nếu Entra ID yêu cầu), Entra ID trả về một Assertion đã ký số xác nhận danh tính, gửi ngược lại cho FortiGate.

Luồng SAML SSO: FortiGate (SP) và Entra ID (IdP) [Sơ đồ Tuần tự] Client / Browser FortiGate (SP) Entra ID (IdP) 1. Truy cập portal 2. Redirect AuthnRequest 3. Gửi AuthnRequest & Đăng nhập tại Entra ID 4. Trả SAML Response (Assertion) về ACS URL FortiGate kiểm tra Assertion Verify chữ ký bằng IdP certificate đã import Ánh xạ user-name / group-name → cấp quyền Lưu ý quan trọng: Đảm bảo ACS URL và Entity ID trên Entra ID trùng khớp chính xác với cấu hình Service Provider (SP) trên FortiGate

🔄 Không chỉ riêng Entra ID: SAML là một chuẩn mở, nên config user saml trên FortiGate hoạt động được với bất kỳ IdP nào tuân thủ SAML 2.0 — không riêng Entra ID. Các IdP phổ biến khác như Okta, Google Workspace, OneLogin, hay ADFS (Active Directory Federation Services) tự host on-premise đều dùng chung một bộ tham số cốt lõi (Entity ID, ACS URL, Certificate...) như trình bày trong bài này — chỉ khác giao diện quản trị và cách lấy metadata. Bài chọn Entra ID làm ví dụ minh họa vì đây là lựa chọn phổ biến nhất tại Việt Nam do đi kèm Microsoft 365, nhưng quy trình đấu nối về bản chất tương tự với các IdP khác.

2.2 Các thông số bắt buộc phải khớp giữa hai bên

Thông sốÝ nghĩaPhía FortiGatePhía Entra ID
Entity ID Định danh duy nhất của SP entity-id trong config user saml Khai trong "Identifier (Entity ID)"
ACS URL Nơi IdP gửi trả Assertion sau khi xác thực single-sign-on-url Khai trong "Reply URL (Assertion Consumer Service URL)"
IdP Entity ID Định danh của Entra ID idp-entity-id Lấy từ trang metadata của Entra ID
IdP Certificate Chứng chỉ dùng verify chữ ký Assertion Import vào FortiGate qua config vpn certificate remote Tải từ Entra ID (Base64)

⚠️ Lưu ý: Hai giá trị Entity ID và ACS URL phải khớp tuyệt đối từng ký tự (bao gồm cả scheme http/https, cổng nếu có) giữa cấu hình FortiGate và Entra ID. Đây là nguyên nhân phổ biến nhất gây lỗi khi mới thiết lập SAML SSO lần đầu.

2.3 Cấu hình SAML server trên FortiGate

config user saml
    edit "Entra-SSLVPN"
        set entity-id "https://vpn.company.com/remote/saml/metadata"
        set single-sign-on-url "https://vpn.company.com/remote/saml/login"
        set single-logout-url "https://vpn.company.com/remote/saml/logout"
        set idp-entity-id "https://sts.windows.net/<tenant-id>/"
        set idp-single-sign-on-url "https://login.microsoftonline.com/<tenant-id>/saml2"
        set idp-cert "Azure_SSO_Cert"
        set user-name "username"
        set group-name "group"
    next
end
  • user-name/group-name khai tên attribute mà Entra ID trả về trong Assertion tương ứng với username và group của người dùng. Các attribute này cấu hình ở phía Azure Portal tại mục Attributes & Claims của Enterprise Application — tên attribute ở hai bên phải khớp nhau.
  • idp-cert là tên certificate object đã import trước đó (tải từ Entra ID dạng Base64, import qua config vpn certificate remote).

Sau khi tạo SAML server, dùng làm nguồn xác thực cho user group tương tự các phương thức khác:

config user group
    edit "GRP_SSLVPN_SAML"
        set group-type firewall
        set member "Entra-SSLVPN"
    next
end

2.4 Ánh xạ group từ Entra ID

Muốn phân quyền theo phòng ban (ví dụ chỉ nhóm IT được VPN vào subnet quản trị), cần cấu hình config match để lọc theo group Object ID trả về từ Entra ID:

config user group
    edit "GRP_IT_SAML"
        set group-type firewall
        config match
            edit 1
                set server-name "Entra-SSLVPN"
                set group-name "<Object ID của group IT trên Entra ID>"
            next
        end
    next
end

group-name ở đây là Object ID (chuỗi GUID) của Security Group bên Entra ID, không phải tên hiển thị — lấy tại Entra ID > Groups > (chọn group) > Object ID.

🔄 Khác biệt version FortiOS: SAML SSO cho SSL-VPN đã có từ 6.4/7.0. Riêng SAML cho IPsec Dialup VPN (ike-saml-server gắn vào config system interface) là tính năng bổ sung từ các bản 7.x mới hơn — nếu khách hàng cần SSO cho IPsec thay vì SSL-VPN, cần kiểm tra kỹ version đang chạy trước khi tư vấn giải pháp.


3. Hỏi & Đáp

FortiGate có thấy password của người dùng khi dùng SAML không?

Không. Toàn bộ quá trình nhập password và xác thực MFA diễn ra trên trang của Entra ID (IdP). FortiGate chỉ nhận về một Assertion đã được ký số, xác nhận "người này đã đăng nhập thành công" — không bao giờ tiếp xúc trực tiếp với thông tin đăng nhập của người dùng.

Vì sao đăng nhập thành công trên Entra ID nhưng SSL-VPN vẫn báo lỗi?

Nguyên nhân phổ biến nhất là Entity ID hoặc ACS URL khai không khớp chính xác giữa hai bên, hoặc certificate IdP dùng để verify chữ ký đã hết hạn/import sai. Cũng có thể do attribute user-name/group-name khai trên FortiGate không khớp tên attribute thực tế mà Entra ID trả về — cần kiểm tra lại phần Attributes & Claims trên Azure Portal.

Có cần cấu hình cả LDAP song song với SAML không?

Không bắt buộc — SAML tự thân đã đủ để xác thực người dùng và lấy thông tin group qua Assertion. Một số tổ chức vẫn giữ LDAP song song cho các dịch vụ nội bộ không hỗ trợ SAML, nhưng với SSL-VPN dùng SAML là đủ.

SAML có hỗ trợ đăng xuất tập trung (Single Logout) không?

Có, qua single-logout-url — khi người dùng đăng xuất khỏi phiên SSL-VPN, FortiGate có thể gửi yêu cầu Single Logout Request tới Entra ID để đồng bộ trạng thái phiên, tùy theo Entra ID có bật hỗ trợ SLO cho ứng dụng đó hay không.


4. Quiz

Câu 1: Trong mô hình SAML, FortiGate đóng vai trò gì?

  • A. Identity Provider (IdP)
  • B. Service Provider (SP)
  • C. Certificate Authority
  • D. RADIUS server

Câu 2: Điều gì bắt buộc phải khớp chính xác giữa cấu hình FortiGate và Entra ID?

  • A. Tên VDOM
  • B. Entity ID và ACS URL
  • C. Địa chỉ IP LAN
  • D. Số serial thiết bị

Câu 3: FortiGate xác định danh tính người dùng qua SAML bằng cách nào?

  • A. Tự bind vào Entra ID để tra cứu username
  • B. Nhận Assertion đã ký số từ IdP sau khi người dùng đăng nhập trên trang của IdP
  • C. Gửi gói Access-Request tới Entra ID
  • D. Đọc trực tiếp password người dùng gửi lên

Câu 4: Để ánh xạ theo group cụ thể từ Entra ID, group-name trong config match cần khai giá trị gì?

  • A. Tên hiển thị của group
  • B. Object ID (GUID) của group
  • C. Distinguished Name (DN)
  • D. Filter-Id

👉 Đáp án

Câu 1: B FortiGate đóng vai Service Provider (SP) — bên yêu cầu xác thực và tin tưởng vào Assertion do Identity Provider (Entra ID) cung cấp.

Câu 2: B Entity ID và ACS URL phải khớp tuyệt đối giữa hai bên vì đây là các thông số IdP dùng để xác định đúng SP đang gửi yêu cầu và nơi trả kết quả về.

Câu 3: B SAML hoạt động theo mô hình redirect — người dùng đăng nhập trực tiếp trên IdP, sau đó IdP trả về Assertion đã ký số cho SP, SP không bao giờ thấy password.

Câu 4: B Entra ID dùng Object ID (chuỗi GUID) để định danh group, khác với LDAP dùng Distinguished Name hay RADIUS dùng Filter-Id.


📚 Bài viết thuộc khóa học FortiGate của VNExperts

🧭 Điều hướng

⬅️ Bài trước🏠 Mục lục khóa họcBài kế tiếp ➡️
RADIUS Integration trên FortiGate Mục lục khóa học FortiGate Captive Portal (Guest access)