LDAP简介

背景

  当公司的内部系统越来越多(诸如:GitLab、Jenkins、Zabbix、YApi )时,就有可能出现如下情况:

  1. 各个系统之间是不是都有独立的账户密码?

  2. 若多个系统,使用用户名或密码不一样,是不是有时想不来这个账户或密码对应哪个系统?

  3. 每次引入内部系统,都需要重新维护一套用户密码?

  4. 维护多套系统的用户名及密码是不是非常繁琐?

那有没有一套系统能解决上述这样的问题?答案肯定是:有的;有一个叫“LDAP统一认证服务”即为上述的情况解决此类问题的。

  使用LDAP集成多个系统,只需在LDAP中新增用户及密码,则就可以用此一个账户登陆Gitlab及Jenkins等其他系统,见下图:

 wps2.png

在了解LDAP之前,先了解何为目录服务?

目录服务

  1.目录服务将有关现实世界中的事物(如人、计算机、打印机等等)的信息存储为具有描述性属性的对象

  2.目录服务是一个特殊的数据库,用来存储描述性的详细信息。

  3.目录服务与传统的数据库相比,不支持事务、回滚;但它拥有快速查询或搜索性能,写入性能较差。


LDAP

  LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。

  LDAP 具有两个标准,分别是 X.500 和 LDAP。OpenLDAP 是基于 X.500 标准的,而且去除了 X.500 复杂的功能并且可以根据自我需求定制额外扩展功能,但与 X.500 也有不同之处,例如 OpenLDAP 支持 TCP/IP 协议等,目前 TCP/IP 是 Internet 上访问互联网的协议。

  其官方文档:http://www.openldap.org/doc/admin24/


LDAP的功能

  1. 实现账户统一集中管理

  2. 权限控制管理

  3. 主机控制管理

  4. 密码控制管理

  5. 同步机制

  6. ....


LDAP的架构

  LDAP的系统架构为服务器/客户端(C/S)模式,其工作模型如下:

wps1.jpeg

ps:Berkeley DB为简称BDB(Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯、SQL解析等步骤),最初有Sleepycat公司开发,2006年被Oracle公司收购。

LDAP的基本模型

  LDAP的基本模型是建立在"条目"(Entry)的基础上。一个条目是一个或多个属性的集合,并且具有一个全局唯一的"可区分名称"(用dn表示)。与关系型数据进行类比,一个条目相当于数据库中的一条记录,而dn相当于数据库中记录的关键字,属性相当于数据库中的字段。

 然而这些信息,在LDAP中是如何被存储的呢?

  在LDAP中,这些目录条目是按照层次树状结构排列的。如下图

 wps3.jpeg

  在上图所示的树形结构中,树的根结点是一个组织的域名(dlw.com),其下分为3个部分,分别是managers、people和group,可将这3个组看作组织中的3个部门:如managers用来管理所有管理人员,people用来管理登录系统的用户,group用来管理系统中的用户组。当然,在该图中还可继续增加其他分支。

  对于图中所示的树形结构,使用关系数据库来保存数据的话,需要设置多个表,一层一层分别保存,当需要查找某个信息时,再逐层进行查询,最终得到结果。

  若使用目录来保存该图中的数据,则更直观。图中每个结点用一个条目来保存,不同类型的结点需要保存的数据可能不同,在LDAP中通过一个称为objectClass的类型来控制不同结点需要的数据(称为属性)。


LDAP如何访问目录中的条目?

  上面提到过,每一个条目都有一个dn,因为dn是唯一的,因此就可找到需要结点的数据。dn的构造方式如下:

首先得到条目自己的名称(rdn,称为相对dn),然后开始向上逐级查找父结点,一直到根项为止。

例如,对于上图中最右下方的结点,其dn为:

dn: cn=ldap, ou=group, o=dlw.com


LDAP中的Schema

   对于LDAP目录中保存的信息,可以使用LDIF(LDAP Interchange Format)格式来保存。

这是一种标准文本文件格式,使用这种格式保存得的LDAP服务器数据库中的数据可方便读取和修改,这也是其他大多数服务配置文件所采取的格式。

  在LDAP中,schema用来指定一个目录中所包含的对象(objects)的类型(objectClass),以及每一个类型(objectClass)中必须提供的属性(Atrribute)和可选的属性。可将schema理解为面向对象程序设计中的类,通过类定义一个具体的对象。LDIF中的数据条目可理解为是一个具体的对象,是通过schema来规划创建的。因此,schema是一个数据模型,用来决定数据按什么方式存储,并定义存储在不同的条目(Entry)下的数据之间的关系。schema需要在主配置文件slapd.conf中指定,以用来决定在目录中可以使用哪些objectClass。


LDAP中常见的属性

  LDAP中声明了许多常用的属性(用户也可以自定义属性),常见的属性清单如下:

givenName

指一个人的名字,不能用来指姓

sn(surname)

一个人的姓

dn (distinguished name)

唯一标识名,类似于Linux文件系统中的绝对路径,每个对象都有唯一标识名。 例如,uid=dpgdy,ou=People,dc=gdy,dc=com

rdn (relative dn)

通常指相对标识名,类似于Linux文件系统中的相对路径。 例如,uid=dpgdy

uid(user id)

通常指一个用户的登录名称。 例如,uid=dpgdy,与系统中的uid不是一个概念

sn(sur name)

通常指一个人的姓氏。例如,sn:Guo

I

通常指一个地方的地名。例如,I:Shanghai

objectClass

objectClass是特殊的属性,包含数据存储的方式以及相关属性信息

dc (domain component)

通常指定一个域名。例如,dc=example,dc=com

o (organization Name)

通常指定一个组织的名字

ou (organization unit)

通常指定一个组织单元的名称。 例如,ou=people,dc=example,dc=com

cn(common name)

通常指一个对象的名称,如果是人,需要使用全名

mail

通常指登录账号的邮箱地址,例如,mail:[email protected]

telephoneNumber

通常指登录账号的手机号码,例如,telephoneNumber:xxxxxxxxxxx

c(country)

通常指一个二位国家的名称,例如CN、US等国家代号。例如,c:CN


LDAP及phpLDAPAdmin部署

请参阅《LDAP及phpLDAPAdmin部署


LDAP高可用架构

 OpenLDAP同步复制(简称syncrepl)机制是消费方的一个复制引擎,能让消费者服务器维护一个抽取片段的影子副本。

OpenLDAP常用的高可用架构:

  1. syncrepl模式

syncrepl模式是指从(slave)服务器到主(master)服务器以拉的模式同步目录树。当主服务器对某个条目或更多条目修改条目属性时, 从服务器会把修改的整个条目进行同步, 而不是单独地同步修改的属性值。

  1. N-Way Multi-Master模式

N-Way Multi-Master主要用于多台主服务器之间进行LDAP目录树信息的同步, 更好的提供了服务器的冗余性。

  1. MirrorMode模式

MirrorMode属于镜像同步模式, 而且主服务器互相以推的方式实现目录树条目同步, 最多只允许且两台机器为主服务器。如果要添加更多的节点, 此时只能增加多台从服务器, 而不能将添加的节点配置为主服务器。

当一台服务器出现故障时, 另一台服务器立即对外提供验证服务。当异常服务器恢复正常时, 会自动通过另一个节点所添加或修改的条目信息进行同步, 并应用在本地。

  1. syncrepl Proxy模式

syncrepl Proxy同步模式属于代理同步, 它将主服务器隐藏起来, 而代理主机上边通过syncrepl从主服务器上以拉的方式同步目录树数据, 当代理主机数据发生改变时, 代理服务器又以推的方式将数据更新到下属的从LDAP服务器上, 且从LDAP服务器只有对代理LDAP服务器有读权限。

  1. Delta-syncrepl模式

在Delta-syncrepl同步模式下, 当主服务器对目录树上的相关条目进行修改时, 会产生一条日志信息, 于是这时候, 从服务器会通过复制协议, 将主服务器记录的日志应用到从服务器本地, 完成数据同步的过程。但每个消费者获取和处理完全改变的对象, 都执行同步操作。


LDAP高可用架构部署

待续....


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章