什么是openLDAP
LDAP(Lightweight Directory Access Protocol,轻型目录访问协议),是一种基于TCP/IP的访问在线目录服务的协议,有V2和V3版本,其中现在用得最多的都是V3版本。而openLDAP则是这种协议的开源的实现,被广泛应用于“目录访问权限控制”这一目的。举个例子,假设公司有很多个服务系统,包括个人信息系统、文档协作系统、生产环境系统、工资发放系统等等,如果每个系统都独立使用一个账号,当有人入职或者离职的时候,每个系统都得注册,维护起来异常麻烦;而一些通用信息比如员工姓名等等,会存储很多份,要修改的话需要每个系统都得修改。那么openLDAP就可以干这么一件事,只要你的账号在openLDAP上,那么所有的系统通过接入openLDAP就能够验证你的身份,来判断你可以访问哪些目录,提供一些基本信息等等,入职只需要加入一个openLDAP的Object,离职只需要删除或者移动到指定的组,是不是方便太多啦。目前绝大多数的软件都支持数据库登录+LDAP登录双重登录方式,项目管理工具、bug管理工具、文档管理工具等等,非常有必要学习一下。 
简单认识openLDAP的数据结构
Entry 条目
openLDAP是一个树结构,基本模型是条目(Entry),Entry类似于数据库中的一行数据,像这样:
text
cn: Roger
sn: BWB
displayName:Roger BWB
telephoneNumber:1234567890
userPassword: (Md5 hased password)Dn 唯一辨别名
每个Entry都具有一个唯一的“标识符”——唯一辨别名Dn(Distinguished Name),像这样:
text
cn=Roger,dc=bewindoweb,dc=com可以看出dn是确定这个Entry所走过的路径的逆序字符串(从根节点dn=bewindoweb,dn=com向下,找到了cn=Roger的Entry)。
ObjectClass 对象类
接下来是比较难理解的对象类(ObjectClass)。
直观感受
人员person的ObjectClass长这样,很像Java中的类定义: 
分类
Object分为三种:
- 结构型(Structural):有account、person等等,一般都具有具体的完整含义,例如account代表账户、person代表人员
- 辅助型(Auxiliary):有uidObject等,用于一些辅助型的属性补充,例如增加一个uid的Attribute
- 抽象型(Abstract):有top等,只用来被其他ObjectClass继承,top是必须继承的一个抽象类
其他特性
- 子类会继承父类的全部属性(Attribute)。
- 属性有
Must和May之分,Must是必填的Attribute,May是可选的Attribute。比如上面的人员中,姓氏cn和全名sn是一个人必须要有的属性,而电话号码telephoneNumber、描述description等则是可有可无的属性。
Entry可以有多个ObjectClass
一个Entry至少具有一个,可以具有多个ObjectClass,比如:
一个属性是抽象型对象类top,一个属性是基础的结构型对象类person,一个属性是辅助型对象类uidObject(这个Entry所拥有的ObjectClass也是它的一个属性)。
然后person里面有必填的cn、sn,可选的description、telephoneNumber、userPassword;uidObject里有必填的uid。
这就构成了一个完整的Entry,它的Dn是cn=roger,dc=bewindoweb,dc=com。
其他的相关缩写含义
| 缩写 | 全写 | 含义 | 举例 |
|---|---|---|---|
| c | Country | 国家 | cn |
| cn | Common Name | 通用名 | Roger/Server123 |
| dc | Domain Component | 域 | bewindoweb/com |
| o | Organization | 组织 | bewindoweb |
| ou | Organizational Unit | 组织单元 | developer/admin/user |
完整的LDAP树结构示意图

