转载自:http://www.linuxfly.org/post/671/


某项目,需要在Asianux 4.0上配置LDAP服务。参考以前的[原]操作ldap 数据库一文,在执行ldapadd 命令时报错:

引用

ldap_bind: Invalid credentials (49)


经分析及查询相关资料,原来该版本的OpenLDAP已改用其他格式保存配置数据,原来的slapd.conf 仅作为模板使用。

一、软件版本
先来看看具体的版本信息:

引用

# cat /etc/asianux-release
Asianux Server 4 (Hiranya)
# rpm -qa|grep openldap
openldap-2.4.19-15.AXS4.x86_64
openldap-servers-2.4.19-15.AXS4.x86_64
openldap-devel-2.4.19-15.AXS4.x86_64
openldap-clients-2.4.19-15.AXS4.x86_64
compat-openldap-2.4.19_2.3.43-15.AXS4.x86_64


二、配置LDAP
1.修改配置文件
这里假设系统是新安装好的,没有遗留数据。若非如此,请参考附录。
在/etc/openldap目录下,有一个slapd.conf.bak文件,拷贝一份为slapd.conf。

# cd /etc/openldap
# cp slapd.conf.bak slapd.conf


(为什么这里会没有slapd.conf,第一次配置时已觉得有点问题,后来才知道,因为该文件现仅作为模板使用,服务真正读取的配置数据不在这里)
然后,使用slappasswd命令创建一个密码:

引用

# slappasswd
New password:
Re-enter new password:
{SSHA}3c6DQ4xIKU/7Qz22Y2S2MgOoHhQkasR/


接着,参考以前的文档,修改slapd.conf中相关的信息,例如:

引用

database        bdb
suffix          "dc=example,dc=com"
checkpoint      1024 15
rootdn          "cn=Manager,dc=example,dc=com"
#rootpw          secret
rootpw {SSHA}3c6DQ4xIKU/7Qz22Y2S2MgOoHhQkasR/

access to *
        by dn.exact="cn=Manager,dc=example,dc=com" read
        by * none


蓝色标注的是密码,默认是注释的或为明文的“secret”,这里直接使用slappasswd命令生成的密码。

2.生成配置数据
正如前面所说的,服务运行时并不会读取slapd.conf 文件,而是从/etc/openldap/slapd.d目录中读取相关信息。
我们打开slapd.d/cn=config/olcDatabase={1}bdb.ldif 文件会看到以slapd.conf.bak生成的信息:

引用

# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}bdb.ldif
olcDatabase: {1}bdb
olcSuffix: dc=my-domain,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=my-domain,dc=com


所以,接下来要做的,就是先把这些数据删掉:

# rm -rf /etc/openldap/slapd.d/*


然后重新生成新配置数据:

引用

# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded


看看新生成的配置数据是否匹配:

引用

# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}bdb.ldif
dn: olcDatabase={1}bdb
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {1}bdb
olcSuffix: dc=example,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=example,dc=com


不错吧。但为了便于slapd服务读取,需要改一下宿主:

引用

# chown -R ldap.ldap slapd.d/
# ll slapd.d/
drwxr-x---. 3 ldap ldap 4096 10月 18 05:17 cn=config
-rw-------. 1 ldap ldap 1007 10月 18 05:17 cn=config.ldif


默认权限是没问题的,不需修改。

3.生成bdb数据
配置文件中,默认指定把数据存放在/var/lib/ldap目录下。启动LDAP服务前,还需要拷贝一个DB_CONFIG文件:

# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap.ldap /var/lib/ldap/DB_CONFIG


若不拷贝该文件,会报错,请见附录。启动slapd服务:

引用

# service slapd start
正在启动 slapd:                                           [确定]


4.导入数据
为了可正确访问LDAP数据库,还需要导入初始数据。使用vi 创建一个ldif文件,内容如下:

引用

# cat example.ldif
dn:dc=example,dc=com
objectclass:dcObject
objectclass:organization
o:Example,Inc.
dc:example

dn:cn=Manager,dc=example,dc=com
objectclass:organizationalRole
cn:Manager


执行ldapadd命令导入:

引用

# ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif
Enter LDAP Password:
adding new entry "dc=example,dc=com"

adding new entry "cn=Manager,dc=example,dc=com"


提示输入密码时,输入开始由slappasswd生成,并写入slapd.conf 配置模板rootpw部分后面的密码。
至此,LDAP配置已完成。

5.备份配置模板
为免出现误会,通常建议把配置文件sladp.conf 拷贝为.bak 文件,作为模板保存:

引用

# mv slapd.conf slapd.conf.bak
mv:是否覆盖"slapd.conf.bak"? y


三、使用phpLDAPadmin访问
phpLDAPadmin是使用php编写的,易于访问LDAP数据库的Web工具。从官网下载后,解压到/var/www/html 目录下,并改名、赋予合适的属主。

引用

# ll /var/www/html/phpldapadmin/ -d
drwxr-xr-x. 11 apache apache 4096 10月 18 03:45 /var/www/html/phpldapadmin/


然后,拷贝一个配置文件:

# cd /var/www/html/phpldapadmin/config
# mv config.php.example config.php


即可配置完成。
访问http://ip/phpladpadmin:
wKiom1Svi3LTliXAAANS-QeuRwM722.jpg
输入slapd.conf 配置模板中的rootdn 部分作为登陆DN,rootpw 部分为密码。
wKioL1SvjFKDEnVCAANaIkRdX6s704.jpg


登录成功

四、附录
1.若系统存在遗留数据,可删除相关数据后重新配置

# rm -rf /var/lib/ldap/*
# rm -rf /etc/openldap/slapd.d/*


2.执行ldapadd 命令时报错

引用

ldap_bind: Invalid credentials (49)


这是由于/etc/openldap/slapd.d 目录中使用的数据与执行导入命令时设置的DN 路径不符。
解决办法是,修改ldapadd 中-D 参数后面指定的DN值,或使用slapd.conf 配置模板生成新的配置数据。方法可见上面。

3.执行ldap_add命令时报错

引用

Invalid syntax (21)


这通常的原因是导入的ldif 中存在不合法的Class,与Schema 中定义不符。例如:objectclass:organizationalRole 写成 objectclass:organizational 等等。
解决方法是,修改Schema文件,或使用正确的Class定义。

4.重启slapd服务或执行slaptest 时报错

引用

bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).


原因是/var/lib/ldap目录中缺少DB_CONFIG文件,参考上面的方法从openldap-servers 包中拷贝一份,并赋予合适的属主即可。

五、参考资料
Red Hat 6: How to resolve ldapadd ldap_bind: Invalid credentials (49)
centos 简单安装 openldap

相关日志
[原]操作ldap 数据库
[原]LDAP服务介绍