Ldap 服務應用指南 兼容(5.X&6.X)php
1.1 Ldap 目錄服務介紹html
1.1.1 什麼是目錄服務(active directory)??linux
目錄是一類爲了瀏覽和搜索數據爲設計的特殊的數據庫,目錄服務是按照樹狀存儲信息的nginx
目錄進行更新的操做,能夠說是要麼所有,要麼都不得原子性操做web
目錄不支持大多數事物型數據庫所支持的高吞吐量和複雜的更新操做,適應於大量的查詢和搜索操做,爲了保證數據的可靠性和可用性,他也有主從服務器同步數據信息能力。sql
ldap 也能夠一主多從.數據庫
ldap 能夠說是活動目錄在linux上的一個開源實現.apache
1.1.2 什麼是Ldap??vim
LDAP是輕量級目錄訪問協議(lightweight directory access protocol),LDAP運行在TCP/IP或者其餘的面向鏈接傳輸之上。後端
LDAP是在X.500標準上產生的一個簡化版本
1.1.3 LDAP基本概念中的經常使用名詞縮寫及含義
dc domain component 域名部分 example.com dc=example,dc=com uid user id 用戶id 如wyb ou organization unit 組織單位 如tech cn common name 公共名稱 thomas johansson sn surname 姓 dn distinguished 惟一辨別名 uid=wyb,ou=market,dc=example,dc=com rdn relative dn 相對辨別名 c country o organization
1.1.4 LDAP(openldap) 目錄服務的特色
ldap 是一個跨平臺的,標準的協議。
ldap 的結構用樹型結構來表示,而不是表格,所以不須要用SQL語句維護
ldap 提供了靜態數據的快速查詢方式
ldap 是一個安全的協議
ldap 支持異類數據存儲
ldap 是C/S架構,server端用於存儲樹,client端提供操做目錄信息樹的工具
ldap 是一種目錄服務,保存在特殊的數據庫中,數據的讀取速度遠高於寫入速度。
ldap 對查詢作了優化,讀取速度優於普通關係數據庫。
ldap 不支持事務、不能進行回滾,須要進行這些操做的應用只有選擇關係數據庫。
ldap 採用服務器/客戶端模式,支持分佈式結構。
ldap 中的條目以樹形結構組織和存儲。
ldap 基於Internet協議,直接運行在簡單和通用的TCP/IP或其餘可靠的傳輸協議層上,使鏈接的創建和包的處理簡單、快捷,對於互聯網和企業網應用都很方便。
ldap 協議簡單,經過使用查找操做實現列表操做和讀操做。
ldap 經過引用機制實現分佈式訪問,經過客戶端API實現分佈式操做(對於應用透明),平衡了負載。
ldap 實現具備低費用、易配置和易管理的特色,並提供了知足應用程序對目錄服務所需求的特性。
1.1.5 ldap的目錄結構
ldap 目錄服務是經過目錄數據庫存儲網絡信息提供目錄服務的,目錄數據庫是以目錄信息樹DIT爲存儲 方式存儲結構,目錄是按照樹型結構組織--目錄信息書(DIT)DIT是一個主要
進行讀寫操做的數據庫
DIT是由條目(entry)組成,條目至關於關係型數據庫中的表的記錄
ldap目錄用OU 從邏輯上把數據分開
ou 是一種條目--容器條目 OU下面纔是真正的用戶條目
1.1.6 什麼是dn?
(1) 在ldap 中,一個條目的分辨名叫作DN,DN是該目錄在整個樹種的一名名稱識,DN至關於關係型數據庫中的關鍵字,它是一個識別屬性,一般用於檢索
(2) DN的兩張設置
基於 cn(公共名稱) cn=test,ou=tech,dc=example,dc=org 最多見的cn是從、etc/group轉了的條目
基於 uid(user id) uid=test,ou=tech,dc=example,dc=org 最多見的uid是etc/passwd轉來的條目
(3) ldap 目錄樹的最頂部就是根,也就是Base DN
(4) LDIF格式是LDAP數據,導入,處處的格式。LDIF是LDAP數據信息的一種文本格式
1.1.7 什麼樣的信息能夠存在目錄當中???
LDAP的信息模型是基於條目的(entry),一個條目就是一些具備全局惟一的標識名的屬性的集合
下面是ldap中條目信息的例子:至關於數據表中的兩行記錄
條目一:
dn: uid=user01,ou=people,dc=wyb,dc=com objectClass: posixAccount . . . uid: cn: uidnumber: gidnumber: userpassword: sn: givenname:
LDAP容許你經過使用一種叫作objectclass 的特殊屬性來控制那些屬性是條目必須的,那些條目屬性是可選的
1.1.8 信息在目錄中是如何組織的??
在ldap 中,條目是按照層次結構組織的。
目錄樹的結構圖
如圖ldap結構圖
DIT
DC
OU
CN
1.1.9 ldap 目錄數據內容講解
LDIF 是一種ASCii 文件格式,用來交換數據,並使得LDAP服務器之間交換數據成爲可能。
LDIF文件的特色:
(1)經過空行分割一個條目或者定義 ***********
(2)以#開始行爲註釋
(3)全部屬性的賦值方法爲:屬性:屬性值
(4)屬性能夠被從新賦值
(5)每行的結尾不容許有空格 ***********
1.2.0 ldap是怎麼工做的??
ldap 目錄服務是基於客戶端/服務器(c/s)模式的。ldap 客戶端鏈接到服務器而且發出一個請求,而後服務器要麼以一個回答予以迴應,要麼給一個指針,客戶能夠經過指針獲取到所
需數據(一般,該指針指向另外一個ldap服務器),不管客戶端連到那個ldap服務器,它看到的都是同一個目錄視圖。這是ldap這類全局目錄服務的一個重要特徵
1.2.1 ldap的幾個重要模式
ldap服務的幾個重要功能:
(1)基本的目錄查詢服務 **********************
(2)目錄查詢代理服務
(3)異機copy數據(主從同步) ***************
1.2.1.1 本地基本的查詢目錄
request
client---------》 server
<--------
response
1.2.1.2 帶有指針的本地目錄服務,即目錄查詢代理服務
1.2.1.3 同步複製目錄服務 能夠作主從
1.2.1.4 ldap的簡單的同步複製方案
inotify+ldap客戶端命令方案
如圖所示ldap的同步方案
1.2.1.5 分佈式目錄服務
ldap企業架構邏輯案例:ldap+haproxy/nginx/heartbeat集羣高可用,驗證的時候不誇機房
如圖ldap集羣
1.3.0 openldap的環境搭建準備
ldap master服務安裝 1.3.1 安裝前環境準備 Centos 6.5 ,ldap2.4版本爲主 1.3.1.1 查看系統版本信息 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@localhost ~]# uname -r 2.6.32-431.el6.x86_64
1.3.1.2 補全所缺安裝包:
yum groupinstall "Base" -y Base Compatibility libraries Debugging Tools Development Tools Performance Tools Hardware monitoring utilities Dial-up Networking Support
1.3.1.3 更新Centos6.4 yum源配置方法
wget http://mirrors.163.com 1.3.1.4 能夠保留緩存rpm 包 [root@localhost ~]# grep keepcache /etc/yum.conf keepcache=0 [root@localhost ~]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf [root@localhost ~]# grep keepcache /etc/yum.conf keepcache=1
1.3.1.5 關閉selinux ,iptables ,防止影響安裝
1.3.1.6 記得時間同步
/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
1.3.1.7 配置域名
[root@localhost ~]# echo "192.168.2.221 aapingou.com" >> /etc/hosts [root@localhost ~]# ping aapingou.com PING aapingou.com (192.168.2.221) 56(84) bytes of data. 64 bytes from aapingou.com (192.168.2.221): icmp_seq=1 ttl=64 time=0.022 ms 64 bytes from aapingou.com (192.168.2.221): icmp_seq=2 ttl=64 time=0.022 ms ^C
1.3.1.8 開始安裝ldap
yum install openldap openldap-* yum install nscd nss-pam-ldapd nss-* pcre pcre-* -y
1.4.0 開始配置 ldap master
1.4.0.1 對於6.4 來講,openldap的配置和5.8的配置文件有變化,目前6.4的配置文件在/etc/openldap/slapd.d/cn-config/ 下 此時仍是安裝openldap2.3版本安裝 cp /usr/share/openldap-servers/slapd.conf.obsolete slapd.conf [root@localhost openldap]# ls certs check_password.conf ldap.conf schema slapd.conf slapd.d [root@localhost openldap]# [root@localhost openldap]# slappasswd -s 123456 以123456爲管理員密碼 {SSHA}cJOGvZaS/W2Sli6wqtrQCHxk/6BcNE4t [root@localhost openldap]# 也能夠用sed 直接生成密碼,並添加到配置文件中 [root@localhost openldap]# slappasswd -s 123456 |sed -e 's#{SSHA}#rootpw\t{SSHA}#g' rootpw{SSHA}QHJb0AzNWAP5retRMiC2D+qhvpSe8D0C [root@localhost openldap]# slappasswd -s 123456 |sed -e 's#{SSHA}#rootpw\t{SSHA}#g' >> slapd.conf [root@localhost openldap]# tail -2 slapd.conf # authcId=host/ldap-master.example.com@EXAMPLE.COM rootpw{SSHA}fgMtXr09LbqS+Bt2/dKJ+pGKA4zDGJgG
1.4..0.2 openldap2.3 和 openldap2.4 的區別
http://www.openldap.org/doc/admin24/slapdconf2.html 1.4.0.3 備份sladp.conf [root@localhost openldap]# cp slapd.conf slapd.conf.bak vim slapd.conf 註釋一下4行 #database bdb #suffix "dc=my-domain,dc=com" #checkpoint 1024 15 #rootdn "cn=Manager,dc=my-domain,dc=com" 而後增長一下三行 database bdb suffix "dc=aapingou,dc=com" rootdn "cn=admin,dc=aapingou,dc=com" 提示:空行和以#開頭的註釋行能夠忽略 此時LDAP的管理帳號爲 :admin:123456
1.4.0.4 以上修改參數的含義解釋
database bdb #指定使用數據庫BDB,berkeley DB suffix "dc=aapingou,dc=com" #指定要搜索的後綴 rootdn "cn=admin,dc=aapingou,dc=com" #指定管理員dn路徑,使用這個dn能夠登陸ldap server rootpw {SSHA}fgMtXr09LbqS+Bt2/dKJ+pGKA4zDGJgG #指定ldap 管理員密碼,改密碼有值錢slappsswd生產
1.4.0.5 更多ldap參數配置優化
a,日誌以及緩存參數 [root@localhost openldap]# cat >> slapd.conf << EOF > #add new feature 15-10-14 > loglevel 296 > cachesize 1000 > checkpoint 2048 10 > # end > EOF [root@localhost openldap]# tail -6 slapd.conf rootpw{SSHA}fgMtXr09LbqS+Bt2/dKJ+pGKA4zDGJgG #add new feature 15-10-14 loglevel 296 日誌級別 cachesize 1000 ldap緩存的條目數 checkpoint 2048 10 上面的設置時達到2048或者10分鐘執行一次checkpoint,把內存中的數據寫回數據文件中 # end
1.4.0.6 權限控制管理
http://www.openldap.org/doc/admin24/access-control.html 先簡單配置權限管理 刪除如下內容: database config 99 access to * 100 by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage 101 by * none 102 103 # enable server status monitoring (cn=monitor) 104 database monitor 105 access to * 106 by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read 107 by dn.exact="cn=Manager,dc=my-domain,dc=com" read 108 by * none 新增: access to * by self write by anonymous auth by * read 1.4.1 配置rsyslog,記錄ldap日誌 [root@localhost openldap]# cp /etc/rsyslog.conf /etc/rsyslog.conf.bak echo "local4.* /var/log/ldap.log " >>/etc/rsyslog.conf [root@localhost openldap]# tail -1 /etc/rsyslog.conf local4.* /var/log/ldap.log [root@localhost openldap]# /etc/init.d/rsyslog restart
1.4.2 配置ldap數據庫路徑
[root@localhost openldap]# grep directory slapd.conf # Do not enable referrals until AFTER you have a working directory # The database directory MUST exist prior to running slapd AND directory/var/lib/ldap 此時的路徑爲數據庫路徑 [root@localhost openldap]# ###6.4操做步驟 cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG [root@localhost openldap]# ls /var/lib/ldap/ DB_CONFIG chmod 700 /var/lib/ldap/ chown ldap:ldap /var/lib/ldap/DB_CONFIG [root@localhost openldap]# slaptest -u config file testing succeeded
1.4.3 啓動LDAP
[root@localhost openldap]# /etc/init.d/slapd start Starting slapd: [ OK ] [root@localhost openldap]# ps -ef | grep slapd ldap 2073 1 0 11:10 ? 00:00:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -u ldap root 2079 1973 0 11:10 pts/4 00:00:00 grep slapd [root@localhost openldap]# 加入開機自啓動 [root@localhost openldap]# chkconfig slapd on [root@localhost openldap]# chkconfig --list | grep slapd slapd 0:off1:off2:on3:on4:on5:on6:off
###此時服務器端的安裝和配置完畢
1.4.5 查看數據庫內容
此時尚未數據,屬於正常狀況 ,後面會以web端方式進行數據添加
[root@localhost openldap]# ldapsearch -LLL -W -x -H ldap://aapingou.com -D "cn=admin,dc=aapingou,dc=com" -b "dc=aapingou,dc=com (uid=*)" Enter LDAP Password: ldap_bind: Invalid credentials (49) ---版本不同致使,5.8 與6.4的區別 how to solve?? [root@localhost openldap]# rm -rf slapd.d/* 刪除默認2.4的配置文件
***************以2.3的配置爲主,再去生產2.4的配置 *****************
[root@localhost openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/ 561dcadf bdb_monitor_db_open: monitoring disabled; configure monitor database to enable config file testing succeeded [root@localhost openldap]# /etc/init.d/slapd restart Stopping slapd: [ OK ] Checking configuration files for slapd: [FAILED] 561dcb11 ldif_read_file: Permission denied for "/etc/openldap/slapd.d/cn=config.ldif" slaptest: bad configuration file! root@localhost openldap]# chown -R ldap:ldap /etc/openldap/slapd.d/ [root@localhost openldap]# /etc/init.d/slapd restart Stopping slapd: [FAILED] Starting slapd: [ OK ] [root@localhost openldap]# ps -ef | grep slapd ldap 2161 1 0 11:25 ? 00:00:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -u ldap root 2167 1973 0 11:25 pts/4 00:00:00 grep slapd [root@localhost openldap]# ldapsearch -LLL -W -x -H ldap://aapingou.com -D "cn=admin,dc=aapingou,dc=com" -b "dc=aapingou,dc=com " "uid=*" Enter LDAP Password: No such object (32) -----表示配置成功,只是沒有數據,數據正常
1.4.6 爲ldap 數據庫添加數據
在下面部分中會以web端進行添加數據操做
1.4.7 爲ldap客戶端配置web管理接口
yum install httpd php php-ldap php-gd -y cd /var/www/html/ 381 ls 382 rz xvf ldap-account-manager-3.7.tar.gz 383 ls 384 tar xvf ldap-account-manager-3.7.tar.gz 385 ls 386 mv ldap-account-manager-3.7 ldap 387 cd ldap 390 cd config 391 ls 392 cp config.cfg_sample config.cfg 393 cp lam.conf_sample lam.conf 修改lam.conf 配置文件 [root@localhost config]# pwd /var/www/html/ldap/config [root@localhost config]# sed -i 's#cn=Manager#cn=admin#g' lam.conf [root@localhost config]# sed -i 's#dc=my-domain#dc=aapingou#g' lam.conf 受權 [root@localhost config]# chown -R apache:apache /var/www/html/ldap 1.4.7.1 測試訪問ldap web 客戶端 [root@localhost ldap]# /etc/init.d/httpd restart Stopping httpd: [FAILED] Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName [ OK ] [root@localhost ldap]# netstat -tnlp | grep 80 tcp 0 0 :::80 :::* LISTEN 2404/httpd [root@localhost ldap]#
1.4.7.2 登錄web端 進行添加用戶操做
步驟以下圖所示
新增一個組,一個用戶
如今在此查詢,新增數據是否成功
[root@localhost ldap]# ldapsearch -LLL -W -x -H ldap://aapingou.com -D "cn=admin,dc=aapingou,dc=com" -b "dc=aapingou,dc=com " "uid=wyb" Enter LDAP Password: dn: uid=wyb,ou=People,dc=aapingou,dc=com objectClass: posixAccount objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person homeDirectory: /home/wyb loginShell: /bin/bash cn:: IHd5Yg== uidNumber: 10001 gidNumber: 10001 sn: wyb givenName: wyb uid: wyb userPassword:: e1NTSEF9K1FwdC96dXorSDVqRVNscGhSZ0g1TXVjOWFodG4rUG4=
經過web結構管理ldap的配置完成!也已經完成了初始化用戶組和用戶
1.4.8 導出,備份ldap數據庫文件
方法一: [root@localhost ldap]# ldapsearch -LLL -w 123456 -x -H ldap://aapingou.com -D "cn=admin,dc=aapingou,dc=com" -b "dc=aapingou,dc=com" >/root/bak-ldap.ldif 方法二: 導出數據更經常使用的是slapcat命令,該命令的格式以下: 最經常使用的選項就是-l,表示導出爲LDIF文件格式。 slapcat -l sladp-back
提示:從導出結果可看出,除了使用ldapadd命令添加到目錄數據庫中的條目數據外,還導出了不少其餘信息,包括條目錄UUID、時間戳等信息 ,次命令處處的內容比ldapsearch 導出的更爲詳細
1.4.9 從LDIF文件添加到目錄數據庫
使用OpenLDAP客戶端工具ldapadd命令,可將LDIF文件中的條目添加到目錄數據庫中,該命令的格式以下:
ldappadd 選項 LDIF文件
在ldappadd命令中經常使用的選項以下:
-x:進行簡單認證。
-D:用來綁定服務器的dn。
-h:目錄服務的地址。
-w:綁定dn的密碼。
-f:使用LDIF文件進行條目添加的文件。
將前面編寫的LDIF文件的條目數據添加到目錄數據庫中。
具體操做步驟以下:
(1)檢查dlw.com.ldif文件中的內容,須要注意的是,每一個冒號後面都須要空一格,而每行結束處不能留有空格字符。
(2)使用如下命令將dlw.com.ldif文件中的條目添加到目錄中:
寫道
前提是現有entry中不能有將要導入的信息,若是有請先刪除,再次導入新的
# ldapadd -x -D "cn=admin,dc=aapingou,dc=com" -w 123456 -f bak-ldap.ldif
(3)使用ldapdelete 刪除整個entry 或者一個cn
#delete one user [root]# ldapdelete -D "cn=admin,dc=ldap.xxx,dc=net" -W -x -H ldap://ldap.xxx "uid=18x,ou=rfkj,dc=ldap.xxx,dc=net" #delete all (ou) [root]# ldapdelete -D "cn=admin,dc=ldap.xxx,dc=net" -W -r -x -H ldap://ldap.xxx.net "ou=rou,dc=ldap.xxx,dc=net" -r 表示遞歸刪除
提示:若是以上命令執行不成功,須要逐個字符檢查bak-ldap.ldif文件中的內容,特別注意空格的問題。
關於本文中的三處密碼作個解答
1,web客戶端登錄ldap server操做時候,LAM configuration---->Edit server profiles----preferences(lam) 此處的密碼由
/var/www/html/ldap/config/lam.conf 這個文件管理
# password to change these preferences via webfrontend (default: lam)
#Passwd: {SSHA}B6tdhIqMn9WoOBojwzfBEf4MAY/J39Uh
Passwd: {SSHA}D6AaX93kPmck9wAxNlq3GF93S7A= R7gkjQ== 這就是preference的密碼,默認lam
2,web客戶端登錄ldap server操做時候,LAM configuration---->Edit general settings------->general preferences(lam) 此處的密碼由
/var/www/html/ldap/config/config.cfg 這個文件管理
# password to add/delete/rename configuration profiles (default: lam)
password: {SSHA}D6AaX93kPmck9wAxNlq3GF93S7A= R7gkjQ== 默認密碼爲lam
3
########################################################################################
下面根據我本身的經驗,給出幾個安裝和配置注意事項,供參考。
疑惑1:細心的人會發現有的教程說要配置主機DNS,添加與LDAP相關的域名,而大部分教程都沒有說起這個,那麼到底要不要配置呢?
解答:固然須要配置。安裝好OpenLDAP後首先須要配置slapd.conf這個文件,其中裏面有
suffix "dc=example, dc=com"
這樣一句須要本身配置,這兩個dc表明什麼意思呢?其實dc就是「domainComponent」,也就是域名的組成部分,準確的說是主機域名的 後綴組成部分,若是這裏的配置與你的主機域名不對應的話,服務通常是啓動不了的。那麼怎麼配置域名呢?Linux和Windows下的配置文件以下:
Linux下:/etc/hosts
Windows下:C:\Windows\System32\drivers\etc\hosts
須要在hosts文件裏添加一條域名(若是沒配置的話),格式以下:
127.0.1.1 hostname.example.com hostname
好比個人主機名是min,並添加的域名配置是:
127.0.1.1 min.alexia.cn min
那麼相應的我就須要在slapd.conf裏這樣配置suffix:
suffix "dc=alexia, dc=cn"
固然這裏域名後綴不必定只有兩級,也能夠是hostname.example.com.cn,而後suffix就應該是「dc=example, dc=com, dc=cn」,這隨便你怎麼設置了,只要對應就行。
疑惑2:不少版本的slapd.conf裏默認都配置了下面兩個變量:
modulepath /usr/lib/ldap moduleload back_@BACKEND@
這是什麼意思?須要改動嗎?
解答:這是數據庫database的backend,通常slapd.conf裏配置的database都是 bdb,也就是Berkeley DB,有的也許是hdb,其實也是Berkeley DB,只是兩個不一樣的存儲引擎(就像Mysql有MyISAM和InnoDB兩個不一樣的存儲引擎同樣)。而modulepath和moduleload指 定了動態模塊路徑及動態裝載的後端模塊,由於OpenLDAP默認是用Berkeley DB存儲數據的,若是你有動態的數據須要裝載,那麼就須要配置這兩個參數,對於通常用戶將這兩個註釋掉便可。
疑惑3:OpenLDAP默認採用Berkeley DB存儲數據,那麼能夠換用其它的關係數據庫嗎?具體如何配置呢?
解答:固然能夠。首先須要明確ldap數據模型來自RDBMS(關係數據庫模型),而並無指定必定是哪一個 DB,只要是關係數據庫均可以做爲LDAP的後臺,那麼你爲何會想用其它的數據庫代替自帶的Berkeley DB呢?我想多是性能相關了,對於少許數據你用哪一個均可以,但若涉及到稍大點的數據,好比成千上萬的用戶查詢,那麼Berkeley DB的性能就不可觀了,並且Berkeley DB管理起來也不太方便,畢竟對這個數據庫熟悉的人很少,若是能換做咱們常用的數據庫,不只性能獲得提高,管理起來也十分容易,豈不是一舉多得。
具體怎麼配置了,請參考這篇文章:用postgresql做後臺的openldap,以PostgreSQL做爲例子進行講解。
疑惑4:新舊版本的OpenLDAP到底有什麼差別呢?
解答:簡單一句話就是:舊版本的OpenLDAP配置文件通常是slapd.conf(路徑多是/etc/openldap,也多是/usr/local/openldap,甚至多是/usr/share/slapd/,不一樣版本不一樣安裝不一樣系統均可能不一樣,可以使用locate slapd.conf進行查找正確的路徑),而新版本(我測試的新版本是2.4.31)的OpenLDAP服務運行時並不會讀取該配置文件,而是從slapd.d目錄(通常與slapd.conf在同一目錄下)中讀取相關信息,咱們須要把該目錄下的數據刪掉,而後利用咱們在slapd.conf裏配置的信息從新生成配置數據。這也多是你啓動服務後運行ldap相關命令卻出現「ldap_bind: Invalid credentials (49)」錯誤的主要緣由。具體怎麼從新生成配置數據請看1.4.5配置內容。
疑惑5:自定義的ldif數據文件中的objectclass後的domain、top、organizationalUnit、inetOrgPerson等等都是什麼意思,能夠隨便寫嗎?
解答:存儲LDAP配置信息及目錄內容的標準文本文件格式是LDIF(LDAP Interchange Format),使用文本文件來格式來存儲這些信息是爲了方便讀取和修改,這也是其它大多數服務配置文件所採起的格式。LDIF文件經常使用來向目錄導入或更 改記錄信息,這些信息須要按照LDAP中schema的格式進行組織,並會接受schema 的檢查,若是不符合其要求的格式將會出現報錯信息。所以,ldif文件中的屬性都定義在各大schema中,其中objectclass是對象的類屬性, 不能隨便填寫,而應與schema中一致。通常slapd.conf文件的頭部都包含了這些schema:
include ../etc/openldap/schema/core.schema include ../etc/openldap/schema/cosine.schema include ../etc/openldap/schema/inetorgperson.schemainclude ../etc/openldap/schema/nis.schema include ../etc/openldap/schema/krb5-kdc.schema include ../etc/openldap/schema/RADIUS-LDAPv3.schema include ../etc/openldap/schema/samba.schema
其中前三個是比較重要的schema,定義了咱們所須要的各個類,好比ldif中通常先定義一個根節點,其相應的objectclass通常是 domain和top,而根節點下的ou屬性即定義組節點(group)的objectclass通常是 organizationalUnit,group下能夠是group也能夠是用戶節點,用戶節點的objectclass通常是 inetOrgPerson。而各個節點的一系列屬性如用戶節點的uid、mail、userPassword、sn等等都定義在schema中相關的 objectclass裏,能夠本身查找看看。
疑惑6:OpenLDAP認證用戶uid時默認是不區分大小寫的,也就是「alexia」與「AleXia」是同一個用戶,在有些狀況下這並不合理,能配置使得認證時能區分大小寫嗎?
解答:以我目前的經驗來看,舊版本的OpenLDAP是能夠配置區分大小寫的,而新版本的OpenLDAP卻配置不了。爲何這麼說呢?
這裏就涉及到「matching rules」這個概念了,即匹配規則,就是各個屬性按什麼樣的規則進行匹配,好比是否區分大小寫、是否進行數字匹配等等,這裏有詳細的官方匹配規則描述。好比舊版本的core.schema裏有下面這樣一段:
attributetype ( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC1274: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
從字面上也能夠看出,其中caseIgnoreMatch
和caseIgnoreSubstringsMatch
就定義了uid或userid屬性匹配時不區分大小寫,若是咱們將其改成caseExactMatch
和caseExactSubstringsMatch
就表示用戶uid認證時須要區分大小寫,也就是「alexia」與「AleXia」同不一樣的用戶,這很簡單,在舊版本的OpenLDAP也行得通。
但是在新版本的OpenLDAP中卻不行,新版本的core.schema文件中也包含這樣一段:
#attributetype ( 2.16.840.1.113730.3.1.217# NAME ( 'uid' 'userid' ) # DESC 'RFC1274: user identifier'# EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
惋惜是註釋掉的,那咱們取消註釋而後改屬性行不行呢?答案是不行,會報錯:Duplicate attributeType: "2.16.840.1.113730.3.1.217」,也就是說該屬性已經被定義了,而後我就去包含的全部schema中搜索uid屬性的定義,結果卻找不到定義,那麼爲何還會報這個錯誤呢?後來一陣搜索,終於在這個帖子「slapd: built-in schema for uidNumber/gidNumber does not have ordering directive」知道了答案,原來新版本的OpenLDAP已經把uid屬性定義schema硬編碼到了slapd程序中,也就是沒法在配置文件中修改了,真是坑!
針對這個問題,我給出兩個不太好的解決方案:
下載OpenLDAP源碼,找到定義uid屬性匹配規則的地方,修改它而後從新編譯。這個工做量不輕鬆,熱愛研究源碼的人能夠嘗試。
不 要用uid屬性進行認證,咱們能夠自定義一個與用戶一一對應的屬性如user-id(不要與已有的屬性重複就行),其配置與uid如出一轍(即模仿 uid),而後用該屬性做爲認證的因子,建議從新建一個schema,而後配置好後include進slapd.conf中重啓服務便可。具體怎麼定義和 配置能夠參考這篇文章。
個人主要經驗也就這些。OpenLDAP也有客戶端,若是你配置成功後,能夠用客戶端或寫Java程序進行驗證。