OpenLDAP学习笔记基于OpenLDAP-2.4.x


1.1、什么是目录服务(Directory Services)?

目录是一个特殊的数据库,专门用于搜索和浏览,另外也支持基本的查询和更新功能。

目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix
系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务
处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一
样。

基于X.500 目录访问协议,以及基于X.500基础发展而来的LDAP协议,其【具体实现】有: OpenLDAP, ApacheDS, Active Directory, Red Hat Directory Service, IBM Directory Server


1.2、什么是LDAP?

LDAP是 Lightweight Directory Access Protocol的缩写, 翻译为: 轻型目录访问协议。国内通常读作: L-DAP 或者 L-D-A-P。

顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500而言的;LDAP略去了x.500中许多不太常用的功能,且以TCP/IP协议为基础)。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。同时,LDAP只是一个协议,它没有涉及到如何存储这些信息,因此还需要一个后端数据库组件来实现。这些后端可以是bdb(BerkeleyDB)、ldbm、shell和passwd等。

What kind of information can be stored in the directory? The LDAP information model is based on entries(条目). An entry is a collection of attributes that has a globally-unique Distinguished Name(DN). The DN is used to refer to the entry unambiguously. Each of the entry's attributes has a type and one or more values. The syntax of values depend on the attribute type.

信息如何组织?

目录条目以层次型的树状结构来组织。传统上, 这种结构反映地域和组织机构界限。

wKiom1lFyf3D_QccAABgjEWLl0o830.png

树也可以根据互联网域名(Internet命名)组织。这种命名方式也越来越受欢迎,因为它允许使用DNS为目录服务定位。

wKiom1lFypHhefEKAABVHscKd8o415.png


LDAP目录以树状的层次结构来存储数据(类似于 DNS),最顶层即根称作“基准DN(base DN)”,形如“dc=mydomain,dc=com”或 “o=mydomain.org”,前一种方式更为灵活也是Windows AD 中使用的方式。在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,LDAP像其它的目录服务协议一样也使用OU(OrganizationUnit),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU还可以有子OU,用来表示更为细致的分类。

How is the information referenced ?

LDAP中每一条记录都有一个唯一的区别于其它记录的名字DN(DistinguishedName),其处在“叶子”位置的部分称作RDN;如 dn:cn=tom,ou=animals,dc=mydomain,dc=org中tom即为RDN; RDN在一个OU中必须是唯一的。

How is the information accessed ?

LDAP定义了查询和更新目录操作。提供的操作包括,从目录中增加和删除一个条目,变更某个已经存在的条目,以及变更一个条目的名字。尽管,绝大部分时间,LDAP 是用于在目录中搜索信息. LDAP搜索操作允许目录的一些部分被搜索以寻找那些满足搜索过滤器规定的条件的条目. 可以请求每个和要求相匹配的条目的信息。

How does LDAP work ?

LDAP utilizes a Client-Server(C/S)模型。One or more LDAP servers contain the data making up the directory information tree (DIT). The client connects to servers and asks it a question. The server responds with an answer and/or with a pointer to where the client can get additional information (typically,another LDAP server). No matter which LDAP server a client connects to,it sees the same view of the directory; a name presented to one LDAP server references the same entry it would at another LDAP server. This is an important feature of a global directory service.

What is the difference between LDAPv2 and LDAPv3 ?

LDAPv3在1990's 末期开发出来用来替代 LDAPv2。LDAPv3 为 LDAP增加了以下功能:

  • 使用SASL实现强验证和数据安全服务

  • 使用TLS(SSL)实现证书验证和数据安全服务

  • 使用Unicode编码实现国际化

  • 转发和配置

  • Schema Discovery

  • 扩展性(控制,操作扩展,等等)

LDAPv2 过时了 (RFC3494)。大部分所谓LDAPv2实现(including slapd(8))已经不符合LDAPv2技术规范了,那些声称支持LDAPv2的实现之间的互操作性是有限的。由于LDAPv2和LDAPv3显著的差异, 同时部署LDAPv2和LDAPv3是存在问题的。 应该避免使用LDAPv2。 LDAPv2缺省是被禁用的

What is slapd and what can it do ?

slapd(Standalone LDAP Daemon) is an LDAP directory server that runs on many different platforms。 slapd 其实就是基于LDAP协议的一个具体开源实现(OpenLDAP Software 2.4), 它实现了轻量级目录访问协议版本3(LDAPv3),并支持 IPv4 和 IPv6 (TCP/IP)以及 Unix IPC 网络协议。

总结:

LDAP是什么?

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写【注意:它是协议】。LDAP协议实际上是在X.500标准协议基础之上产生的一个简化版本。LDAP是一种开放的Internet标准,LDAP协议是跨平台的。与X.500不同,LDAP支持TCP/IP(即可以支持分布式部署)。

LDAP几个特点:

LDAP的数据存储以层次的树状结构,而不是二维表。

LDAP可以高效的查询,不过在写方面,就慢很多。

LDAP是Client-Server(C/S)模型。

OpenLDAP是什么?

OpenLDAP 是 LDAPv3 协议的具体实现, 可支持多平台,以提供目录服务。其进程为 slapd。

1.3、配置选择

本地目录服务:

在这种配置中,只为您的本地网域提供目录服务,它不以任何方式与其他目录服务器交互。

wKiom1lF9T6xANDJAAAQTs9iOig268.png


带转发的本地服务:

在这种配置中,为您的本地网域提供目录服务,并配置它返回转发到其他能够处理请求的服务器。

wKioL1lF9bXj1VLZAAAdhpO5584383.png

可复制的目录服务:

