OpenLDAP
参考:
- LDAP维基百科: https://zh.wikipedia.org/wiki/LDAP
- OpenLDAP维基百科: https://zh.wikipedia.org/wiki/OpenLDAP
x.500
维基百科: https://zh.wikipedia.org/wiki/X.500- OpenLDAP文档: http://www.openldap.org/doc/
环境:
- RHEL7.x86_64
- LDAP v2.4.44
概述
LDAP
LDAP(轻型目录访问协议, Lightweight Directory Access Protocol)是一个开放的、中立的、工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。
LDAP基于X.500
标准的子集。因为这个关系,LDAP有时被称为X.500-lite
。
LDAP在TCP/IP之上定义了一个相对简单的升级和搜索目录的协议。
LDAP目录与普通数据库的主要不同之处在于数据的组织方式,它是一种有层次的、树形结构。所有条目的属性的定义是对象类object class
的组成部分,并组成在一起构成schema
;那些在组织内代表个人的schema
被命名为white pages schema
。数据库内的每个条目都与若干对象类联系,而这些对象类决定了一个属性是否为可选和它保存哪些类型的信息。
LDAP目录的条目(entry)由属性(attribute)的一个聚集组成,并由一个唯一性的名字引用,即专有名称(distinguished name,DN)。
- DN: Distinguished Name
- CN: Common Name
- OU: Domain Component
LDAP组织数据方式:
|
|
LDAP主要的应用场景是查询多而修改极少,那就充分发挥LDAP的优势了。因为没有事务处理,那数据库的速度可是比不上。 还有LDAP能存储海量的数据,还可以轻松地在各个系统之间复制,可用性超高。
目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。
OpenLDAP
OpenLDAP是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其OpenLDAP许可证下发行,并已经被包含在众多流行的Linux发行版中。
OpenLDAP主要包括下述4个部分:
slapd
: 独立LDAP守护服务slurpd
: 独立的LDAP更新复制守护服务- 实现LDAP协议的库
- 工具软件和示例客户端
Why OpenLDAP
账号是登录系统的唯一入口。要登录系统,首先系统要存在登录所使用的账号(/etc/passwd)及密码信息(/etc/shadow),然后经过系统查找顺序(/etc/nsswith.conf)及认证模块(/etc/pam.d/*)验证,得到授权后方可登录系统。如果多个用户登录系统,就需要在每个系统上创建用户名和密码;否则,就无法登录系统。
对于账号管理人员而言,维护10 台、100 台机器的账号,或许勉强可以维护、管理。如果机器数量达到1000 以上时,对于账号的创建、回收、权限的分配、密码策略、账号安全审计等一系列操作,账号管理人员就心有余而力不足了。此时OpenLDAP 账号集中管理软件就应用而生,它可以实现账号集中维护、管理,只需要将被管理的机器加入到服务器端即可,此后所有与账号相关的策略均在服务端实现,从而解决了运维案例所产生的众多管理问题。
关于账号的添加、删除、修改、权限的赋予等一系列操作只需要在服务端操作即可,无须在客户端机器进行单独操作。客户端账号及密码均通过OpenLDAP 服务器进行验证,从而实现账号集中认证管理,此时账号管理员只须维护OpenLDAP 服务器条目即可。
OpenLDAP目录服务
Introduction to OpenLDAP Directory Services
本节介绍如何构建,配置和操作OpenLDAP软件以提供目录服务。这包括有关如何配置和运行standalone LDAP daemon——slapd
的详细信息。它适用于系统管理员。本节提供目录服务的基本介绍,特别是slapd提供的目录服务。
本简介提供足够的信息,以便您可以开始学习LDAP,X.500和目录服务。
目录服务是什么
目录是专门用于搜索(search)和浏览(browse)的专用数据库,另外还支持基本查找(lookup)和更新(update)功能。
目录往往包含描述性的,基于属性的信息,并支持复杂的过滤功能。目录通常不支持在为处理大量复杂更新而设计的数据库管理系统中发现的复杂事务或回滚方案。如果允许,目录更新通常是简单的全有或全无更改。目录通常用于快速响应高容量查找或搜索操作。他们可能具有广泛复制信息的能力,以提高可用性和可靠性,同时缩短响应时间。复制目录信息时,只要及时解决不一致问题,副本之间的临时不一致就可以了。
有许多不同的方法来提供目录服务。不同的方法允许将不同类型的信息存储在目录中,对如何引用,查询和更新信息。一些目录服务是本地的,向受限制的上下文提供服务;其它服务是全球性的,为更广泛的环境提供服务。全局服务通常是分布式的,这意味着它们包含的数据分布在许多机器上,所有机器都协作提供目录服务。通常,全局服务定义统一命名空间(namespace),无论您在何处与数据本身相关,都可以提供相同的数据视图。
LDAP是什么
LDAP(Lightweight Directory Access Protocol, 轻型目录访问协议),顾名思义,它是一种用于访问目录服务的轻量级协议,特别是基于X.500
的目录服务。LDAP通过TCP / IP或其他面向连接的传输服务运行。
哪些种类的信息可以存储在目录中?DAP信息模型基于条目(entry)。条目是具有全局唯一可分辨名称(DN)的属性(attributes)集合。DN用于明确指代Entry,每个条目的属性都有一个类型(type)和一个或多个值(value)。
|
|
信息是如何安排的?在LDAP中,目录条目以分层树状结构(tree-like structure)排列。 传统上,这种结构反映了地理/组织边界。表示国家/地区的条目显示在树的顶部。下面是代表各州和国家组织的条目。再下面可能是表示组织单位,人员,打印机,文档或您可以想到的任何其他内容的条目。
传统命名:
还可以基于因特网域名来安排树。这种命名方法正变得越来越流行,因为它允许使用DNS定位目录服务。
基于域名命名:
此外,LDAP允许您通过使用名为对象类(objectClass)的特殊属性来控制条目中所需和允许的属性。它的值确定条目必须遵守的模式规则。
如何引用信息?条目由其可分辨名称(DN)引用,该名称通过获取条目本身的名称来构造(称为Relative Distinguished Name, RDN),并连接其祖先条目的名称。
如何保护信息免受未经授权的访问?某些目录服务不提供保护,允许任何人查看信息。LDAP为客户端提供了一种机制,用于对目录服务器进行身份验证或证明其身份。LDAP还支持数据安全性(完整性和机密性)服务。
什么时候应该使用LDAP
通常,当您需要通过基于标准的方法集中管理、存储、访问数据时,应使用目录服务器。 总是有新的方法来使用目录并应用LDAP原则来解决某些问题,因此这个问题没有简单的答案。
一些常见的栗子:
- 机器认证: Machine Authentication
- 用户认证: User Authentication
- 用户/系统组: User/System Groups
- 地址簿: Address book
- 组织代表: Organization Representation
- 资产追踪: Asset Tracking
- 电话信息存储: Telephony Information Store
- 用户资源管理: User resource management
- 电子邮件查找: E-mail address lookups
- 应用配置存储: Application Configuration store
- PBX Configuration store
- …
LDAP如何工作
LDAP使用C-S模式。一个或多个LDAP服务器包含组成目录信息树(DIT,directory information tree)的数据。客户端连接到服务器并发出请求。服务端响应客户端的请求。无论客户端连接到哪个LDAP服务器,它都会看到相同的目录视图,这是全局目录服务的一个重要特性。
关于x.500
X.500
是计算机目录服务的标准系列。X.500
协议包括:
- DAP (Directory Access Protocol)
- DSP (Directory System Protocol)
- DISP (Directory Information Shadowing Protocol)
- DOP (Directory Operational Bindings Management Protocol)
- LDAP (Lightweight Directory Access Protocol)
从技术上讲,LDAP是X.500
目录服务的目录访问协议。DAP是一种重量级协议,可在完整的OSI协议栈上运行,并且需要大量的计算资源。LDAP旨在通过TCP/IP
进行操作,并以更低的成本提供DAP的大部分功能。
虽然LDAP仍然用于通过网关访问X.500目录服务,但现在更常见的是在X.500服务器中直接实现LDAP。
可以将 standalone LDAP daemon(slapd) 视为轻量级X.500目录服务器。也就是说,它没有实现X.500的DAP,也不支持完整的X.500模型。
LDAP与RDBMS
最常见的问题是——为什么OpenLDAP不使用 RDBMS(关系数据库管理系统) 而是使用像 LMDB 那样的嵌入式键/值存储?总的来说,期望商业级 RDBMS 实现的复杂算法可以使 OpenLDAP更 快或更好,并且同时允许与其他应用程序共享数据。
简而言之,使用嵌入式数据库和自定义索引系统,OpenLDAP可以在不损失可靠性的情况下提供更高的性能和可扩展性。所以OpenLDAP使用 LMDB 并发/事务 数据库软件。
下面是一个详细而冗长的答案: <>
很有可能认为在目录中使用RDBMS后端可以解决所有问题。但是,它是一头猪。这是因为数据模型非常不同。使用关系数据库表示目录数据将需要将数据拆分为多个表。 现在最大的问题是从一个条目访问数据需要在不同的磁盘区域上进行搜索。在某些应用程序中,这可能没问题但在许多应用程序中性能会受到影响。
slapd
slapd是OpenLDAP的守护进程, 在许多不同平台上运行的LDAP目录服务器。
slapd有一些有趣的功能和特性:
- LDAPv3: slapd实现轻量级目录访问协议的第3版,slapd支持IPv4和IPv6以及Unix IPC上的LDAP。
- Simple Authentication and Security Layer: slapd通过使用SASL支持强身份验证和数据安全性(完整性和机密性)服务
- Transport Layer Security: slapd通过使用 TLS/SSL 持基于证书的身份验证和数据安全性(完整性和机密性)服务
- Topology control: slapd可以配置为根据网络拓扑信息限制 socket 层的访问,基于 TCP wrapper
- Access control: slapd提供了丰富而强大的访问控制功能,允许您控制对数据库中信息的访问
- Internationalization: slapd支持Unicode 和 Language tag
- Choice of database backends: slapd附带了各种不同的数据库后端,您可以从中选择
- Multiple database instances: slapd可以配置为同时为多个数据库提供服务。这意味着单个slapd服务器可以使用相同或不同的数据库后端响应LDAP树的许多逻辑上不同部分的请求
- Generic modules API: 如果您需要更多自定义,slapd可让您轻松编写自己的模块
- Threads: slapd具有高性能的线程
- Replication: slapd可以配置为维护目录信息的集群副本
- Proxy Cache: slapd可以配置为缓存LDAP代理服务
- Configuration: slapd可通过单个配置文件进行高度配置,允许您更改您想要更改的所有内容
快速入门
A Quick-Start Guide
注意:本快速入门指南不使用强身份验证,也不使用任何完整性或机密保护服务。这些服务在OpenLDAP的其它章节中进行了描述。
以下包括OpenLDAP v2.4软件的快速入门指南。
- 获取软件
- 打开发行包
- 审阅文档
- 运行
configure
- 构建软件
- 测试构建
- 安装软件
- 编辑配置文件
- 导入配置数据库
- 启动SLAPD
- 添加初始化条目到目录
- 查看是否正常运行
配置选择
The Big Picture - Configuration Choices
本节简要概述了各种LDAP目录配置。
本地目录服务
Local Directory Service
在此配置中,您运行 slapd 实例,该实例仅为您的本地域提供目录服务。它不以任何方式与其他目录服务器进行交互。
带推荐的本地目录服务
Local Directory Service with Referrals
在此配置中,运行 slapd 实例,该实例为本地域提供目录服务,并将其配置为将引用返回到能够处理请求的其它服务器。
如果要提供本地服务并参与全局目录,或者要将下级条目的责任委派给其他服务器,请使用此配置。
副本目录服务
Replicated Directory Service
slapd 包括对基于LDAP Sync 的复制的支持,称为syncrepl。可用于在多个目录服务器上维护目录信息的副本。在其最基本的配置中,master 是 syncrepl provider,slavee 是 syncrepl consumer。 集群和提供了可靠性和可用性。
分布式目录服务
Distributed Local Directory Service
在此配置中,本地服务被划分为较小的服务,每个服务都可以被复制,并与上级和下级引用粘合在一起。
安装
Building and Installing OpenLDAP Software
本章详细介绍了如何构建和安装OpenLDAP软件包。
源码安装
官方文档中是使用源码进行构建和安装。
|
|
包安装
因为在base源里面可直接搜索到openldap
软件包,所以就是用软件包进行安装。
RPM包:
|
|
配置
Configuring slapd
安装完毕后,你就可以配置并使用它。
本章介绍 slapd-config
配置系统的一般格式。
OpenLDAP v2.3及更高版本已转换为使用动态运行配置引擎slapd-config
:
- 完全启用LDAP
- 使用标准LDAP操作进行管理
- 将其配置数据存储在LDIF数据库中(openldap/slap.d/)
- 允许所有slapd的配置选项在运行中进行更改,通常无需重新启动服务器即可使更改生效
注意: 虽然
slapd-config
统将其配置存储为(基于文本的)LDIF文件,但您不应直接编辑任何LDIF文件。配置更改应通过LDAP操作执行,如ldapadd
,ldapdelete
,ldapmodify
配置的布局
Configuration Layout
slapd配置存储为具有预定义模式和DIT的特殊LDAP目录。有特定的objectClasses
用于承载全局配置选项,模式定义,后端和数据库定义以及各种其它项。
栗子配置树:
slapd-config
配置树具有非常特定的结构。树的根名为 cn=config
并包含全局配置设置。其他设置包含在单独的子条目中:
- Dynamically loaded modules
- Schema definitions
- Backend-specific configuration
- Database-specific configuration
LDIF文件的常用规则适用于配置信息:
#
表示注释- 如果一行以单个空格开头,则将其视为前一行的延续(即使前一行是注释),并删除单个前导空格。条目由空行分隔
配置LDIF的一般布局如下:
|
|
配置指令
Configuration Directives
本节详细介绍了常用的配置指令
cn=config
本条目中包含的指令通常适用于整个服务器。其中大多数是系统或面向连接,而不是数据库相关。条目必须具有 olcGlobal
对象类(objectClass)
|
|
cn=module
如果在配置slapd时启用了对动态加载模块的支持,则可以使用 cn=module
条目来指定要加载的模块集。
|
|
cn=schema
此条目包含在 slapd 中硬编码的所有模式定义。因此,此条目中的值由slapd生成,因此配置文件中不需要提供 schema value。仍必须定义该条目,以作为用户定义的模式添加到下面的基础。schema entry 必须具有 olcSchemaConfig
的对象类 (objectClass)。
|
|
Backend-specific Directives
后端指令适用于所有相同类型的数据库实例,并且可能会被数据库指令覆盖,具体取决于指令。后端条目必须具有 olcBackendConfig
的对象类 (objectClass)。
|
|
Database-specific Directives
每种类型的数据库都支持本节中的指令。数据库条目必须含有 olcDatabaseConfig
对象类 (objectClass)。
|
|
BDB and HDB Database Directives
此类别中的指令适用于BDB和HDB数据库。除了上面定义的通用数据库指令之外,它们还用在 olcDatabase 条目中。除了olcDatabaseConfig
对象类之外,BDB和HDB数据库条目还必须分别具有 olcBdbConfig
和 olcHdbConfig
对象类。
|
|
slapd配置文件
The slapd Configuration File
本章介绍如何通过 slapd.conf
配置文件来配置 slapd
。 slapd.conf
已被弃用,建议使用前面介绍的 slapd-config
进行配置。
由于已经被弃用,所以此处我跳过。
文档: http://www.openldap.org/doc/admin24/slapdconfig.html
运行slapd
slapd
旨在作为独立服务运行。这允许服务器利用缓存,管理底层数据库的并发问题,并节省系统资源。
由于我使用RPM包进行安装,所以可利用 systemd
进行OpenLDAP的管理。
ldap默认监听地址:
URL | Protocol | Transport |
---|---|---|
ldap:/// |
LDAP | TCP port 389 |
ldaps:/// |
LDAP over SSL | TCP port 636 |
ldapi:/// |
LDAP | IPC (Unix-domain socket) |
slapd方式
|
|
systemd方式
|
|