LDAP (นิยมอ่านว่า "แอล-แด็บ") เป็น Protocol ที่พัฒนามาจาก Protocol X.500 ซึ่งใช้ในการเข้าถึงและ Update ข้อมูลของ Directory ซึ่งDirectory ในทาง Computer ที่จริงก็อาจเรียกได้ว่าเป็น Database แบบพิเศษหรือ Data repository ที่บรรจุรายละเอียดของ Object ต่างๆ เช่น Users, Application, Files, Printer และอื่นๆ รวมทั้ง Security information ของ Object เหล่านี้ด้วย โดยข้อแตกต่างของ Directory กับ Database ปกติ ได้แก่
1. Operation: ใน Directory จะเน้นที่การ Access ข้อมูลหรือ อ่านข้อมูล มากกว่า Update หรือ เขียนข้อมูล ในขณะที่ Database ทั่วไปจะเน้นการ Update มากกว่า
2. Transaction: ใน Database จะรองรับการทำ Transaction หรือการ Update ข้อมูลสองจุดที่ต้องสอดคล้องกัน แบบ All-or-nothing เช่นการโอนเงินจากบัญชีหนึ่ง ไปอีกบัญชีหนึ่ง ที่ต้องการความสมบูรณ์ทั้ง 2 ฝั่ง หรือไม่ก็ไม่ต้องทำเลย ในขณะที่ Directory ที่เน้นการอ่านอย่างเดียว อาจจะไม่ต้องการความสอดคล้องกันของข้อมูลบ้างนัก เช่นเมื่อมีการย้ายที่อยู่ระหว่างคน 2 คน ก็ต้องมีการปรับเปลี่ยนเบอร์ติดต่อของ 2 คนนั้น ซึ่งตรงนี้อาจจะไม่จำเป็นต้องทำทันที อย่างไรก็ตาม Feature นี้อาจจะมีการผนวกเข้ากับ LDAP Product ใหม่ๆ ในอนาคตก็ได้
3. Data Accuracy: Directory อาจจะมีข้อจำกัดในการจัดเก็บข้อมูลที่ไม่สมบูรณ์ เช่นมีแต่ชื่อ ไม่มีที่อยู่ แต่อย่างไรก็ตาม เราสามารถ Configure คุณสมบัติเหล่านี้ได้ในบาง Directory Service
4. Query: Directory ไม่ Support Query String (SQL, Structured Query Language)
อย่างไรก็ตามถึงแม้ Directory จะมีคุณสมบัติด้อยกว่า Database หลายประการ แต่เนื่องจาก Protocol ที่ใช้ในการเข้าถึง Directory เช่น LDAP มีความเร็วในการเข้าถึงข้อมูลสูง และก็ทำให้ Application ที่ทำงานบน Protocol เหล่านี้สามารถเข้าถึงข้อมูลอย่างรวดเร็ว ทำให้ระบบ Directory เป็นที่ยอมรับ และนำมาใช้งานทั่วไป
นอกจากประโยชน์ในการค้นหาข้อมูลได้อย่างรวดเร็วแล้ว Directory ยังเป็นโครงสร้างข้อมูลที่แสดงให้ User เห็นข้อมูลทั้งหมดได้จากมุมมองเดียว (Single Logical View) แม้ว่าแท้จริงแล้ว ข้อมูลเหล่านั้นอาจถูกเก็บแยกกันอยู่อย่างกระจัดกระจายตาม Host ต่างๆ บน Distributed System ซึ่งข้อดีต่างๆ เหล่านี้ ทำให้มีการพัฒนา Application ที่ใช้ Directory Service ออกมามากมาย และ LDAP ก็คือหนึ่งในมาตรฐานที่ใช้จัดการ การรับส่งข้อมูลระหว่าง Application Server ที่เก็บ Directory เหล่านี้ กับ Client Application ที่เป็นฝ่ายเรียกดูข้อมูลจาก Directory
อีกหนึ่งสาเหตุที่จำเป็นต้องมีมาตรฐานในการเข้าถึงข้อมูลใน Directory นั้นก็เพื่อให้การพัฒนา Application ที่ใช้ติดต่อกับ Directory Server นั้นมีความยืดหยุ่นขึ้น โดย Developer สามารถเรียกใช้ API (Application Programming Interface) เพื่อติดต่อกับ Directory Service ได้ โดยไม่ต้องทราบวิธีการเข้าถึงโดยละเอียด เช่นโครงสร้างของ Directory หรือ ชนิดของข้อมูล (Data Type) ภายใน หรือไม่จำเป็นต้องปรับแก้ Application ใหม่หากมีความต้องการ Data Type ใหม่ๆ เป็นต้น
นอกเหนือจากที่กล่าวมาข้างต้นแล้ว การมีมาตรฐานเดียวกัน ทำให้ผู้ผลิต Application และ Network device ที่รองรับการใช้งาน Directory Service มีระเบียบวิธีที่ชัดเจนเป็นกลาง ทำให้การติดต่อระหว่าง Application จากต่างผู้ผลิต หรือ ต่าง Platform นั้นเป็นไปได้อย่างรวดเร็ว ถูกต้อง และปลอดภัย โดยไม่ต้องทราบข้อมูลที่ใช้ในการติดต่อ เช่น Platform ที่ใช้, Host Name หรือ IP address เช่นเดียวกับการที่เราต้องมี TCI/IP, HTTP, FTP, RPC หรือ ORB เป็นมาตรฐานที่ใช้อยู่ทั่วโลก
LDAP เป็นมาตรฐานที่ได้รับการยอมรับอย่างกว้างขวาง และมี Application Vendor อยู่หลายราย อาทิ OpenLDAP, IBM, Oracle, Microsoft ซึ่ง Product ที่ได้รับความนิยมก็ได้แก่ Slapd ของ University of Michigan และ Openldap, Directory Server ของ Netscape, Active Directory (AD) ของ Microsoft, Novell Directory Services (NDS) ของ Novell, Sun Directory Services (SDS) ของ Sun และ Internet Directory Server (IDS) ของ Lucent
LDAP ได้รับการออกแบบมาให้อยู่บน TCP/IP Layer ที่มีเพียง 4 Layer ทำให้มีความต้องการ Resource น้อยกว่า DAP ของมาตรฐาน X.500 อย่างไรก็ตาม หากมีความต้องการติดต่อกันระหว่าง LDAP Client กับ X.500 Server จำเป็นจะต้องมีการติดต่อผ่าน Gateway ที่เรียกว่า LDAP Server ตามภาพ
จากภาพจะเห็นได้ว่า LDAP Server จะต้องมีความเข้าใจทั้ง TCP/IP และ OSI Model ในขณะที่ตัว LDAP Client ไม่จำเป็นต้องทำความเข้าใจกับ OSI Layer และไม่ต้องประมวลผลตาม DAP ที่มีความซับซ้อน และ Overhead สูง
สำหรับระบบที่ไม่มีการใช้ X.500 ก็สามารถมีเพียง LDAP Client กับ LDAP Server ซึ่งเรียกว่า LDAP stand-alone server ตามภาพด้านล่าง
จากตัวอย่างที่ 2 ตัวอย่างข้างต้น ทำให้เราเห็นว่า จากมุมมองของ Client แล้ว ไม่ว่า Directory ที่ access เข้าไปจะอยู่บน LDAP Server หรือ X.500 Server Client จะเรียก Directory เหล่านั้นว่า LDAP Directory และ เรียก Server นั้นว่า LDAP Server
LDAP Directory มีการจัดโครงสร้างแบบลำดับชั้น (Hierarchical) โดยข้อมูลจะถูกบรรจุอยู่ใน Entries ซึ่งแต่ละ Entry จะประกอบด้วย Attribute ในรูปของ
Entry จะถูกจัดไว้เป็นลำดับชั้นด้วย Distinguished name (DN) โดย Entry ใดๆที่อยู่ใต้ Entry อื่น จะมี DN ของ Entry อื่นเป็น Suffix (ข้อความที่ตามหลัง) Entry นั้น
Schema ของ Directory จะระบุ DN และระบุว่า แต่ละ Entry จะประกอบไปด้วย Attribute ใดบ้าง โดยกำหนด Schema จะกำหนดข้อมูลเหล่านี้ไว้ใน Object class ซึ่งได้แก่ List ของ Mandatory กับ Optional Attribute, วิธีการเปรียบเทียบ Attribute, ชนิดและขนาดของข้อมูลที่อนุญาต ซึ่งทุกๆ Entry จะต้องเชื่อโยงไว้กับ Object Class หนึ่ง Class รายละเอียดเพิ่มเติมของ Schema File มีอยู่ในหัวข้อ LDAP Schema
จาก Hierarchy ของ Directory ด้านบน Entry ที่มีสีแดงจะถูกระบุด้วย DN ดังนี้
dn: uid=bmarshal,ou=People,dc=pisoftware,dc=com
Attribute ส่วนใหญ่จะมีการใช้ตัวอักษรย่อระบุ type ซึ่งได้แก่ uid = User id, cn = Common Name, sn = Surname, l = Location, ou = Organizational Unit, o = Organization, dc = Domain Component, st = State, c = Country, etc. โดยข้อมูลเพิ่มเติมในส่วนนี้สามารถหาได้จาก RFC2256
เริ่มใช้งาน LDAP
โครงสร้างของ LDAP ประกอบด้วย Server และ Client ซึ่งในที่นี้เราเลือกใช้ Product ของ OpenLDAP ซึ่งเป็น LDAP Implementation แบบ Open Source ที่ได้รับความนิยมสูง โดยในชุดที่แจกจ่ายให้ Download นั้นจะประกอบด้วย Stand-alone server daemon, Stand-alone update replication daemon, Library และ ตัวอย่างของ Client รวมทั้ง Tools และ Utilities ต่างๆ ในส่วนของวิธีการติดตั้ง OpenLDAP ผู้ที่สนใจสามารถหาข้อมูลได้จาก Document ของ OpenLDAP ซึ่งมีพร้อมอยู่ใน Download package แล้ว
ในตัวอย่างนี้เราจะใช้ ระบบปฏิบัติการ Redhat Linux 9.0 ซึ่งเมื่อได้ทำการติดตั้งเรียบร้อยแล้ว จะมี OpenLDAP version 2.0.27 มาให้ด้วย โดยในส่วนของ LDAP Server จะเป็น Daemon process ที่ชื่อว่า slapd
1. วิธีการ Start/Stop slapd
slapd เป็น LDAP Server daemon ซึ่งทำหน้าที่รับ Object Query จาก Client และส่งข้อมูลของ Object ที่ Client นั้นต้องการ
1.1 วิธีการ Star slapd
1.1.1 Command line:
/usr/sbin/slapd
เช่น
/usr/sbin/slapd -f /etc/openldap/slapd.conf -d 255
หมายถึงให้ slapd ใช้ Configuration file ที่ Path /etc/openldap/slapd.conf โดยมี Debug level = 255 โดยข้อมูลเพิ่มเติมของการ execute slapd มีเพิ่มเติมที่ man page โดยใช้คำสั่ง 'man slapd'
1.1.2 Server Service:
ที่ Desktop ของ Linux ให้ไปที่ปุ่ม Main menu > System Settings > Server Settings > Services ที่เมนูด้านซ้ายจะมีรายชื่อของ Services ถ้าต้องการให้ Linux เรียก Service ใดในตอนเริ่ม boot เครื่องก็ให้ Check ถูกหน้าชื่อ Service นั้น หรือจะ Stop และ Restart โดยใช้ปุ่มบน Toolbar ด้านบนก็ได้ โดย slapd จะเป็น Service ที่ชื่อ ldap
1.2 วิธีการ Stop slapd
1.2.1 Command line:
kill -INT
เช่น kill -INT 5154
หรือ
kill -INT `cat /var/run/slapd.pid`
หากมีการเก็บค่า Process ID ไว้ที่ Path /var/run/slapd.pid โดยสามารถแก้ไขเป็น Path อื่นก็ได้โดยแก้ไขที่ File slapd.conf ที่ Path /etc/openldap
1.2.2 Server Service:
ใช้วิธีการเช่นเดียวกับการ Start Service
2. Configuration Files ที่จำเป็นในการ Run slapd
ในคำสั่งสำหรับ Start slapd นั้น เราจำเป็นต้องมีการระบุ Path ของ Configuration file ที่โดยทั่วไปจะตั้งชื่อว่า slapd.conf และสำหรับ Redhat 9.0 จะมี Default path อยู่ที่ /etc/openldap
ด้านล่างเป็นตัวอย่างของ Configuration file
01: include /etc/openldap/schema/core.schema
02: include /etc/openldap/schema/cosine.schema
03: include /etc/openldap/schema/inetorgperson.schema
04: include /etc/openldap/schema/nis.schema
05: include /etc/openldap/schema/redhat/rfc822-MailMember.schema
06: include /etc/openldap/schema/redhat/autofs.schema
07: include /etc/openldap/schema/redhat/kerberosobject.schema
08:
09: access to * by * write
10:
11: database ldbm
12: suffix "dc=cp25,dc=com"
13: rootdn "cn=ldapadm,dc=cp25,dc=com"
14: rootpw cp25
15: readonly off
16: access to * by * write
17: directory /var/lib/ldap
18: index objectClass,uid,uidNumber,gidNumber,memberUid eq
19: index cn,mail,surname,givenname eq,subinitial
Configuration File นี้มีตัวอย่างมาให้แล้วใน Path /etc/openldap/slapd.conf ซึ่งตัวอย่างด้านบนยกมาเฉพาะมีบรรทัดที่ไม่ถูก Comment ด้วย '#'
รายละเอียดของ การแก้ไข Configuration file สามารถอ่านเพิ่มเติมได้จาก OpenLDAP Administrator's Guide (ปัจจุบัน Version 2.2)
ใน Configuration file จะประกอบด้วย Directive ซึ่งหมายถึง Parameter ของ LDAP Server และค่าของ Directive หรือ Parameter เหล่านั้น ซึ่ง Directive มีทั้งหมด 2 ชนิด คือ
1. Global configuration directive : Directive กลางของ Directory ซึ่งจะถูก Apply ไปยังทุก Database (ในที่นี้หมายถึง Directory) แต่ถ้า Database มี Directive นี้อยู่แล้ว ก็จะ Over write Directive กลางนี้
2. Database directive : Directive ที่ Apply เฉพาะ Database นั้นๆ
Database directive สามารถมีได้หลายชุด โดยจะแยกออกจากกันด้วย Directive ชื่อ 'database' ซึ่งมี Database บางชนิดที่มี Directive เฉพาะ เช่น LDBM, Shell หรือ Password
สำหรับรายละเอียดของ Directive ที่ปรากฏในตัวอย่างมีดังนี้
1. Include (01-07) : Configuration file ของ LDAP นั้นสามารถ include file อื่นเข้ามาได้ ซึ่งในที่นี้เป็นการ Include Schema File ที่มีให้อยู่แล้ว โดย Schema File นั้นเป็น File ที่ระบุโครงสร้างของ Directory ว่าจะมี Object ใดบ้าง มี Attribute ใดบ้าง และมี Attribute Type เป็นอย่างไร เช่นเดียวกันกับ Schema ของ Database ที่จะระบุว่ามี Table ใดบ้าง มี Field ใดบ้างและมี Field Type เป็นอย่างไร รายละเอียดของ Schema File มีเพิ่มเติมที่ OpenLDAP Administrator's Guide (ปัจจุบัน Version 2.2) ที่หัวข้อ Schema Specification
2. Access level (09) : ระบุสิทธิ์ในการเข้าถึง Directory ของแต่ละ User ในที่นี้ระบุให้ทุก Directory (*) สามารถถูกแก้ไข (write) ได้โดยทุก User (*)
3. Database type (11) : ระบุชนิดของ Database ซึ่ง Openldap สามารถรองรับ Database ได้หลายชนิด อาทิ bdb, dnssrv, ldap, ldbm, meta, monitor, null, passwd, perl, shell, sql, และ tcl แต่สำหรับใน Linux นั้นเข้าใจว่ารองรับเฉพาะ ldbm, shell, และ passwd โดยในที่นี่ใช้ ชนิด ldbm
4. Suffix (12) : ระบุ Suffix ของ Query string "dc=cp25,dc=com" ว่าถ้ามี Query string ที่มี Suffix เป็นค่าดังกล่าว ก็จะมาใช้ Database ตัวนี้
5. Rootdn (13) : ระบุ User name ที่จะใช้ในการ Access เป็น Root ของ database นี้ โดยการระบุก็จะต้องเป็นไปตามการกำหนด Object ของ LDAP คือใช้ Distinguish name หรือ dn ในการระบุชื่อ Object เช่น "cn=ldapadm,dc=cp25,dc=com" หมายถึง Root มี common name (cn) เป็น ldapadm
6. Rootpw (14) : ระบุ Password ของ Root dn
7. Readonly (15) : ระบุสิทธิ์ Default ในการแก้ไขข้อมูล ซึ่งสิทธิ์ของ root โดย Default แล้วคือ Readonly = off
8. Access right (16) : สิทธิ์ในการเข้าถึงข้อมูล ซึ่งจะเห็นว่า Directive นี้ซ้ำกับ Global directive ซึ่งหาก Directive ของ Database มีค่าไม่เหมือนกันกับ Global directive ก็จะยึด Directive ของ Database เป็นหลัง
9. Directory (17) : Path ที่ใช้เก็บ Database file
หากมี Database อื่นอีกก็สามารถกำหนดเพิ่มได้ โดยเริ่มต้นจาก Directive 'database' นั่นเอง
เราสามารถทดสอบการ LDAP Service ว่า Start ได้สำเร็จหรือไม่โดยใช้ LDAP Browser โดยหาก Connect สำเร็จก็จะมีชื่อ Suffix ปรากฏให้เห็น แต่จะยังไม่สามารถ Browse ดูได้เนื่องจากเรายังไม่ได้สร้าง Directory โดยการ Add Object และ Attribute
LDAP Directory
หลังจากเราสามารถ Run LDAP Service ได้สำเร็จแล้ว ขั้นตอนต่อไปคือการสร้าง Database หรือ Directory ด้วยการ Add Object หรือ Entry และ Attribute ลงไปใน LDAP Database ซึ่งวิธีการสร้าง Database นี้มีอยู่ 2 ประเภทคือแบบ Online กับแบบ Offline
1. การสร้าง Directory แบบ Online
ในขณะที่ LDAP Service กำลังทำงานอยู่นั้น เราสามารถใช้ Command line ในการเพิ่มหรือลบ Object หรือ Entry ที่มีอยู่ได้ รวมไปถึงการเพิ่ม Attribute ใหม่ๆ หรือแก้ไข Attribute เดิม คำสั่งในการเพิ่ม Object หรือ Entry ใหม่รวมทั้ง Attribute ของ Object หรือ Entry นั้น คือ 'ldapadd' ส่วนคำสั่งในการแก้ไข Object และ Attribute ที่มีมาให้กับ OpenLDAP คือ 'ldapmodify'
1.1 ldapadd
1.1.1 Syntax
คำสั่ง ldapadd มี Option จำนวนมาก ข้อมูลเพิ่มเติมสามารถหาได้จาก man page ด้วยคำสั่ง 'man ldapadd' โดยในตัวอย่างนี้จะขอเลือกใช้เฉพาะ Option พื้นฐานที่จำเป็นก่อนดังนี้
ldapadd [-h host] [-p port] [-P version] [-F] [-x] [-D binddn] [-w password] [-f file]
ความหมายของ Option ด้านบนเป็นดังนี้
-h ldap : ระบุ IP ของ LDAP Server
-p port : ระบุ Port ของ LDAP Server (Default คือ 389)
-P version : ระบุ Version ของ Protocol (ปัจจุบัน 3 หรืออาจจะใช้ 2 ก็ได้)
-F : ระบุว่าทุก Command ที่สั่งให้ทำบน Directory จะถูกกระทำทั้งหมดโดยไม่สนใจลักษณะข้อมูลเดิมที่มีอยู่ (Force application)
-x : ระบุว่าใช้วิธีการ Authenticate User แบบปกติ
-D : ระบุ DN ที่ใช้ในการ Login เข้า Directory โดยแนะนำให้ใช้ของ Root ที่กำหนดไว้ใน slapd.conf
-w : ระบุ Password ของ DN ซึ่งหากใช้ rootdn ก็จะเป็น root password ตามที่กำหนดไว้ใน slapd.conf
-f file: ระบุ Path ของ LDIF File ซึ่งเป็น Fie ระบุรายละเอียดของ Object หรือ Entry และ Attribute ที่ต้องการเพิ่มเข้าไปใน Directory
*สำหรับ Option [-h host] [-p port] และ [-P version] นั้นอาจจะไม่จำเป็นต้องระบุก็ได้ ถ้าเราสั่ง ldapadd บน Local Host ที่ไม่มีการแก้ไข LDAP Port และทำ Operation ที่มีอยู่ร่วมกันทั้ง บน Protocol ทั้ง 2 version
1.1.2 LDIF File
LDIF File เป็น File ระบุข้อมูลที่ต้องการเพิ่มลงไปใน Directory โดยข้อมูลดังกล่าวจะต้องสอดคล้องกันกับ Schema ที่กำหนด ตัวอย่างของ LDIF File มีดังนี้
test.ldif
# cp25, com
dn: dc=cp25,dc=com
objectClass: domain
dc: cp25
# Somchai's Entry
dn: cn=Somchai Kamdee,dc=cp25,dc=com
cn: Somchai Kamdee
cn: Chai
objectClass: person
sn: Kamdee
# Somsri's Entry
dn: cn=Somsri Kamdee,dc=cp25,dc=com
cn: Sri Kamdee
cn: Somsri Kamdee
objectClass: person
sn: Kamdee
# Somjit's Entry
dn: cn=Somjit J Kamdee,dc=cp25,dc=com
cn: Jit Kamdee
cn: Jit
objectClass: person
sn: Kamdee
Format ของ LDIF File สามารถหาได้เพิ่มเติมจาก The LDIF text entry format โดยหลังจากเรามี LDIF File แล้วก็สามารถเรียกให้ ldapadd ทำงานได้ดังนี้
ldapadd -F -x -D "cn=ldapadm,dc=cp25,dc=com" -w cp25 -f test.ldif
ซึ่งหากการสร้าง Database ประสบความสำเร็จ เราก็จะสามารถใช้ LDAP Browser เปิดดูข้อมูลได้