Hướng dẫn dùng ldap connection trong PHP

Bạn sẽ nghĩ rằng chỉ cần xác thực một người dùng trong Active Directory sẽ là một quá trình khá đơn giản bằng cách sử dụng LDAP trong PHP mà không cần thư viện. Nhưng có rất nhiều thứ có thể làm phức tạp nó khá nhanh:

  • Bạn phải xác nhận đầu vào. Tên người dùng / mật khẩu trống sẽ vượt qua nếu không.
  • Bạn nên đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách khi ràng buộc.
  • Bạn nên mã hóa kết nối bằng TLS.
  • Sử dụng các máy chủ LDAP riêng biệt để dự phòng trong trường hợp một máy chủ gặp sự cố.
  • Nhận được thông báo lỗi thông tin nếu xác thực không thành công.

Trong hầu hết các trường hợp, việc sử dụng thư viện LDAP hỗ trợ điều trên thực sự dễ dàng hơn. Cuối cùng, tôi đã hoàn thành thư viện của riêng mình để xử lý tất cả các điểm trên: LdapTools (Chà, không chỉ để xác thực, nó có thể làm được nhiều hơn thế nữa). Nó có thể được sử dụng như sau:

use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;

$domain = (new DomainConfiguration('example.com'))
    ->setUsername('username') # A separate AD service account used by your app
    ->setPassword('password')
    ->setServers(['dc1', 'dc2', 'dc3'])
    ->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);

if (!$ldap->authenticate($username, $password, $message)) {
    echo "Error: $message";
} else {
    // Do something...
}

Cuộc gọi xác thực ở trên sẽ:

  • Xác thực rằng không có tên người dùng hoặc mật khẩu nào trống.
  • Đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách (UTF-8 theo mặc định)
  • Hãy thử một máy chủ LDAP thay thế trong trường hợp một máy chủ gặp sự cố.
  • Mã hóa yêu cầu xác thực bằng TLS.
  • Cung cấp thông tin bổ sung nếu không thành công (ví dụ: tài khoản bị khóa / bị vô hiệu hóa, v.v.)

Có những thư viện khác cũng làm điều này (Chẳng hạn như Adldap2). Tuy nhiên, tôi cảm thấy đủ bắt buộc phải cung cấp thêm một số thông tin vì câu trả lời được nhiều người bình chọn nhất thực sự là một rủi ro bảo mật khi không thực hiện xác thực đầu vào và không sử dụng TLS.

17 hữu ích 2 bình luận chia sẻ

Lời mở đầu.

Đối với hệ thống OpenLDAP thì việc quản lý, update tài khoản người dùng phải dùng bằng lệnh cho nên khá khó khăn do đó hôm này mình sẽ giới thiệu đến mọi người một công cụ giúp chúng ta có thể dễ dàng quản lý OpenLDAP đó là phpLDAPadmin.Một công cụ được code bằng ngôn ngữ PHP và chạy trên nền web cho nên ứng dụng này đáng được lựa chọn nếu như chúng ta đang cần một công cụ hỗ trợ việc quản trị OpenLDAP.

Nội dung chính

  • Lời mở đầu.
  • Chuẩn bị.
  • TRƯỜNG HỢP 1: Cài đặt trực tiếp trên node cài OpenLDAP
  • TRƯỜNG HỢP 2: phpLDAPadmin nằm trên node không cài OpenLDAP.
  • TRƯỜNG HỢP 3: Dùng một máy chủ phpLDAPadmin quản lý nhiều backend OpenLDAP
  • Tổng kết.

Nội dung chính

  • Lời mở đầu.
  • Chuẩn bị.
  • TRƯỜNG HỢP 1: Cài đặt trực tiếp trên node cài OpenLDAP
  • TRƯỜNG HỢP 2: phpLDAPadmin nằm trên node không cài OpenLDAP.
  • TRƯỜNG HỢP 3: Dùng một máy chủ phpLDAPadmin quản lý nhiều backend OpenLDAP
  • Tổng kết.

Nội dung chính

  • Lời mở đầu.
  • Chuẩn bị.
  • TRƯỜNG HỢP 1: Cài đặt trực tiếp trên node cài OpenLDAP
  • TRƯỜNG HỢP 2: phpLDAPadmin nằm trên node không cài OpenLDAP.
  • TRƯỜNG HỢP 3: Dùng một máy chủ phpLDAPadmin quản lý nhiều backend OpenLDAP
  • Tổng kết.

Chuẩn bị.

  • Cài đặt OpenLDAP trên CentOS 7

TRƯỜNG HỢP 1: Cài đặt trực tiếp trên node cài OpenLDAP

1. Cài đặt httpd

Mở file /etc/httpd/conf/httpd.conf và sửa đổi các thông tin sau:

