Loading...

LDAP/AD Integration trên FortiGate

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

Sau khi triển khai xong local user cho vài tài khoản dùng riêng, anh Nam nhận thêm yêu cầu: công ty đã có sẵn Active Directory quản lý gần 200 tài khoản nhân viên, và sếp muốn FortiGate dùng luôn tài khoản AD đó để xác thực — nhân viên không phải nhớ thêm một bộ username/password riêng cho firewall.

Anh Nam định tạo local user trùng tên với từng tài khoản AD, nhưng chị Lan ngăn lại ngay: "Làm vậy thì em phải đồng bộ tay mỗi khi có người vào/ra công ty, sai sót là chuyện sớm muộn. FortiGate hỗ trợ kết nối trực tiếp tới AD qua LDAP — nó không lưu password của ai cả, mỗi lần xác thực nó hỏi thẳng AD."

Bài này trình bày cách cấu hình FortiGate làm LDAP client kết nối tới Active Directory, cách ánh xạ AD Group vào FortiGate User Group, và những lỗi bind thường gặp khi triển khai thực tế.


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

2.1 LDAP Server object — các tham số bắt buộc

FortiGate cấu hình một LDAP server bằng lệnh config user ldap. Đây là những tham số cốt lõi cần có:

config user ldap
    edit "AD-COMPANY"
        set server "10.10.10.5"
        set cnid "sAMAccountName"
        set dn "dc=company,dc=local"
        set type regular
        set username "cn=svc-fortigate,cn=Users,dc=company,dc=local"
        set password ********
        set port 389
    next
end

Giải thích các tham số quan trọng:

  • server — địa chỉ IP hoặc FQDN của Domain Controller.
  • cnid — tên trường (attribute) LDAP dùng làm username đăng nhập. Với AD thường là sAMAccountName (tên đăng nhập kiểu nam.nv) hoặc userPrincipalName (kiểu email nam.nv@company.local).
  • dn — Base DN, điểm bắt đầu tìm kiếm trong cây LDAP, ví dụ dc=company,dc=local.
  • type — kiểu bind: simple (bind trực tiếp bằng chính username/password người dùng nhập, chỉ dùng được khi cnid cho phép bind thẳng), anonymous (bind ẩn danh trước khi tìm DN), hoặc regular (bind bằng một tài khoản dịch vụ có quyền đọc AD trước, sau đó tìm DN thật của user rồi bind lại — cách phổ biến và ổn định nhất với AD).
  • username/password — tài khoản dịch vụ dùng để bind khi type regular, phải là Distinguished Name (DN) đầy đủ của tài khoản đó trong AD, không phải chỉ tên đăng nhập.
  • port — mặc định 389 (LDAP thường), 636 nếu dùng LDAPS (LDAP over SSL).

⚠️ Lưu ý: type regular là lựa chọn an toàn nhất với AD vì sAMAccountName không phải lúc nào cũng bind trực tiếp được tùy cấu hình domain. Sơ đồ dưới đây minh họa rõ luồng 2 bước bind này.

Luồng xác thực LDAP giữa FortiGate và Active Directory Client đăng nhập (SSL-VPN / Policy) FortiGate config user ldap bind theo cnid + dn Active Directory LDAP Server port 389/636 Trả kết quả bind: thành công/thất bại 2 bước bind thường dùng (khi user không tự bind được) 1. Bind bằng tài khoản dịch vụ (username/password) 2. Tìm DN user theo group-filter, rồi bind lại Dùng khi cnid không phải trường bind trực tiếp được (VD: sAMAccountName)

2.2 LDAPS — mã hóa kết nối tới Domain Controller

Theo mặc định, LDAP truyền thống (port 389) gửi thông tin bind ở dạng không mã hóa trên đường truyền nội bộ. Với môi trường yêu cầu bảo mật cao hơn, nên bật LDAPS:

config user ldap
    edit "AD-COMPANY"
        set port 636
        set secure ldaps
        set ca-cert "CA_Cert_1"
    next
end

ca-cert trỏ tới certificate CA đã import vào FortiGate dùng để verify chứng chỉ do Domain Controller trình ra — chủ đề import Certificate đã được trình bày ở Certificate trên FortiGate: Local Cert, CA, Import. Nếu chưa import CA cert đúng, FortiGate sẽ báo lỗi bind dù thông tin server/port đều chính xác.

2.3 Ánh xạ AD Group vào FortiGate User Group

Đây là bước hay bị nhầm lẫn: FortiGate không tự động đọc toàn bộ AD — cần khai báo rõ group nào trong AD sẽ được ánh xạ vào group nào trên FortiGate, thông qua config match bên trong config user group:

config user group
    edit "GRP_KETOAN_AD"
        set group-type firewall
        config match
            edit 1
                set server-name "AD-COMPANY"
                set group-name "CN=KeToan,OU=Groups,DC=company,DC=local"
            next
        end
    next
end
  • server-name — tên LDAP server object đã tạo ở bước 2.1.
  • group-name — DN đầy đủ của group bên AD (không phải chỉ tên hiển thị) — lấy chính xác qua công cụ ADSI Edithoặc dsquery group trên Domain Controller.

