Cài đặt LDAP
From LimeSurvey Manual
Chung
Bạn phải bật hỗ trợ LDAP trong config.php và định cấu hình các tham số LDAP trong config/ldap.php để sử dụng chức năng này.
Kích hoạt LDAP trong config.php
- $enableLdap: nếu bạn muốn sử dụng các chức năng LDAP trong LimeSurvey, bạn phải đặt tham số này thành true (mặc định nó được đặt thành false):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Xác định máy chủ LDAP
Trước tiên hãy xác định các tùy chọn kết nối máy chủ LDAP trong "application/config/ldap.php". Đối với mỗi máy chủ, có các tùy chọn sau:
- $serverId: Một số nguyên xác định máy chủ LDAP này. Nó được sử dụng trong các định nghĩa truy vấn để liên kết máy chủ với một truy vấn cụ thể;
- $ldap_server [ $serverId] [ 'server']: Địa chỉ IP hoặc tên DNS của máy chủ LDAP. Nếu bạn sử dụng kết nối bảo mật SSL (LDAP hoặc LDAP+Start-TLS), tên này phải tương ứng với Chứng chỉ CN (hoặc Chủ đềAlternativeName);
- $ldap_server của máy chủ [ $serverId] [ 'protoversion']: Có thể là 'ldapv2' hoặc 'ldapv3' tùy thuộc vào giao thức được máy chủ của bạn hỗ trợ. 'ldapv3' là giao thức ưa thích. Tuy nhiên, nếu bạn muốn sử dụng các kết nối được mã hóa, hãy lưu ý rằng LDAP được hỗ trợ ở chế độ 'ldapv2' trong khi Start-TLS là phương thức mã hóa cho 'ldapv3';
- $ldap_server [ $serverId] [ 'encrypt']: Xác định phương thức mã hóa được sử dụng. 'ldaps' được hỗ trợ cho máy chủ 'ldav2', 'start-tls' cho máy chủ 'ldapv3'. Từ khóa 'none' được sử dụng cho liên lạc LDAP văn bản rõ ràng;
- Đừng quên rằng để mã hóa 'ldaps' hoặc 'start-tls', máy chủ web phải có khả năng kiểm tra chứng chỉ của máy chủ LDAP. Do đó, bạn cần xác định Tổ chức phát hành chứng chỉ trong thư viện openldap của mình (thông thường việc này được thực hiện trong tệp /etc/openldap/ldap.conf trong linux).
- $ldap_server [ $serverId] [ 'referrals']: Đó là một tham số boolean xác định xem có phải tuân theo các giới thiệu hay không (sử dụng false cho ActiveDirectory);
- $ldap_server [ $serverId] [ 'encoding']: Đây là tham số tùy chọn cung cấp mã hóa được thư mục LDAP sử dụng để lưu trữ chuỗi. Bạn thường không cần thiết lập tham số này vì mã hóa giả định mặc định, 'utf-8', là mã hóa tiêu chuẩn cho các thư mục LDAP. Tuy nhiên, nếu bạn đang sử dụng Active Directory và gặp sự cố khi nhập chuỗi có dấu, hãy thử thiết lập tham số này cho mã hóa được sử dụng trong khu vực của bạn (ví dụ: 'cp850' dành cho Tây Âu). Bạn có thể tham khảo danh sách thả xuống "Bộ ký tự của tệp" trong GUI Nhập mã thông báo từ tệp CSV để có danh sách đầy đủ các mã hóa được hỗ trợ.
Tiếp theo, bạn cần xác định xác thực nào là cần thiết để có quyền truy cập vào thư mục. Nếu quyền truy cập 'ẩn danh' được cho phép, KHÔNG đặt hai tham số sau, nếu không hãy đặt chúng cho phù hợp:
- $ldap_server [ $serverId] [ 'binddn']: DN của người dùng 'LDAP' được phép đọc thư mục;
- $ldap_server [ $serverId] [ 'bindpw']: Mật khẩu cho người dùng LDAP ở trên.
Nếu bạn cần xác định các máy chủ LDAP khác, hãy thêm dòng sau để tăng serverID và xác định các tham số mới:
- $serverId++.
Xác định truy vấn trong config/ldap.php
Thận trọng: khi cần có tên thuộc tính ldap trong một trong các tham số này, chỉ sử dụng tên viết thường: ví dụ: tên hiển thị và KHÔNG hiển thịTên.
Vui lòng tham khảo tệp config/ldap.php vì nó chứa cấu hình mẫu.
Truy vấn đơn giản
Hãy bắt đầu với các truy vấn đơn giản. Các truy vấn này chỉ lọc các mục LDAP dựa trên thuộc tính và vị trí của chúng. Chúng thường đủ để truy vấn ActiveDirectory.
- $query_id: là id của truy vấn LDAP;
- $ldap_queries [ $query_id] [ 'ldapServerId']: Liên kết truy vấn với một máy chủ cụ thể;
- $ldap_queries [ $query_id] [ 'name']:' Chuỗi mô tả truy vấn. Nó sẽ được hiển thị trong GUI;
- $ldap_queries [ $query_id] [ 'userbase']: Root DN để sử dụng cho tìm kiếm của người dùng;
- $ldap_queries [ $query_id] [ 'userfilter']: Đây là bộ lọc được sử dụng để chọn các mục nhập của người dùng tiềm năng. Nó phải được đặt trong dấu ngoặc đơn;
- $ldap_queries [ $query_id] [ 'userscope']: phạm vi tìm kiếm LDAP dành cho người dùng ('base', 'one' hoặc 'sub');
- $ldap_queries [ $query_id] [ 'firstname_attr']: Thuộc tính Ldap sẽ được ánh xạ tới trường Firstname của mục nhập mã thông báo;
- $ldap_queries [ $query_id] [ 'lastname_attr']: Thuộc tính Ldap sẽ được ánh xạ tới trường Họ của mục nhập mã thông báo;
- $ldap_queries [ $query_id] [ 'email_attr']: Thuộc tính Ldap sẽ được ánh xạ tới trường địa chỉ email của mục nhập mã thông báo.
Tùy chọn, bạn có thể truy xuất thêm thông tin từ thư mục:
- $ldap_queries [ $query_id] [ 'token_attr']: Thuộc tính Ldap sẽ được ánh xạ tới mã mã thông báo;
- $ldap_queries [ $query_id] [ 'ngôn ngữ']: Thuộc tính Ldap sẽ được ánh xạ tới mã ngôn ngữ của người dùng;
- $ldap_queries [ $query_id] [ 'attr1']: Thuộc tính Ldap sẽ được ánh xạ tới trường attribute_1;
- $ldap_queries [ $query_id] [ 'attr2']: Thuộc tính Ldap sẽ được ánh xạ tới trường attribute_2.
Truy vấn nhóm kết hợp với các thành viên DN
Bây giờ chúng ta hãy xem cách xác định một truy vấn phức tạp hơn.
Các truy vấn sau đây sử dụng tìm kiếm LDAP đầu tiên để xem xét các nhóm LDAP. Nhóm LDAP là một mục nhập LDAP chứa các tham chiếu đến các mục nhập của người dùng ở dạng:
- id người dùng (ví dụ: posixGroups do) ==> Xem phần tiếp theo
- Hoặc DN của người dùng (ví dụ: groupofnames và groupofuniquenames làm) ==> xem bên dưới
Ở đây chúng tôi xử lý các nhóm chứa DN người dùng:
- define $query_id, $ldap_queries [ $query_id] [ 'ldapServerId'], $ldap_queries [ $query_id] [ 'name'] như đã giải thích ở trên.
Sau đó xác định các tham số bộ lọc nhóm:
- $ldap_queries [ $query_id] [ 'groupbase']: Root DN mà bạn muốn bắt đầu tìm kiếm các mục nhập nhóm từ đó;
- $ldap_queries [ $query_id] [ 'groupfilter']: Bộ lọc LDAP sẽ chọn các mục nhập nhóm tiềm năng;
- $ldap_queries [ $query_id] [ 'groupscope']: Phạm vi tìm kiếm LDAP cho các nhóm ('on', 'base' hoặc 'sub');
- $ldap_queries [ $query_id] [ 'groupmemberattr']: Tên của thuộc tính LDAP trong mục nhập nhóm sẽ chứa tham chiếu đến mục nhập của người dùng;
- $ldap_queries [ $query_id] [ 'groupmemberisdn']: TRUE.
Lúc này, mọi thứ đã được thiết lập để cho phép tìm kiếm LDAP đầu tiên tìm thấy người dùng tương ứng với các nhóm đã chọn. Tuy nhiên, bạn có thể hạn chế "ứng viên người dùng" nào sẽ được chọn bằng cách áp dụng bộ lọc khác cho họ. Tất nhiên, đây là tùy chọn:
- $ldap_queries [ $query_id] [ 'userbase']: DN cơ sở cho tìm kiếm LDAP của người dùng (chỉ ứng cử viên người dùng phù hợp với cơ sở này) sẽ được chọn;
- $ldap_queries [ $query_id] [ 'userscope']: Phạm vi tìm kiếm LDAP của người dùng (chỉ ứng cử viên người dùng phù hợp với cơ sở người dùng+phạm vi) mới được chọn;
- $ldap_queries [ $query_id] [ 'userfilter']: Đây là bộ lọc áp dụng cho từng mục nhập ứng viên của người dùng (trên các thuộc tính của nó) để thêm một lựa chọn khác.
Truy vấn nhóm kết hợp với các thành viên UID
Bây giờ chúng ta hãy xem cách xác định truy vấn Nhóm kết hợp khi thành viên nhóm là UID người dùng chứ không phải DN người dùng.
Đối với các truy vấn Nhóm có thành viên DN, các truy vấn này sử dụng tìm kiếm LDAP đầu tiên để tìm các mục nhập của nhóm LDAP và nhận thành viên của chúng. Các giá trị thành viên này sau đó được sử dụng trong bộ lọc tìm kiếm của người dùng để tìm kiếm các mục tương ứng. Do đó, một tham số khác phải được cấu hình để xác định thuộc tính người dùng trong mục nhập của người dùng phải khớp với UID thành viên được tìm thấy trong các nhóm.
Hãy xem lại các tham số bắt buộc:
- define $query_id, $ldap_queries [ $query_id] [ 'ldapServerId'], $ldap_queries [ $query_id] [ 'name'] như đã giải thích ở trên
Sau đó xác định các tham số bộ lọc nhóm:
- $ldap_queries [ $query_id] [ 'groupbase']: Root DN mà bạn muốn bắt đầu tìm kiếm các mục nhập nhóm từ đó;
- $ldap_queries [ $query_id] [ 'groupfilter']: Bộ lọc LDAP sẽ chọn các mục nhập nhóm tiềm năng;
- $ldap_queries [ $query_id] [ 'groupscope']: Phạm vi tìm kiếm LDAP cho các nhóm ('on', 'base' hoặc 'sub');
- $ldap_queries [ $query_id] [ 'groupmemberattr']: Tên của thuộc tính LDAP trong mục nhập nhóm sẽ chứa tham chiếu đến mục nhập của người dùng;
- $ldap_queries [ $query_id] [ 'groupmemberisdn']: FALSE;
- $ldap_queries [ $query_id] [ 'useridattr']: tên thuộc tính người dùng phải khớp với UID được tìm thấy trong các thành viên nhóm.
Tại thời điểm này, mọi thứ đã được thiết lập để cho phép tìm kiếm LDAP đầu tiên tìm thấy UID người dùng tương ứng với các nhóm đã chọn và bộ lọc tìm kiếm người dùng sẽ tự động được điền.
Tuy nhiên, bạn có thể hạn chế 'ứng cử viên người dùng' nào sẽ được chọn bằng cách hoàn thành bộ lọc người dùng tự động được tính toán từ UID thành viên. Tất nhiên, đây là tùy chọn:
- $ldap_queries [ $query_id] [ 'userbase']: DN cơ sở cho tìm kiếm LDAP của người dùng (chỉ ứng cử viên người dùng phù hợp với cơ sở này) sẽ được chọn;
- $ldap_queries [ $query_id] [ 'userscope']: Phạm vi tìm kiếm LDAP của người dùng (chỉ ứng cử viên người dùng phù hợp với cơ sở người dùng+phạm vi) mới được chọn;
- $ldap_queries [ $query_id] [ 'userfilter']: Đây là bộ lọc áp dụng cho từng mục nhập ứng viên của người dùng (trên các thuộc tính của nó) để thêm một lựa chọn khác.
Còn Active Directory thì sao?
Active Directory (AD) là một sổ đăng ký của Microsoft có thể được truy vấn bằng cách sử dụng giao thức LDAP.
Sau đó, có thể sử dụng nội dung của nó cho các truy vấn mã thông báo LimeSurvey, nhưng điều này đòi hỏi kiến thức về cách tổ chức AD.
- Cơ sở gốc LDAP là dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Ví dụ: nếu công ty của bạn sở hữu miền DNS 'my-company.com' và miền Windows của bạn là 'employees' thì cơ sở gốc của bạn là dc=employees,dc=my-company,dc=com
- Người dùng và nhóm người dùng được lưu trữ bên dưới cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (xin lưu ý rằng đây không phải là ou=users);
- Nhóm Active Directory:
- Nhóm các đối tượng chứa DN của các thành viên trong thuộc tính 'thành viên' của chúng;
- Tư cách thành viên nhóm cũng được lưu trữ trong thuộc tính memberOf của mỗi mục nhập của người dùng. Thuộc tính này chứa DN của các nhóm mà người dùng thuộc về;
- một số nhóm nằm trong CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Ví dụ: cn=Administrator,CN =Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
Trong một số trường hợp, việc truy vấn một thư mục hoạt động không dễ dàng, vì vậy đây là cấu hình mẫu để lấy một số thông tin về thư mục hoạt động:
//Kết nối với thư mục hoạt động Máy chủ:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId] ['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "không"; // Hầu hết các máy chủ AD LDAP sẽ không được đặt mã hóa theo mặc định
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user ";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx ,DC=yyy"; cái này sẽ không hoạt động với thư mục hoạt động, đó là lý do tại sao bạn cần sử dụng "domain\\user"
//Đây là một truy vấn mẫu để nhận tất cả người dùng đang hoạt động của một thư mục hoạt động:
$query_id=0 ;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Nhân viên có tài khoản được kích hoạt';
$ldap_queries[$query_id] ['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl=514) ))';
//(!(userAccountControl=514)) bạn không thể yêu cầu thư mục hoạt động cho một người dùng đang hoạt động nhưng bạn có thể yêu cầu một người dùng không hoạt động
$ldap_queries[$query_id][ 'userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Để trống để tạo mã thông báo tự động bằng phpsv
$ldap_queries[$query_id]['lingu'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
//Không thể lọc nhóm trong thư mục hoạt động, bạn cần thêm thuộc tính memberOf của người dùng. Đây là truy vấn mẫu để nhận tất cả người dùng đang hoạt động là thành viên của nhóm "samplegroup" trong thư mục đang hoạt động:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ ldap_queries[$query_id]['name'] = 'Tất cả thành viên của samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl=514 )))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$ query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Để trống để tạo mã thông báo tự động bằng phpsv
$ldap_queries[$query_id]['lingu'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
Một ví dụ khác Truy vấn của người dùng:
$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Person''')(objectClass='''user''')(!('''userAccountControl=514' '')))'; // AD không nhận diện các tài khoản đã kích hoạt theo cách thông thường nên thay vào đó chúng tôi kiểm tra xem người dùng có bị vô hiệu hóa không
- Như được đề xuất trong tệp cấu hình, hãy cân nhắc thêm (!(email=*)) vào bộ lọc người dùng của bạn để bỏ qua những người dùng không có địa chỉ email.
Truy vấn nhóm ví dụ:
$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''group''')(cn=Quản trị viên miền))'; // AD không sử dụng tên thuộc tính tiêu chuẩn cho các nhóm, vì vậy hãy sử dụng ví dụ này thay thế.
Tìm thêm thông tin về cấu trúc Active Directory LDAP trên Kiến trúc Active Directory và Library/cc223122.aspx Đặc tả kỹ thuật Active Directory.