# Tại dòng 151 sửa như sau :
AllowOverride All

# Tại dòng 164, sửa thông tin như sau:
DirectoryIndex index.html index.cgi index.php

# Thêm vào cuối file những cấu hình sau:
ServerTokens Prod
KeepAlive On

Khởi động httpd:

systemctl start httpd
systemctl enable httpd

2. Cài đặt PHP

yum -y install php php-mbstring php-pear

Mở file /etc/php.ini và sửa lại các thông tin như sau:

# Tại dòng 878 sửa lại timezone:
date.timezone = "Asia/Ho_Chi_Minh"

Tải và cài dặt epel 7:

yum install wget -y
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm

Cài đặt phpLDAPadmin

yum --enablerepo=epel -y install phpldapadmin

Mở file /etc/phpldapadmin/config.php và sửa lại thông tin như sau:

# Tại dòng 398:
$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');

Cho phép truy cập vào phpLDAPadmin:

cat > /etc/httpd/conf.d/phpldapadmin.conf << EOF
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs

<Directory /usr/share/phpldapadmin/htdocs>
  <IfModule mod_authz_core.c>
    # Apache 2.4
    Require all granted
  </IfModule>
  <IfModule !mod_authz_core.c>
    # Apache 2.2
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
    Allow from ::1
  </IfModule>
</Directory>
EOF

Khởi động lại httpd:

Truy cập theo đường dẫn :

IP_PHP_LDAP_ADMIN/phpldapadmin

Kết quả như sau:

Đăng nhập với dnpassword như sau:

Giao diện sau khi đăng nhập :

TRƯỜNG HỢP 2: phpLDAPadmin nằm trên node không cài OpenLDAP.

Mô hình như sau:

Các bước cài đặt tương tự như trên, chúng ta cần phải thêm đoạn cấu hình để bind đến OpenLDAP server thì mới có thể đăng nhập được. Để thực hiện chúng ta dùng trình soạn thảo vi mở file /usr/share/phpldapadmin/config/config.php

vi /usr/share/phpldapadmin/config/config.php

Sau đó tại dòng 584 thêm đoạn $servers->setValue('server','host','10.10.10.185'); với 10.10.10.185 là ip của máy chủ OpenLDAP.

Sau đó truy cập vào web như bình thường.

TRƯỜNG HỢP 3: Dùng một máy chủ phpLDAPadmin quản lý nhiều backend OpenLDAP

Giả định rằng chúng ta có khoảng 3 máy chủ chạy OpenLDAP để chạy xác thực cho các hệ thống khác nhau và 3 máy chủ này không hề có liên quan gì đến nhau, trên lý thuyết chúng ta phải cài 3 máy chủ chạy OpenLDAP để quản lý 3 máy OpenLDAP kia, tuy nhiên chúng ta vẫn có thể cấu hình phpLDAPadmin bind đến nhiều máy chủ chỉ định khác nhau. Ở đâu mình có mô hình như sau :

Chúng ta vẫn cài phpLDAPadmin như ở trường hợp 1, sau đó chúng ta mở file /usr/share/phpldapadmin/config/config.php và thêm những cấu hình như sau:

# OpenLDAP1
$servers->setValue('server','host','10.10.10.185');

# OpenLDAP2
$servers->newServer('ldap_pla');
$servers->setValue('server','name','LDAP Server 2');
$servers->setValue('server','host','10.10.10.184');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array(''));
$servers->setValue('login','auth_type','cookie');
$servers->setValue('login','bind_id','');
$servers->setValue('login','bind_pass','');
$servers->setValue('server','tls',false);

# OpenLDAP3
$servers->newServer('ldap_pla');
$servers->setValue('server','name','LDAP Server 3');
$servers->setValue('server','host','10.10.10.183');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array(''));
$servers->setValue('login','auth_type','cookie');
$servers->setValue('login','bind_id','');
$servers->setValue('login','bind_pass','');
$servers->setValue('server','tls',false);

Chi tiết chỉnh sửa như sau :

Nếu có thêm những server khác thì thêm đoạn cấu hình giống OpenLDAP2 xuống dưới sau đó lưu lại.

Kiểm tra trên giao diện web, bây giờ chúng ta có thể chọn máy chủ quản trị trước khi đăng nhập rồi:

Bài blog đến đây là hết, chúc mọi người thành công !!!

Tổng kết.

Ở bài này mình đã hướng dẫn cách để cài đặt phpLDAPadmin cho mọi người có thể dụng để quản trị các thông tin trong slapd, ở bài viết tiếp theo mình sẽ giới thiệu cho mọi người cách SSH với LDAP.


Thực hiện bởi cloud365.vn

Written by Phạm Thành Đạt