开始动手搭建:Hello openLDAP
1、搭建环境
debian 8 64位服务器
2、下载源码包
3、编译和安装
安装基本工具
如果是新系统,先安装基本的gcc、make等工具:
shell
apt-get install gcc
apt-get install make安装BerkeleyDB
因为openLDAP底层数据库采用的BerkeleyDB,它是一种读数据库,读快写慢,支持分布式但不支持事务。
首先,注意比对一下openLDAP所需要的数据库版本:
shell
#进入openLDAP源码目录
cd openldap-2.4.46
#查看readme含有BDB的上下5行
cat README |grep BDB -C 5
然后,解压BDB源码后,进入build_unix目录(是个空目录),执行configure、make、make install:
shell
tar -zxvf db-5.1.29.tar.gz
cd db-5.1.29/build_unix
../dist/configure
make
make installmake的过程可能需要3分钟,这样BDB就会被安装在/usr/local/BerkeleyDB.5.1目录下了。
最后要把BDB的可执行文件加入环境变量,随意你使用什么方式,这里采用bashrc:
shell
vi ~/.bashrc
#加入
export PATH=$PATH:/usr/local/BerkeleyDB.5.1/bin
#生效
source ~/.bashrc安装openLDAP
解压openLDAP源码、进入目录,执行configure:
shell
./configure CPPFLAGS="-I/usr/local/BerkeleyDB.5.1/include" LDFLAGS="-L/usr/local/BerkeleyDB.5.1/lib" LD_LIBRARY_PATH="/usr/local/BerkeleyDB.5.1/lib" --prefix [自定义目录]其中--prefix可以安装到指定目录,如果不指定的话,默认安装到/usr/local。然后提示要make depend:
shell
make depend
make
make test
这就说明make对了,最后执行安装:
shell
make install4、配置
配置openLDAP
shell
vi /usr/local/etc/openldap/slapd.conf修改这两行,这是设置管理员帐号密码的:
我修改为了:
ini
suffix "dc=bewindoweb,dc=com"
rootdn "cn=Manager,dc=bewindoweb,dc=com"
rootpw **********密码可以使用工具来生成高强度密码,比如对123456进行加密
shell
slappasswd -s 123456
{SSHA}VuxpAZ3Dt8Hwasb/eHJHh3CkkCg1qdEF然后重启slapd:
shell
/usr/local/libexec/slapd可能会提示错误:libdb-5.1.so: cannot open shared object file: No such file or directory,原因是找不到这个库,其实这个库在BDB目录下的,建立一个硬链接:
shell
ln -s /usr/local/BerkeleyDB.5.1/lib/libdb-5.1.so /usr/lib/libdb-5.1.so就不报错了。最后增加一个用户:
shell
vi /usr/local/etc/openldap/bwb.ldif
#根据前面对应的配置加入这些
dn:dc=bewindoweb,dc=com
objectclass:dcObject
objectclass:organization
o:bewindoweb company
dc:bewindoweb
dn:cn=Manager,dc=bewindoweb,dc=com
objectclass:organizationalRole
cn:Manager然后加入数据库:
shell
# -x:简单认证
# -D:指定服务器Dn
# -w:绑定dn的密码
# -f:使用LDIF文件进行条目添加
ldapadd -x -D "cn=Manager,dc=bewindoweb,dc=com" -W -f bwb.ldif会提示输入密码,输入之前配置的密码即可。
验证一下是否加入成功:
shell
ldapsearch -x -b 'dc=bewindoweb,dc=com'
5、使用phpLDAPadmin进行可视化
shell
apt-get install phpldapadmin注意会安装php5和apache2,如果你已经有网站项目在上面比如php7,那么就要考虑一下怎么处理了。
修改配置文件:
php
vi /etc/phpldapadmin/config.php
// $servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('server','base',array('dc=bewindoweb,dc=com'));
// $servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');
$servers->setValue('login','bind_id','cn=Manager,dc=bewindoweb,dc=com');访问界面:http://xxx.xxx.xxx.xxx/phpldapadmin/
如果发现访问不了,除了检查phpLDAPadmin,也别忘了检查服务器是否开了端口(默认ldap都在389端口):
查看端口:
shell
lsof -i:3896、使用Apache Direcotry Studio进行可视化
安装在windows上后,点击菜单:
Window→Open Perspective→LdapWindow→Show View→Connection
右键新建一个连接:
由于不支持直接输入ip,修改本地的hosts文件C:\Windows\System32\Drivers\etc\hosts:(为了不影响bewindoweb.com的正常访问,这里写成了testbewindoweb.com)
shell
106.12.129.65 testbewindoweb.com然后填入服务器信息,点击Check Network Parameter可以测试TCP连接是否成功:
填入管理员帐号,测试是否可以验证成功:
然后就可以愉快地使用了: 
总结
目前Confluence、Grafana、禅道、YAPI等等非常多的软件都已集成LDAP,掌握LDAP的原理、安装和使用有利于以后的更加透彻理解。





粤公网安备44030602007943号