Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.36 MB, 188 trang )
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
Ta có thể xem xét ví dụ sau :
Giả sử rằng có hai nhân viên tên là Jane Smith trong công ty : một người ở Kinh doanh và một ở
khu Kỹ thuật. Bây giờ giả sử các mục cho các nhân viên có cùng một mục gốc. Tên gọi chung
(cn)và tên đơn vị tổ chức (ou) không phải là thuộc tính là duy nhất. Tuy nhiên, cả hai có thể
được sử dụng kết hợp để tạo ra một RDN duy nhất
# Example of two entries with a multivalued RDN
dn: cn=Jane Smith+ou=Sales,dc=plainjoe,dc=org
cn: Jane Smith
//cn: common name
ou: Sales
//ou: organizational unit
//RDN co nhieu thuoc tinh:cn,ou
dn: cn=Jane Smith+ou=Engineering,dc=plainjoe,dc=org
cn: Jane Smith
ou: Engineering
Đối với cả những mục này, thành phần đầu tiên của DN là một RDN bao gồm hai giá trị: cn = Jane Smith
+ ou = Sales và cn = Jane Smith + ou = Engineering.
khi đó ta có cây thư mục với common name là Jane Smith duy nhất và giá tri RDN đa trị như
sau:
2. Thuộc tính trong ldap
Các khái niệm của các loại thuộc tính và cú pháp thuộc tính đã được đề cập trong các chương
trước. Các loại thuộc tính và quy tắc cú pháp liên quan tương tự như khai báo kiểu biến và kiểu
dữ liệu như trong nhiều ngôn ngữ lập trình. Các thuộc tính được sử dụng để giữ giá trị. Các biến
trong các chương trình thực hiện một nhiệm vụ tương tự-lưu trữ thông tin.
Không giống như các biến, các thuộc tính của LDAP có thể có nhiều giá trị. Khi gán một giá trị
mới cho một thuộc tính , nó sẽ thêm vào giá trị mới cùng với các giá trị khác đã có. Ta có thể
xem xét ví dụ sau:
# LDIF listing for dn: ou=devices,dc=plainjoe,dc=org
dn: ou=devices,dc=plainjoe,dc=org
objectclass: organizationalUnit
ou: devices
telephoneNumber: +1 256 555-5446
telephoneNumber: +1 256 555-5447
description: Container for all network enabled
devices existing within the plainjoe.org domain
Chương 2
6
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
Ta thấy tập tin LDIF có lưu hai giá trị cho thuộc tính telephoneNumber.Một số thuộc tính chỉ có
thể mang một giá trị duy nhất .Việc một thuộc tính đơn trị hoặc đa trị phụ thuộc vào định nghĩa
trong các server máy chủ. Các thuộc tính đơn trị bao thường gặp như tên quốc gia gia (c), tên
hiển thị (DisplayName), hoặc ID của user (uidNumber).
ý nghĩa giá trị các thuộc tính của objectClass
Tất cả các mục trong một thư mục LDAP luôn có một thuộc tính objectClass, và thuộc tính này
phải có ít nhất một giá trị. Mỗi giá trị objectClass có tác dụng như một khuôn mẫu để các dữ liệu
được lưu trữ trong mục. Nó định nghĩa một tập hợp các thuộc tính phải có mặt trong mục và các
thuộc tính tùy chọn có thể có hoặc không
Ta có thể xem theo ví dụ trên, giá trị của objectClass là organizationalUnit được quy định như sau:
Từ khóa MUST: các thuộc tính bắt buộc
Từ khóa MAY:các thuộc tính tùy chọn cho các đối tượng
Từ khóa SUP: chỉ ra đối tượng cha.Đối tượng con có đầy đủ các thuộc tính ,cú pháp của đối
tượng cha
3. Sự xác thực
Tại sao sự xác thực lại cần thiết trong một thư mục LDAP? Hãy nhớ rằng LDAP là một giao
thức dựa trên hướng kết nối. Quá trình xác thực được sử dụng để thiết lập các đặc quyền của user
cho mỗi phiên. Tất cả các việc như tìm kiếm, truy vấn, ... được thay đổi tùy theo mức độ được
cấp cho của người sử dụng
Chương 2
7
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
dn: cn=gerald carter,ou=people,dc=plainjoe,dc=org
objectClass: person
cn: gerald carter
sn: carter
telephoneNumber: 555-1234
userPassword: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ= =
Ta đã thêm một thuộc tính có tên là UserPassword. Thuộc tính này lưu trữ một thông tin đại diện cần thiết
để xác thực user. Tiền tố (trong trường hợp này, {MD5}) mô tả cách các thông tin được mã hóa. RFC
2307 định nghĩa các thuật toán mã hóa như {CRYPT},{MD5},{SHA},{SSHA}.
Mỗi user được cấp username và password.Trong trường hợp trên username là DN(cn=gerald
carter,ou=people,dc=plainjoe,dc=org) và password sử dụng là giá trị trong userPassword
Trong LDAP còn định nghĩa một vài phương thức xác nhận khách như:
Anonymous Authentication: Xác định nặc danh
Simple Authentication: xác thực đơn giản
Simple Authentication over SSL/TLS:xác thực đơn giản thông qua SSL/TLS
Simple Authentication and Security Layer (SASL):xác thực đơn giản và lớp bảo vệ
Anonymous Authentication:cho phép truy nhập với DN và password trống
Simple Authentication:tên đăng nhập DN và password sẽ được gửi đến LDAP server.Server sẽ so
sánh với giá trị có trong hệ thống (server sẽ thực hiện các chuyển đổi nếu cần thiết).Tuy nhiên
phương thức này có điểm yếu là thông tin gửi đến cho server ở dạng clear text.
Simple Authentication over SSL/TLS:mã hóa các thông tin gửi đi đến server.Có 2 cách sử dụng
phương thức này:
LDAP over SSL(LDAPS-tcp/636): được hỗ trợ bởi nhiều server LDAP.
LDAP over TLS(tcp/port389):cho phép server mã hóa hoặc không mã hóa các phiên.
Simple Authentication and Security Layer (SASL):
Một phương thức mở rộng được định nghĩa trong RFC 2222,được dùng để thêm các thông tin
xác thực trong việc kết nối định hướng.
RFC 2222 định nghĩa một vài phương thức xác thực cho SASL
•
•
•
Kerberos v4 (KERBEROS_V4)
The Generic Security Service Application Program Interface, Version 2 (GSSAPI), được định
nghĩa trong RFC 2078
The S/Key mechanism (SKEY)
Chương 2
8
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
•
•
GVHD: TS. Lưu Thanh Trà
The External (EXTERNAL) mechanism
4. Phân phối thư mục
Trong phân phối thư mục,các host khác nhau chứa các phần khác nhau của cây thư mục
Hình trên lớp people ou được lưu trong lớp riêng lẻ. Lý do để thực hiện phân phối thư mục:
a.Hiệu suất
Khi một phần của cây thư mục được sử dụng nhiều thì ta nên đặt phần này trên máy chủ của
chính nó, điều này cho phép client truy cập vào subtrees còn lại nhanh hơn.
b.Vị trí địa lý
Thường thì các client không truy cập vào một nhánh đặc biệt của thư mục trong một vị trí do ta
nên đặt phần này của thư mục gần hơn với các client yêu cầu sử dụng.
c.Ranh giới hành chính
Đôi khi dễ dàng hơn khi ủy quyền kiểm soát một nhánh thư mục bằng cách đặt các nhánh trên
một máy chủ điều khiển bởi nhóm chịu trách nhiệm cho các thông tin trong đó. Bằng cách này,
người điều khiển máy chủ có thể có quyền truy cập đầy đủ , sao chép và sao lưu mà không can
thiệp với một máy chủ công cộng.
Để chia cây thư mục giữa 2 server,ta phải cấu hình link giữa server chính và server giữ cây thư
mục people ou.Ta cần thiết lập superior knowledge reference link và subordinate knowledge
reference link
Subordinate( cấp dưới) knowledge link( hay reference) :kết nối 1 node trong cây thư mục đến
naming context của server khác.Thông thường naming context của server thứ 2 là sự tiếp tục của
thư mục.
Chương 2
9
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
Trong ví dụ trên, people ou trong cây thư mục chính không có thư mục con do query of entry
ou=people,dc=plainjoe,dc=org nằm trong server 2.Lúc này entry (lối vào) ou=people,dc=plainjoe,dc=org
trên server thư mục chính chứa thông tin tham khảo tới server thư mục thực sự chứa nó.
Hình ảnh thể hiện định nghĩa của lớp đối tượng referral trong RFC 3296
Lớp trên chỉ chứa 1 thuộc tính đó là ref.Thuộc tính này chứa file URI chỉ ra host chứa cây.Định
dạng của URI như sau:
ldap://[host:port]/[/dn[?attribute][?scope][?filter][?extensions]]
khi đó entry mới của people ou như sau :
# LDIF listing for the entry ou=people,dc=plainjoe,dc=org
dn: ou=people,dc=plainjoe,dc=org
objectClass: referral
ref: ldap://server2.plainjoe.org/ou=people,dc=plainjoe,dc=org
cấu hình superior knowledge reference :từ server 2 trở về thư mục chính ,hoạt động này phụ
thuộc vào vendor
Chương 2
10
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
CHƯƠNG 3. OPENLDAP
Chương này giới thiệu về OpenLDAP, một server phổ biến, mã nguồn mở theo tiêu chuẩn LDAPv3. Có
một số những sản phẩm thương mại khác tương tự, bao gồm Sun Microsystem's SunOne directory server,
Novell's eDirectory và Microsoft's Active Directory, mặc dù những Directory này không đơn thuần chỉ là
LDAP.
Vậy, tại sao chúng ta sử dụng OpenLDAP server thay vì một trong những sản phẩm khác ? Có khá nhiều
lí do khiến OpenLDAP trở nên thu hút:
•
OpenLDAP là sản phẩm mã nguồn mở, mã nguồn của nó có thể được tải về từ
http://www.openldap.org. Mã nguồn giúp cung cấp khá nhiều sự trợ giúp cho người sử dụng.
• OpenLDAP 2 được làm theo chuẩn LDAPv3.
• OpenLDAP có trên nhiều nền khác nhau, bao gồm Linux, Solaris, Mac OS 10.2, và Windows
(hầu hết các phiên bản).
• Dự án OpenLDAP là sự tiếp nối từ LDAP server của Đại học Michigan. Quan hệ giữa LDAP
server của Michi gan và các sản phẩm LDAP server hiện đại khác có thể được so sánh như là mối
quan hệ của trình duyệt Web hiện đại và NCSA code base.
Những ví dụ trong chương này giới thiệu OpenLDAP trên nền 1 Unix server, vì vậy, họ sử dụng những
dòng lênh chuẩn của Unix chẳng hạn như tar, gzip và make.
1. Openldap distribution :
Phiên bản mới nhất của OpenLDAP có thể tải về từ http://www.OpenLDAP.org/software/download/.
OpenLDAP có hai phiên bản chính, bản 1.2 chỉ nâng cao và sửa một số bug nhỏ từ bản gốc LDAP server
của Đại học Michigan và chỉ hỗ trợ LDAPv2, còn bản OpenLDAP 2 là một sản phẩm hoàn thiện theo
chuẩn LDAPv3.
Có khá nhiều ưu điểm của LDAPv3 so với các phiên bản trước, chẳng hạn :
•
•
•
•
•
Khả năng hỗ trợ refferal: LDAPv2 không có sự chuẩn bị về việc trả lại một refferal cho client.
Trong khi LDAP server của Đại học Michigan có thí nghiệm hỗ trợ cho việc thực thi referral,
khái niệm này vẫn chưa được chuẩn hóa cho khi LDAPv3 xuất hiện. Việc chuẩn hóa này tạo nên
khả năng tương tác giữa server và clients từ các sản phẩm LDAP server khác nhau, điều mà
LDAPv2 chưa làm được.
Khả năng cung cấp server’s schema qua các hoạt động của LDAP, làm cho việc client học schema
của server trước khi thực hiện các tìm kiếm trở nên dễ dàng hơn. Các duy nhất để xác định
schema trong LDAPv2 là kiểm tra các file configuration của server. Cung cấp server’s schema
như là các mục trong directory cho phép những dịch vụ real-time cập nhật qua các hoạt động của
LDAP. (lưu rằng LDAPv3 không yêu cầu cập nhật động).
Hỗ trợ sử dụng kí tự UTF-8 trong các chuỗi (RFC 2253) và language tags cho việc mô tả các
thuộc tính (RFC 2596).
Cải thiện bảo mật và tính linh hoạt cho authentication credentials và data qua SASL và SSL/TLS,
trong khi LDAPv2 chỉ hỗ trợ simple binds hoặc Kerberos 4 cho authentication
Hỗ trợ protocol extensions như là một cơ chế để tăng cường những hoạt động có sẵn hoặc tạo
những lệnh mới mà không cần phải sửa lại những LDAP protocol đã định nghĩa.
Chương 3
11
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
2. Software requirements
Những ví dụ trong sách này sử dụng phiên bản OpenLDAP version 2.1.8. Giống như các phần mềm khác,
software requirement thay đổi theo từng phiên bản, vì vậy, hãy kiểm tra kĩ thông tin của các bản đó trước
khi sử dụng.
OpenLDAP server sẽ cần một số gói phần mềm mở rộng như sau:
•
•
•
•
Hỗ trợ cho POSIX threads, kể cả hệ điều hành hay thư viện ngoài
Thư viện SSL/TLS (chẳng hạn OpenSSL package có ở http://www.openssl.org )
Một thư viện quản lí dữ liệu có hỗ trợ lữu trữ DBM type một cách dễ dàng. Có thể chọn Berkeley
DB 4.1 package từ Sleepycat Software (http://www.sleepycat.com/).
Thư viện SASL phiên bản 2.1 từ Đại học Carnegie Mellon (http://asg.web.cmu.edu/sasl/sasllibrary.html).
2.1 Threads
Nếu hệ điều hành server của bạn hỗ trợ threads, OpenLDAP 2 hoạt động hiệu quả hơn với thứ này. Sự
hỗ trợ này có ở hầy hết các hệ điều hành Linux, Solaris và nhiều hệ khác.
Nếu bạn gặp vấn đề với hỗ trợ POSIX thread, lựa chọn đầu tiên là kiểm tra lại các ghi chú về cài đặt
ứng với hệ điều hành của bạn trên web site OpenLDAP.org, hoặc bạn có thể vào
http://www.gnu.ai.mit.edu/software/pth/related.html, nơi có một danh sách những thư viện POSIX
thread cho hệ điều hành Unix. Có thể tắt hỗ trợ thread bằng lệnh –disble-threads trong configuration
script để compile. Tuy nhiên, replcation helper daemon (sẽ được nhắc đến trong chương 5) cần đến
thread support này.
2.2 Thư viện SSL/TLS
RFC 2246 mô tả TLS 1.0, tương ứng với SSL 3.0. Những họat động mở rộng của StartTLS định
nghĩa trong RFC 2830 cho phép LDAP clients và servers negotiate một TLS sesion tại bất kỳ điểm
nào trong một conversation (ngay cả khi đang authenticate client). Để bật việc hỗ trợ này, bạn cần
phải cài đặt phiên bản mới nhất của thư viện OpenSSL tại http://www.openssl.org/.
Xây dựng và cài đặc OpenSSL khá đơn giản. Chỉ cần nhớ rằng, với bản 0.9.6, thư viện chia sẻ không
được xây dựng một cách mặc định. Để tạo các thư viện chia sẻ, trong build script của OpenSSL, mở
tùy chọn shared lên.
Tùy chọn –opensldir để định nghĩa thư mục cài đặt
$ ./configuration shared --openssldir=/usr/local
Theo sau đó là phần bắt buộc để cài đặt thư viện phát triển và các công cụ ở /usr/local :
$ make
$ /bin/su -c "make install"
Chương 3
12
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
2.3 Database Backend Modules
Để xây dựng một OpenLDAP server độc lập, cần phải cung cấp một thư viện cho một vài loại
database manager (DBM). OpenLDAP hỗ trợ hai loại lưu trữ local DB. Loại thứ nhất là ldbm, có thể
sử dụng GNU Database manâger từ Free Software Foundation (http://www.fsf.org) hoặc BerkeleyDB
package từ Sleepyal Software(http://www.sleepycat.com). Loại thứ 2 được giới thiệu ở OpenLDAP
2.1 gọi là bdb, được chỉnh sửa để sử dụng mỗi thư viện Berkeley DB 4 .
Tải thư viện Berkeley DB 4.1 từ http://www.sleepycat.com/download/index.shtml. Sau đó extract ra
một thư mục nào đó, ví dụ :
$ cd /usr/local/src/
$ gzip -dc {path-to-download-directory}/db-4.1.24.tar.gz | tar xvf –
Rồi cài đặt :
$ cd db-version/build_unix
$ ../dist/configure --prefix=/usr/local/
$ make
$ /bin/su -c "make install"
2.4 SASL Libraries
Cài đặt SASL chỉ cần một số bước quen thuộc :
$ gzip -dc cyrus-sasl-2.1.9.tar.gz | tar xf $ cd cyrus-sasl-2.1.9
$ ./configure
$ make
$ /bin/su -c "make install && \
ln -s /usr/local/lib/sasl2 /usr/lib/sasl2"
3. Compiling OpenLDAP 2:
Giải nén source file :
$ gzip -dc openldap-2.1.8.tar.gz | tar xvf –
Đến thư mục mới tạo ra, chạy ./configure script, chỉnh lại các tùy chọn mà bạn muốn mở hoặc tắt, ví dụ :
$ cd openldap-2.1.8/
$ ./configure --enable-wrappers
Kiểm tra đầu ra của các lệnh này xem có đúng với các vị trí các DBM và các tùy chọn của bạn. Cài đặt
với các lệnh :
$ make depend
$ make
$ make test
$ /bin/su -c "make install"
Chương 3
13
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
4. OpenLDAP Clients and Servers :
OpenLDAP package chứa những thư viện client, server và development. Bảng 3.1 cho ta một cái nhìn
tổng quan về các tiện ích đi kèm với package.
Table 3-1. Installed components included with OpenLDAP
Name
Description
libexec/slapd
The LDAP server.
libexec/slurpd
The LDAP replication helper.
bin/ldapadd
bin/ldapmodify Command-line tools for adding, modifying, and deleting entries on an LDAP server.
bin/ldapdelete These commands support both LDAPv2 and LDAPv3.
bin/ldapmodrdn
bin/ldapsearch Command-line utilities for searching for an LDAP directory or testing a compare
bin/ldapcompare operation on a specific attribute held by an entry.
bin/ldappasswd
A tool for changing the password attribute in LDAP entries. This tool is the LDAP
equivalent of / bin/passwd.
sbin/slapadd
sbin/slapcat
sbin/slapindex
Tools for manipulating the local backend data store used by the slapd daemon.
sbin/slappasswd A simple utility to generate password hashes suitable for use in slapd.conf.
lib/libldap*
lib/liblber*
The OpenLDAP client SDK.
include/ldap*.h
include/lber*.h
5. Slapd.conf Configuration file
File slapd.conf là nơi chứa các thông tin cấu hình chính cho một OpenLDAP server độc lập, replication
helper daemon slurpd, và các công cụ liên quan như slapcat và slapadd. Tương tự, OpenLDAP client tool
sửa dụng ldap.conf cho các tùy chỉnh mặc định.
File slapd.conf chia làm 2 phần chính. Phần đầu chứa các thông số ảnh hưởng tới hoạt động tổng thể cho
OpenLDAP server (ví dụ như : lượng thông tin gửi đến log file). Phần thứ hai là những thông số liên quan
tới các database backend sử dụng bởi slapd daemon. Chúng ta có thể định nghĩa những cài đặt mặc định
cho phần đầu trong slapd.conf. Tuy nhiên, trong phần thứ hai, các giá trị được chỉnh sẽ đè lên giá trị mặc
định.
Hai phần trong spld.conf :
# /usr/local/etc/openldap/slapd.conf
# Global section
Chương 3
14
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
## Global parameters removed for brevity's sake, for now . . .
#######################################################
# Database #1 - Berkeley DB
database bdb
## Database parameters and directives would go here.
#######################################################
# Database #2 - Berkeley DB
database bdb
## Database parameters and directives would go here.
## And so on . . .
5.1 Schema files
Bước đầu tiên để configure LDAP server của bạn là quyết định xem nên chọn schema nào để
directory hỗ trợ.
OpenLDAP 2 chứa khá nhiều schema thông dụng, các định nghĩa attributeType và objectClass cần
thiết trong core.schema.
Mặc định, tập tin trên ở /usr/local/etc/openldap/schema/ sau khi cài đặt. Trong file config, thông số
include chỉ ra schema sẽ được sử dụng bởi server :
# /usr/local/etc/openldap/slapd.conf
# Global section
## Include the minimum schema required.
include /usr/local/etc/openldap/schema/core.schema
#######################################################
## Database sections omitted
Có rất nhiều loại schema trong mặc định của OpenLDAP 2.1 :
corba.schema
A schema for storing Corba objects in an LDAP directory, as described in RFC 2714.
core.schema
OpenLDAP's required core schema. This schema defines basic LDAPv3 attributes and objects
described in RFCs 2251-2256.
cosine.schema
A schema for supporting the COSINE and X.500 directory pilots. Based on RFC 1274.
inetorgperson.schema
Chương 3
15
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng
Giao thức LDAP
GVHD: TS. Lưu Thanh Trà
The schema that defines the inetOrgPerson object class and its associated attributes defined in
RFC 2798. This object is frequently used to store contact information for people.
java.schema
A schema defined in RFC 2713 for storing a Java serialized object, a Java marshalled object, a
remote Java object, or a JDNI reference in an LDAP directory.
misc.schema
A schema that defines a small group of miscellaneous objects and attributes. Currently, this file
contains the schema necessary to implement LDAP-based mail routing in Sendmail 8.10+.
nis.schema
A schema that defines attributes and objects necessary for using LDAP with the Network
Information Service (NIS) as described in RFC 2307.
openldap.schema
Miscellaneous objects used by the OpenLDAP project. Provided for information purposes only.
5.2 Logging
Thông tin kế tiếp trong slapd.conf là slapd logs :
# /usr/local/etc/openldap/slapd.conf
# Global section
## Include the minimum schema required.
include /usr/local/etc/openldap/schema/core.schema
## Added logging parameters
loglevel 296
pidfile /usr/local/var/slapd.pid
argsfile /usr/local/var/slapd.args
#######################################################
## Database sections omitted
Thông số đầu tiên cần chú ý là loglevel, dùng để chỉ loại thông tin cần được ghi lại trong system
logs. Có thể coi loglevel như một chuỗi các bit flag có thể cộng với nhau.
Bảng dưới đây cho biết 1 số giá trị của loglevel và ý nghĩa của chúng :
Table 3-2. OpenLDAP logging levels
Level
-1
Chương 3
Information recorded
All logging information
16
Lê Tiến Cường – Nguyễn Minh Đức
Lê Thạch Giang- Hoàng Ngọc Hưng