Ubuntu下的LDAP服务搭建
前言
由于公司业务发展,内部搭建的公共系统越来越多,对每一位同学来说,需要记住多个系统的用户名和密码,对大龄同学极度不友好,同时,对IT同学来说,在新人入职阶段,需要去不同的账号平台里添加或注册账号,管理和使用代价有点高;
经过和周边部门同学沟通下来,决定使用LDAP服务来管理这批平台,先简单介绍下什么是LDAP。
LDAP
基础定义
LDAP全称叫做 Light Directory Access Portocol,直译过来就是轻量目录访问协议,之所以叫做目录,是因为它使用的数据库 是一个为查询、浏览和检索而重度优化过的数据库,并且成树状结构组织数据,就像我们大家Windows系统里的目录一样,一层一层往下拓展。
数据特性
目录数据库和关系数据库不同,它具有优异的读性能,但是写性能差,并且不具有常规关系型数据库的ACID特性,因此他天生就是用来做查询的。
实现的功能
LDAP是跨平台的Internet协议,市面上大多数产品都加入了对LDAP的支持,因此对于这类系统来说,我们只需要简单的通过插件形式的配置,就能够实现LDAP服务与指定产品的认证交互,那么在笔者这里,能够实现的就是“使用一个LDAP服务中的认证信息,去认证所有内网下的公共平台”,变相实现企业“一账通”功能。
安装
环境介绍和前期准备
因为笔者公司内网的开发环境为Ubuntu,因此主要的搭建环境细节如下:
root@saier-zj-online-game-192:~# ifconfig
eth0 Link encap:Ethernet HWaddr **:**:**:**
inet addr:192.168.0.83 Bcast:192.168.15.255 Mask:255.255.240.0
root@saier-zj-online-game-192:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
防火墙
由于业务安全基线要求比较低,当前这台测试机上,防火墙是关闭的,因此在实际测试过程中,并没有额外的配置防火墙策略,但是网上其他博主有配置防火墙的操作,这里摘抄过来,仅供参考:
ufw allow proto tcp from any to 192.168.0.83 port 389
ufw allow proto tcp from any to 192.168.0.83 port 636
apt包源
这里我们采用apt-get的安装方式,Ubuntu原生自带的source就能够下载安装ldap了,并且暂时不建议使用国内的阿里或其他源,可能会下载到版本比较高的包并与本地的原有依赖包产生冲突;
安装步骤
执行安装指令:apt-get install -y slapd ldap-utils
配置
交互式配置
在执行上述安装指令的过程中,你的终端会出现交互式配置界面,让你定义一些初始化配置,下面我们一起康康每条都是啥意思~
1.定义administrator的管理密码
2.二次确认,心细嗷
OK之后,你会发现安装过程就退出了,我们去修改下配置文件的内容:
root@saier-zj-online-game-192:~# cd /etc/ldap/
root@saier-zj-online-game-192:/etc/ldap# cat ldap.conf
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=ldap,dc=com
URI ldap://192.168.0.83
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
实际上面的交互式配置并不是完整的ldap配置,因为系统默认为你选择了一些配置,因此,如果我们不满足于当前配置信息,我们可以执行指令:
dpkg-reconfigure slapd
交互界面如下:
1.是否需要创建初始配置和数据库,我们需要,因此不能激活此项,选No
2.DNS域名,可以看到是跟base DN相对应的
注意
这里有一点需要说明下,笔者在其他的博客中看到,很多人需要在本地的hosts文件中解析ldap服务器的域名和对应的内网IP地址,笔者这里并没有做该配置,我觉得他并不是必须的,之所以需要做自定义解析,是因为他们在后续的管理和集成中,会在需要配置ldap服务器的地方配置对应域名,而不是采用IP+端口的方式,因此我这里并没有做自定义解析,也就是说,这里的DNS配置,我仅仅是保持跟DN一致,并没有额外的作用。
同时,我这样的配置也会有个麻烦之处,ldap的很多指令,默认是会去找这里DNS配置的域名上的服务的,但是我这里配置的域名,并不是真实ldap的域名,因此很多指令会报错,但是可以解决,在命令行上加上ldap服务的Ip和端口即可,后面会有说明。
3.设置组织名称
4.配置管理员密码
5.确认管理员密码
6.选择数据库类型,这里康到他其实推荐使用最新的MDB,那我们就用MDB,如果没有MDB版本的同学,我们可以使用HDB
7.卸载ldap时候是否需要清空数据库,这里我们选了No
8.这里我们推荐使用最新的数据库,因此需要移走老的库
9.是否允许LDAPv2协议,这里我们选No
关于为什么我们禁用LDAPv2协议,找了官网,说明如下:
LDAPv2 is historic (RFC3494). As most so-called LDAPv2 implementations (including slapd(8)) do not conform to the LDAPv2 technical specification, interoperability amongst implementations claiming LDAPv2 support is limited. As LDAPv2 differs significantly from LDAPv3, deploying both LDAPv2 and LDAPv3 simultaneously is quite problematic. LDAPv2 should be avoided. LDAPv2 is disabled by default.
以上9步选择完之后,交互式界面的配置就结束了,我们可以使用ldap包里带的指令来着看当前ldap服务中配置的分层信息:
root@saier-zj-online-game-192:/etc/ldap# ldapsearch -x -LLL
dn: dc=ldap,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: lrldap
dc: ldap
dn: cn=admin,dc=ldap,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
配置字段解析
咱们分别看下这些个字段是什么意思,第一次接触的同学可能会有点晕~
唯一辨别名,类似于linux文件系统中的绝对路径,每个目录树中,dn保持唯一
dn: dc=ldap,dc=com
对象集,我们可以看到,每一层可以赋予多个对象集属性
objectClass: top
objectClass: dcObject
objectClass: organization
组织名,刚刚我们在交互式界面配置的
o: lrldap
域名部分
dc: ldap
这第二层,多了cn,cn是公共名称,我们可以理解为是上面部分dn中包含的一个cn
dn: cn=admin,dc=ldap,dc=com
这层cn所具有的对象集
objectClass: simpleSecurityObject
从这里也能看到,上面的对象集是organization,这里是organizationalRole,组织内的角色,是不是能够比较好的理解ldap的分层概念了~
objectClass: organizationalRole
cn上面说了,是公共名称,可以理解为一个组,或一个目录,里面还能包含一些东西
cn: admin
description: LDAP administrator
OK,上述指令能够正常执行的话,说明咱们的ldap服务就成功搭建完成了,后面就是对于数据查询和管理方面的问题了,搭建过程告一段落~
管理
获取工具
看了网上很多人都是用phpldapadmin,我试了下不是特别想用,因为它本身也是个服务,需要依赖apache,同时还需要适配我们的ldap服务,做的改动会有点多,并且如果少安装了某些php扩展,还可能导致你的管理界面进不去,当初就是花了很多时间去处理这个问题~~
这里我们推荐一款在Windows下运行的ldap管理工具,获取地址:
LdapAdmin.exe
一起看下使用方法,打开管理用具可以看到如下界面:
点击红框按钮,选择新增ldap连接,连接的配置界面如下:
在Account栏里,它默认是使用匿名用户连接的,这里我们需要取消勾选匿名账号的标记,采用图片中的username和password登录,其中,password就是交互式界面中我们配置的管理员密码~~
username就是我们的ldap管理员名称,在上面 ldapsearch -x -LLL指令中可以拿到对应信息;
ok,点击测试连接,成功之后,就能够通过LdapAdmin来管理咱们的ldap服务了~~
管理工具展示的界面如下:
如图我们也能看到,根(dc=ldap,dc=com)下有一个管理员分支(cn=admin)
至此,我们就能够通过该工具来管理我们的ldap了。
数据控制
通过读取文件的形式新增数据
ldap在命令行上支持通过指令来读取文件内容,并将内容写入到数据库中;
文件的命名有要求,需要以“ldif”结尾,内容如下:
root@saier-zj-online-game-192:/etc/ldap# cat structure.ldif
dn: ou=people,dc=ldap,dc=com
objectClass: organizationalUnit
objectClass: top
ou: user
dn: ou=group,dc=ldap,dc=com
objectClass: organizationalUnit
objectClass: top
ou: group
执行指令:
root@saier-zj-online-game-192:/etc/ldap# ldapadd -x -D cn=admin,dc=ldap,dc=com -W -f structure.ldif -h 192.168.0.83 -p 389
Enter LDAP Password:
adding new entry "ou=people,dc=ldap,dc=com"
adding new entry "ou=group,dc=ldap,dc=com"
这里看到,我们在运行指令的时候,手动添加了”-h 192.168.0.83 -p 389“参数,还记得是为什么嘛 ^ ^
显示添加新的entry成功,我们看下工具里的效果:
刷新之后,也成功显示了~~
关于ldap指令相关的内容,可以参考:
通过管理工具新增数据
通过管理工具,其实也就是用鼠标,我们看下该怎么添加这些信息,鼠标放到跟分支上>右击>New==>Entry
点击左上角的保存后,管理界面就能够出现咱们新建的Entry了!
笔者公司的需求场景
前面跟大家叙述过,我这边是需要通过ldap去统一管理内部的多个公共平台,因此,就需要ldap的数据库里有全公司员工的账号密码信息,这边创建的过程其实比较明了,其一是通过ldif文件的方式添加,其二是手动通过鼠标点击的方式添加,笔者在添加过程中遇到的一些坑,这里给大家指出来~~
分组
由于公司内部有多个部门,同时也就对应ldap中的多个分组,这个分组,我们可以在“ou=group”目录下创建;
鼠标放在ou=group分支>右击>New==>Group of unique names
注意:最后一击这里不能选择单纯的’Group‘组,否则创建出来的内容,无法被集成的平台拉取到,
笔者这里是手动创建的。
成员
成员的话,需要包括公司所有同学,200号人,原先打算通过配置文件添加,发现并不好用,最后....慢慢点叭--
成员的loginshell不是必填项,其他的几个,大家自己看看,这里就不赘述了,没有坑的地方;
注意:成员创建完之后,就可以双击分组,显示栏里有个Add按钮,可以把指定成员添加的对应组里~~
像confluence这类平台,是能够直接识别到分组和分组里的成员,权限控制起来比较方便~~
到目前为止,Ubuntu环境系的ldap服务的搭建以及数据管理过程,就大致分享完了,后续还会有集成到各种平台(confluence,jenkins,nextcloud,svn)的文章提供大家参考,有遗漏或错误的地方,欢迎请指正。