Khi Policy tham chiếu tới GRP_KETOAN_AD, FortiGate sẽ: xác thực user qua LDAP bind → kiểm tra user đó có phải thành viên của group AD tương ứng không → nếu đúng thì áp quyền của Policy.

🔄 Khác biệt version FortiOS: Từ 7.2 trở lên có thêm tùy chọn set group-search-base và set group-object-filter linh hoạt hơn, cho phép thu hẹp phạm vi tìm kiếm group trong cây LDAP lớn, giúp tăng tốc độ bind ở domain có hàng chục nghìn object. FortiOS 7.0 vẫn dùng được config match như trên nhưng không có các tùy chọn tinh chỉnh này.

2.4 Kiểm tra kết nối và debug lỗi bind

Trước khi đưa vào Policy thực tế, luôn test kết nối bằng lệnh:

diagnose test authserver ldap AD-COMPANY nam.nv <password>

Kết quả trả về authentication successful hoặc lỗi cụ thể. Một số lỗi thường gặp:

LỗiNguyên nhân phổ biến
Connection refused Firewall giữa FortiGate và DC chặn port 389/636, hoặc sai IP server
Bind failed Sai username/password của tài khoản dịch vụ (type regular), hoặc DN tài khoản dịch vụ nhập sai định dạng
No such object dn (Base DN) khai sai, không khớp cấu trúc domain thật
authentication successful nhưng Policy vẫn chặn User bind LDAP thành công nhưng không thuộc group đã khai trong config match — cần kiểm tra lại group-name

Ngoài ra có thể xem log chi tiết quá trình bind bằng:

diagnose debug application fnbamd -1
diagnose debug enable

⚠️ Lưu ý: Nhớ tắt debug (diagnose debug disable) ngay sau khi xong để tránh log tràn ngập console, ảnh hưởng hiệu năng theo dõi các phiên khác.


3. Hỏi & Đáp

FortiGate có lưu lại password của user AD không?

Không. Với xác thực LDAP, FortiGate chỉ chuyển tiếp (forward) yêu cầu bind tới Domain Controller mỗi lần user đăng nhập — không lưu trữ password người dùng cuối ở bất kỳ đâu trên FortiGate. Chỉ có password của tài khoản dịch vụ (type regular) được lưu (ở dạng mã hóa) để phục vụ bước bind đầu.

Vì sao nên dùng type regular thay vì simple với Active Directory?

type simple yêu cầu attribute cnid phải là trường bind trực tiếp được theo cấu trúc DN, điều này không phải lúc nào cũng đúng với sAMAccountName trên AD tùy theo cấu hình domain. type regular linh hoạt hơn vì nó dùng tài khoản dịch vụ để tìm DN thật của user trước, sau đó mới bind lại bằng chính thông tin user — hoạt động ổn định với hầu hết cấu trúc AD thực tế.

group-name trong config match có thể dùng tên hiển thị của group AD không?

Không nên. FortiGate yêu cầu Distinguished Name (DN) đầy đủ, ví dụ CN=KeToan,OU=Groups,DC=company,DC=local, không phải chỉ tên hiển thị "KeToan". Dùng sai định dạng là nguyên nhân phổ biến khiến user bind LDAP thành công nhưng vẫn bị Policy chặn.

Có thể dùng nhiều LDAP server dự phòng không?

Có, config user ldap cho phép khai set secondary-server và set tertiary-server để FortiGate tự chuyển sang server dự phòng khi server chính không phản hồi, tăng độ sẵn sàng cho xác thực khi Domain Controller chính gặp sự cố.


4. Quiz

Câu 1: Tham số nào trong config user ldap xác định attribute dùng làm username đăng nhập?

  • A. dn
  • B. cnid
  • C. server
  • D. type

Câu 2: type regular trong cấu hình LDAP hoạt động theo cơ chế nào?

  • A. Bind ẩn danh, không cần tài khoản dịch vụ
  • B. Bind trực tiếp bằng chính username/password người dùng
  • C. Bind bằng tài khoản dịch vụ trước, sau đó tìm DN thật rồi bind lại
  • D. Không hỗ trợ bind, chỉ dùng để đọc thông tin

Câu 3: Để ánh xạ một AD Group vào FortiGate User Group, cấu hình nào là bắt buộc?

  • A. config user setting
  • B. config match bên trong config user group
  • C. config firewall address
  • D. config system interface

Câu 4: Lệnh nào dùng để test nhanh kết nối và xác thực LDAP từ CLI?

  • A. diagnose sys top
  • B. diagnose test authserver ldap
  • C. execute ping
  • D. get system status

👉 Đáp án

Câu 1: B cnid xác định attribute LDAP nào (ví dụ sAMAccountName) được dùng làm username khi người dùng đăng nhập.

Câu 2: C type regular bind hai bước: đầu tiên bằng tài khoản dịch vụ để tìm DN thật của user, sau đó bind lại bằng chính thông tin user — phù hợp với hầu hết cấu trúc Active Directory.

Câu 3: B config match bên trong config user group là nơi khai báo server-name và group-name để ánh xạ group AD vào group trên FortiGate.

Câu 4: B diagnose test authserver ldap <server-name> <username> <password> giúp kiểm tra nhanh việc bind mà không cần tạo Policy thật để test.


📚 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 ➡️
Local User & User Group trên FortiGate Mục lục khóa học FortiGate RADIUS integration