OpenLDAP支持同步复制,即所谓的 syncrepl,可用于在多个目录服务器上维持目录信息的影子复制。最基本的配置,主服务器作为 syncrepl 供应商, 而一个或多个从服务器是 syncrepl 消费者。

wKiom1lF9lvSN8cUAAAsKIm6kUM414.png



分布式本地目录服务:

在这种配置中,当地的服务被分割成较小的服务,每个都是可复制的,和上下级粘在一起转发。

1.4、复制

为了提供一个有弹性的企业部署,复制目录是一个基础需求。

OpenLDAP 2.3 同步复制问题(网上摘抄,没有经过测试):

  • slurpd 守护进程是以推(push)模式操作, 主服务器推送变更数据到从服务器(不可靠)

  • 对replog中记录的次序极为敏感

  • 很容易失去同步,这时需要手工干预来重新同步从服务器数据库

  • 如果一个从服务器长时间停机,导致replog可能变得太大以至于slurpd无法处理

  • 需要停止和重新启动主服务器来新增从服务器

  • 只支持单一主服务器复制(1主对多从)


Syncrepl 复制

LDAP syncrepl 同步复制是一个基于对象的复制机制. 当提供者的一个被复制对象中的任何属性值改变时,每个消费者在复制过程中撷取并处理完整的变更对象,包括所有改变和没改变的属性值(同步整个条目对象,而不是改变的某个属性). 这方法的一个好处是当多个变更发生在单一对象上时,那些变更的精确顺序不需要保存; 只有最终状态是有意义的. 但是当使用模式(匹配的方式)在一次变更中处理很多对象时,这个方法可能有缺点。

例如,假设你有一个数据库包含 100,000 对象,每个对象是 1 KB . 进一步,假设你经常运行一个批处理工作来变更主服务器上的 100,000 对象的每一个对象中的一个两字节的属性值. 不算LDAP和TCP/IP协议的开销,每次你运行这个工作每个消费者将传送并处理 1 GB 的数据,只是为了处理这个 200KB 的变更!

在类似这样的案例中,99.98% 被传送和处理的数据将是多余的,因为它们代表那些未变更的值. 这是一个对宝贵的传输和处理带宽的浪费并且可能导致发展出不可接受的复制日志的积压. 虽然这个情形是一个极端,但它有助于演示某些LDAP部署的一个非常真实的问题.


Delta-syncrepl复制(基于变更日志同步)

Delta-syncrepl,一个基于变更日志syncrepl变种,被设计用来处理类似上面所说的情况. Delta-syncrepl通过在提供者一端维护一个可选择深度的变更日志来起作用. 复制消费者为它需要的变更检查这个变更日志,只要变更日志包含它需要的变更,消费者就从变更日志撷取这些变更并把它们应用到自己的数据库. 不过,一个复制(译者注:指变更日志里的变更)如果离上一次同步的状态太远(或消费者根本就是空的),可以用常规的syncrepl把它(指消费者)恢复到最新的状态然后复制重新切换到delta-syncrepl模式.


N-Way Multi-Master复制

Multi-Master复制是一个使用Syncrepl复制数据到多个提供者(“主服务器”)目录服务器的复制技术.

对于Multi-Master replication有效的观点
    • 如果任何提供者失败了,其他提供者将继续接受更新

    • 避免了单点失效

    • 提供者们可以在不同的物理位置例如跨越全球网络.

    • 好的自动容错/高可用性

对于Multi-Master replication无效的观点

(这些经常被声称是Multi-Master复制的优点但是那些说法是错误的):

    • 它不关负载均衡任何事

    • 提供者必须对所有其他的服务器进行写操作,这意味着分布在所有的服务器上的网络交通和写操作负载,和单一主服务器是一样的。

    • 多服务器的服务器利用率和负载在最好的情况下和单服务器一样; 最坏的情况下单服务器更优,因为在提供者和消费者之间使用不同的模式的时候索引可以做出不同的优化调整.


MirrorMode复制

MirrorMode是一个混合配置,既提供单主服务器复制的所有一致性保障,也提供多主服务器模式的高可用性. 在 MirrorMode 两个提供者都被设置成从对方复制(就象一个多主服务器配置),但是一个额外的前段被用来引导所有的写操作到仅仅到两台服务器中的其中一台. 第二个提供者将只在第一台服务器崩溃时进行写操作,那时这个前端将切换路径引导所有的写操作到第二个提供者. 当一个崩溃的提供者被修复并且重启动后将自动从正在运行的提供者那里活得任何更新并重新同步.

Syncrepl代理模式

因为LDAP同步协议同时支持基于“拉”和“推”的复制,“推”模式 (refreshAndPersist) 在提供者开始"推"变更之前仍必须由消费者初始化. 在一些网络配置中,特别是防火墙限制了连接的方向时,一个提供者初始化的推模式是需要的.

这个模式可以被配置成LDAP Backend (Backends and slapd-ldap(8)). 不用在实际的消费者服务器上运行syncrepl引擎,而是一个slapd-ldap代理设置在靠近(或搭配在)提供者的地方指向消费者,而这个syncrepl引擎运行在这个代理服务器上.


OpenLDAP 2.4

替代Slurpd

旧的slurpd机制只操作主服务器初始化的推模式. Slurpd复制被Syncrepl复制取代了并且在OpenLDAP 2.4中被完全移除了.



LDIF文件的通常规则适用于配置信息:以'#'字符开始的注释行会被忽略。如果一行的开始是一个空格,它被认为是延续前行(即使前行是注释)并且这个单个的空格会被删除。条目是由空白行分开的。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...