LDAP是轻量目录访问协议,这个服务从老高进入360就一直在用,LDAP带来的好处真的是很多,你可以把它想象成为一个内网版的单点登录服务,可以让你使用同一组账户密码访问所有支持LDAP验证的系统,为企业的内部运维带来了极大的便利。

不过想要自己独立搭建一个LDAP服务还是挺麻烦的!不过一旦搭建好了LDAP服务器,剩下的管理和运维就简单多了。

在搭建LDAP服务器前,我们必须需要了解一些LDAP的基本概念。

What is LDAP

Lightweight Directory Access Protocol,轻量目录访问协议,他是基于 X.500(目录访问协议)的DAP发展过来的,与LDAP一样提供类似的目录服务软件还有ApacheDS、Active Directory、Red Hat Directory Service。

X.500 是 ISO 制定的一套目录服务的标准,它是一个协议族,定义了一个机构如何在全局范围内共享名称和与名称相关联的对象。通过它,可以将局部的目录服务连接起来,构建基于 Internet 的分布在全球的目录服务系统……而目录访问协议(DAP)是 X.500 的核心组成之一。

LDAP的特点

  • LDAP基于TCP/IP
  • LDAP的结构用树来表示
  • LDAP读快写慢
  • Client/server模型,Server 用于存储数据,Client提供操作目录信息树的工具,LDIF格式
  • LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议

LDAP一些概念

目录树概念

  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。有点类似URI,可以通过一个路径确定唯一一个对象。
  3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
  4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

关键字缩写

关键字英文全称含义
Entry-条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。
Attribute-每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个,比如你有多个邮箱。
ObjectClass-对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。
Schema-对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值,他们之间的关系如下图所示。所以这些构成了模式(Schema)——对象类的集合。条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。一般存放路径为/etc/openldap/schema,一个条目的属性必须存在于已定义的schema中
LDIFLDAP Data Interchange FormatLDIF 是一种普遍使用的文件格式,用来描述目录信息或可对目录执行的修改操作。
dcDomain Component域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
uidUser Id用户ID songtao.xu(一条记录的ID)
ouOrganization Unit组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
cnCommon Name公共名称,如“Thomas Johansson”(一条记录的名称)
snSurname姓,如“许”
dnDistinguished Name“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
rdnRelative dn相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

简单的例子

请先观察老高画的图,老高预先给出几个dn,看看你能不能总结出出什么规律! dn:dc=360,dc=Net dn:ou=Tech,dc=360,dc=Net dn:uid=phpgao,ou=Web,ou=Tech,dc=360,dc=net


                 +-------------+
                 |             |
                 |    dc=Net   <---+ 顶 级 域 名
                 |             |
                 +------+------+
                        |
                        |
                 +------v------+
                 |             <---------+下 一 级 域 名
                 |    dc=360   +-----------+
                 |             |           |
                 +-----+-------+           |
                       |                   |
                       |                   |
                 +-----v------+      +-----v------+
                 |            |      |            |
      +----------+   ou=Tech  |      | ou=Finance <-----+ 组 织
      |          |            |      |            |
      |          +------+-----+      +-----+------+
      |                 |                  |
      |                 |                  |
+-----v-----+    +------v-----+      +-----v------+
|           |    |            |      |            |
|   ou=Web  |    |    ou=App  |      |  uid=cfo   <-----+ 对 象
|           |    |            |      |            |
+-----+-----+    +------+-----+      +------------+
      |                 |
      |                 |
+-----v-----+    +------v-----+
|           |    |            |
| uid=phpgao|    |   uid=dev  |
|           |    |            |
+-----------+    +------------+


首先,dn的写法是从下向上,用逗号间隔; 其次,dn是唯一的,否则就没法确定一条entry了; 最后,rdn就是dn最左边的entry。

查看配置文件

schema文件

/etc/openldap/schema/nis.schema文件为例,我们可以发现,objectclass posixAccount 有以下定义:

# Object Class Definitions

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
	DESC 'Abstraction of an account with POSIX attributes'
	SUP top AUXILIARY
	MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
	MAY ( userPassword $ loginShell $ gecos $ description ) )

我们关注的是MUST中和MAY中的字段,以uidNumber和userPassword()为例,我们可以在文件的Attribute Type Definitions节中发现以下定义:

# builtin
#attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
#	DESC 'An integer uniquely identifying a user in an administrative domain'
#	EQUALITY integerMatch
#	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )


attributetype ( 2.5.4.35 NAME 'userPassword'
	EQUALITY octetStringMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )

安装LDAP(Centos7)

废话不多说,我们先安装好openldap,等下一篇老高来讲讲配置的方法。

安装LDAP服务端

yum install openldap-servers

# 启动服务

systemctl start slapd
systemctl status slapd

# 查看版本
slapd -V

> OpenLDAP: slapd 2.4.44

安装LDAP客户端工具

首先,配置好一个新的LDAP服务器后,老高建议优先使用一个GUI工具配置,在此老高推荐使用Apache Directory Studio,支持多平台配置。

当然,你也可以用命令行管理

yum install openldap-clients

# 查看工具
ls -al /usr/bin/ |grep  ldap

ldapadd
ldapcompare
ldapdelete
ldapexop
ldapmodify
ldapmodrdn
ldappasswd
ldapsearch
ldapurl
ldapwhoami

管理工具

phpLDAPadmin Self Service Password JXplorer

Refer: