Ubuntu apt-get
install安裝參考:http://dongwang.wordpress.com/category/uncategorized/
普通linux安裝,以XXX用戶身份安裝:
1、安裝Berkeley
DB 4.7.25:伯克利大學嵌入式數據庫解決方案,openldap拿它作為存儲方案。
http://download.oracle.com/berkeley-db/db-4.7.25.tar.gz下載到:/home/XXX/download/
# tar xvf
db-4.7.25.tar.gz
# cd
db_4.7.25
# cd build_unix/
#
../dist/configure -prefix=/home/XXX/app/BerkeleyDB
# make
# make install
2、安裝openldap前準備:配置環境變量,參考openldap install文件
#export
CPPFLAGS="-I/home/XXX/app/BerkeleyDB/include -D_GNU_SOURCE"
注:不設置make時報getpeereid.c:65: error: storage size of ‘peercred’ isn’t
known錯誤
#export
LDFLAGS="-L/home/XXX/app/BerkeleyDB/lib"
注:不設置configure時報configure: error: BDB/HDB: BerkeleyDB not
available錯誤
#export
LD_LIBRARY_PATH="/home/XXX/download/db-4.7.25/build_unix/.libs"
注:不設置configure時報configure: error: Berkeley DB version
mismatch錯誤
3、安裝openldap-2.4.15:
ftp://sunsite.cnlab-switch.ch/mirror/OpenLDAP/openldap-release/openldap-2.4.15.tgz下載到/home/XXX/download/
#tar xvf
openldap-2.4.15.tgz
#cd
openldap-2.4.15/
#./configure
-prefix=/home/XXX/app/openldap
# make
depend
# make test
可跳過
# make
# make
install
4、配置openldap:
#cd
/home/XXX/app/openldap/etc/openldap
#gedit
slapd.conf
加入(注意:中間是空格+tab,順序必須保證,有相互依賴關系):
include
/home/XXX/app/openldap/etc/openldap/schema/corba.schema
include
/home/XXX/app/openldap/etc/openldap/schema/cosine.schema
include
/home/XXX/app/openldap/etc/openldap/schema/inetorgperson.schema
include
/home/XXX/app/openldap/etc/openldap/schema/misc.schema
include
/home/XXX/app/openldap/etc/openldap/schema/openldap.schema
include
/home/XXX/app/openldap/etc/openldap/schema/nis.schema
include
/home/XXX/app/openldap/etc/openldap/schema/java.schema
將文件中的
database bdb
suffix
"dc=my-domain,dc=com"
rootdn
"cn=root,dc=my-domain,dc=com"
rootpw
secret
修改成自己的目錄根,指定自己根的管理員,這里修改為root,與linux的root沒有什么關系
rootdw
是管理員的密碼,默認密碼是secret,這里可以使用MD5加密。
#cd
/home/XXX/app/openldap/sbin
#slappasswd
New
password:
Re-enter new
password:
{SSHA}mHzQL7t4YG/a6g5mt2YPLE/+ErmekI34
也可以指定加密方式:
# slappasswd -h
{MD5}
將輸出結果替換secret
5、啟動openldap:
#
/home/XXX/app/openldap/libexec
# su root -c
"./slapd"
必須如此,1024以下的端口必須由root才能綁定,ldap是389端口。
如果啟動不成功可以用
./slapd -d 1啟動debug模式。。將在屏幕打印啟動信息
#netstat -tlnp
發現389端口即啟動成功
接下來的事情就是向數據庫添加數據。ldap不支持sql,所以要用ldapadd這個程序來添加,添加的時候要用一個ldif文件,把要添加的東西寫在里面,ldif的格式在admin
guide里面有說明。首先要添加根,這一步是必要的,不然任何數據都添加不進去。我們編輯一個init.ldif文件,包括建立my-domain.com、管理者為domain.com
底下的root、以及一個people的物件容器,用來放一般使用者。
dn:
dc=my-domain,dc=com
objectClass:
dcObject
objectClass:
organization
dc:
my-domain
o: my-domain
Company
dn:
cn=root,dc=my-domain,dc=com
objectClass:
organizationalRole
cn: root
dn:
ou=people,dc=my-domain,dc=com
objectClass:
organizationalUnit
ou: people
應該會看到你的organization、organizationRole、organizationUnit
這三個,也就是你的最高網路域名?最高管理者、以及一個準備用來容納使用者的people 項目。這個people
項目你當然可以自由取名。
提示:objectClass必須設置屬性:
dcobject:dc用來表示一個域名的部分
organization:o用來表示一個組織的名稱
person:cn和sn用來表示名和姓
organizationalPerson:與person相同。
organizationalRole:cn 表示管理者名稱
organizationUnit:ou表示容器名稱
詳細參考:http://www.yolinux.com/TUTORIALS/LinuxTutorialLDAP-GILSchemaExtension.html
執行命令:
#cd
/home/XXX/app/openldap/bin
#ldapadd -D
"cn=root, dc=my-domain,dc=com" -w secret -f init.ldif
或者
#ldapadd -D
"cn=root, dc=my-domain,dc=com" ?-W -f
init.ldif
說明:-D指定管理員目錄
-f指定導入文件 -W表示彈出密碼輸入提示 如果是簡單普通密碼,則-w secret即可。
如果成功將提示:
adding new entry
dc=my-domain,dc=com
adding new entry
cn=root,dc=my-domain,dc=com
adding new entry
ou=people,dc=my-domain,dc=com
補充一:用戶users.ldif
,其中userPassword在person聲明,mail在inetOrgPerson聲明
dn:cn=kehufankui,ou=people,dc=navinfo,dc=com
objectClass:
person
objectClass:
inetOrgPerson
sn:kehufankui
cn:kehufankui
userPassword:123
mail:loveflying88@sina.com
多個用戶重述上面信息
補充二:啟動注意解決辦法:
錯誤一:openldap安裝成功后,另外啟動一個終端,slapd啟動時將報錯:
./slapd: error
while loading shared libraries: libdb-4.7.so: cannot open shared
object file: No such file or directory
出錯原因:找不到bdb的鏈接庫。
解決辦法一:完全拷貝。
#cp
/home/XXX/app/BerkeleyDB//include/* /usr/include/
#cp
/home/XXX/app/BerkeleyDB/BerkeleyDB/lib/* /usr/lib/
解決辦法二(推薦):
要把/home/XXX/app/BerkeleyDB/lib的庫路徑直接加到/etc/ld.so.conf文件最后一行,添加完成后執行一次
ldconfig,使用配置文件生效。
提示:
ld.so.conf記錄了編譯、或運行時使用的動態鏈接庫(.so)的路徑。默認情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的庫文件。
錯誤二:debug模式啟動時報daemon: bind(7) failed errno=13錯誤
出錯原因:是1024以下的端口必須由root才能綁定。因為ldap默認是389端口。所以才報這個錯誤。
解決辦法:su root -c
"./slapd"
6、擴展openldap
schema配置:
ldap默認的schema屬性聲明有時候無法滿足現實的需要,比如要用openldap備份微軟ldap的數據,sAMAccountName是微軟特有的屬性,這樣我們就需要擴展屬性。
舉例說明,擴展inetOrgPerson這個objectClass,增加sAMAccountName這個屬性。
打開inetorgperson.schema文件,添加:
#sAMAccountName
attributetype (
2.16.840.1.113730.3.1.217
NAME
'sAMAccountName'
DESC ''
EQUALITY
caseIgnoreMatch
SUBSTR
caseIgnoreSubstringsMatch
SYNTAX
1.3.6.1.4.1.1466.115.121.1.15{128}
SINGLE-VALUE
)
#targetDN
attributetype (
2.16.840.1.113730.3.1.218
NAME
'targetDN'
DESC ''
EQUALITY
caseIgnoreMatch
SUBSTR
caseIgnoreSubstringsMatch
SYNTAX
1.3.6.1.4.1.1466.115.121.1.15{256}
SINGLE-VALUE
)
在May里添加:
MAY (
....
$ userPKCS12 $ sAMAccountName
$targetDN)
)
即可,參考:
http://blog.163.com/duanhehui0928@126/blog/static/115272342201031122227764/
http://hi.baidu.com/teamtogether/blog/item/fde2b81184f17fc8a7ef3f0f.html
7、后記
微軟ldap和openldap在dn的存儲設計上有本質區別。
openldap:the DN
isn't an attribute value - it's theobject's name itself.
微軟ldap:the DN is
an attribute value - it's?DistinguishedName。
dn是一個比較重要的屬性,作為object 的唯一路徑標識,刪除、修改object都要使用到,而java
ldaptemplate訪問openldap時卻無法獲取dn值,值得一提的是python-ldap
search默認獲取的就是("dn值",{屬性集合}),非常方便。
針對java
ldaptemplate的設計失誤,只能在openldap增加一個targetDN來存儲dn值來變相解決這個問題。