简介

OpenLDAP是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的缩写, OpenLDAP的开源并已经被包含在众多流行的Linux发行版中。

LDAP 其实是一种目录服务, 类似于我们在文件系统中所使用的目录, 类似于我们查询电话号码使用的电话号码簿, 也类似于你在花园中所看到的树木。一句话:数据集中存放,方便使用和管理

LDAP目录树

目录服务是一种在分布式环境中发现目标的方法。目录具有两个主要组成部分:

  • 第一部分是数据库,数据库是分布式的,且拥有一个描述数据的规划。

  • 第二部分则是访问和处理数据的各种协议。

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

      LDAP中,将数据组织成一个树形结构,这与现实生活中的很多数据结构可以对应起来,而不像设计关系型数据库的表,需要进行多种变化。例如,图1-1所示就是一个树形结构的数据。

名称解释

  • dn: Distinguished Name (一条记录的位置)基准DN

  • cn: Common Name(一条记录的名字)

  • ou: Organization Unit(一条记录的组织)

  • dc: domain component(一条记录的区域)

  • sn: surname姓

  • givenname: GivenName名

  • uid: User ID

  • o: (organizationName)组织名

  • c: 国家

  • mail: 电子信箱地址

ldif (LDAP Interchange Format)

objectclass:LDAP server要想启动必须能够识别每个对象的 Attribute

LDAP 中,一条记录必须包含一个 objectclass 属性,且其需要赋予至少一个值。每

一个值将用作一条 LDAP 记录进行数据存储的模板;模板中包含了一条记录中数个必须

被赋值的属性和一系列可选的是属性。

objectclass 有严格的等级之分,最顶层的类是 top 和 alias。

objectclass 分三大类:结构型的(person 和 organizaionUnit)

辅助型的(extensibeobject)

抽象型的 (这类不直接使用)

objectclass: person

objectclass: organizationalPerson

objectclass: inetOrgPerson

objectclass: fff

可以为任何一个对象根据需要分配多个对象类型。

person 对象类型要求 cn(common name)和sn(surname)这两个域不能为空。

persion 对象类型允许有其它的可选域,包括givenname、telephonenumber,等等。

organizationalPerson给person 加入更多的可选域

inetOrgPerson 又加入更多的可选域(包括电子邮件信息)。

fff 是为定制的对象类型,加入了很多定制的属性。

LDIF文件

对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:

提示:每个结点可用一个dn表示,对于每个结点,又可继续添加新的结点。如在根结点中可添加其他部门ou,在ou=managers结点也可继续添加其他管理人员的信息。

ccxx.ldif

# root node

dn: dc=ccxx,dc=com

dc: ccxx

objectClass: dcObject

objectClass: organizationalUnit

ou: ccxx Dot com

LDAP协议

LDAP是一个目录服务协议,目前存在众多版本的LDAP,而最常见的则是V2和V3两个版本,它们分别于1995年和1997年首次发布。

LDAP协议的特点

  • LDAP是一种目录服务,保存在特殊的数据库中,数据的读取速度远高于写入速度。

  • LDAP对查询做了优化,读取速度优于普通关系数据库。

  • LDAP不支持事务、不能进行回滚,需要进行这些操作的应用只有选择关系数据库。

  • LDAP采用服务器/客户端模式,支持分布式结构。

  • LDAP中的条目以树形结构组织和存储。

  • LDAP基于Internet协议,直接运行在简单和通用的TCP/IP或其他可靠的传输协议层上,使连接的建立和包的处理简单、快捷,对于互联网和企业网应用都很方便。

  • LDAP协议简单,通过使用查找操作实现列表操作和读操作。

  • LDAP通过引用机制实现分布式访问,通过客户端API实现分布式操作(对于应用透明),平衡了负载。

  • LDAP实现具有低费用、易配置和易管理的特点,并提供了满足应用程序对目录服务所需求的特性。

安装环境

硬件要求

  • 标准配置:

CPU: 8核心2.0GHz

内存: 16GB

硬盘: 100GB

网卡: 2*1000Mbps

  • 最低配置:

CPU: 4核心2.0GHz

内存: 4GB

硬盘: 50GB

网卡: 100Mbps

系统要求

Linux

  • CentOS 6.9

  • CentOS 7.4

网络要求

  • 准备一个块网卡

  • 公网:支持路由器NAT模式和路由模式

OpenLDAP 安装

服务端的安装

  • yum安装OpenLDAP

# yum install -y openldap openldap-clients openldap-servers migrationtools

  • centos7.4安装的rpm包

# rpm -qa |grep openldap

openldap-devel-2.4.44-15.el7_5.x86_64

openldap-clients-2.4.44-15.el7_5.x86_64

openldap-2.4.44-15.el7_5.x86_64

openldap-servers-2.4.44-15.el7_5.x86_64

compat-openldap-2.3.43-5.el7.x86_64

openldap-servers-sql-2.4.44-15.el7_5.x86_64

  • 查看OpenLDAP版本,使用如下命令:slapd -V

配置OpenLDAP

官方不推荐使用 slapd.conf 作为配置文件

【有两种配置方法:1、通过slapd.conf(centos6),2、通过hdb文件(centos7)】

注意:从OpenLDAP2.4.23版本开始所有配置数据都保存在/etc/openldap/slapd.d/中,建议不再使用slapd.conf作为配置文件。

  • OpenLDAP的管理员密码:

# slappasswd -s 123456

  • 修改olcDatabase={2}hdb.ldif文件

  • 修改olcDatabase={1}monitor.ldif文件

  • 验证OpenLDAP的基本配置,使用如下命令:# slaptest -u

服务启动

  • Centos6.9.下启动OpenLDAP

# service slapd start

  • Centos7.4下启动OpenLDAP

# systemctl enable slapd

# systemctl start slapd

OpenLDAP数据库

配置OpenLDAP数据库,使用如下命令:

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

# chown ldap:ldap -R /var/lib/ldap

# chmod 700 -R /var/lib/ldap

注意:OpenLDAP默认使用的数据库是BerkeleyDB,/var/lib/ldap/就是BerkeleyDB数据库默认存储的路径

  • 导入基本 Schema(可以有选择的导入)

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

  • 导入OpenLDAP数据库

# ldapadd -x -D "cn=Manager,dc=ccxx,dc=com" -W -f /tmp/ccxx.ldif导入基础数据库

# ldapadd -x -D "cn=Manager,dc=ccxx,dc=com" -W -f /tmp/my.ldif导入用户到数据库

LDAP常用命令

  • ldapadd 

-x   进行简单认证

-D   用来绑定服务器的DN

-h   目录服务的地址

-w   绑定DN的密码

-f   使用ldif文件进行条目添加的文件

ldapadd -x -D "cn=root,dc=ccxx,dc=com" -w secret -f /root/test.ldif ldapadd -x -D "cn=root,dc=ccxx,dc=com" -w secret (这样写就是在命令行添加条目)

  • ldapsearch

-x   进行简单认证

-D   用来绑定服务器的DN

-w   绑定DN的密码

-b   指定要查询的根节点

-H   制定要查询的服务器

#linux 查询方法

# ldapsearch -LLL -w syswin -x -H ldap://192.168.18.250 -D "cn=admin,dc=dev,dc=com" -b "dc=dev,dc=com" "(uid=user1)"

#windows 查询方法

# ldapsearch -LLL -x -h 172.28.4.103 -D "[email protected]" -W -b "dc=ccxx,dc=com" "*"

  • ldapdelete 

ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w secret "uid=test1,ou=People,dc=test,dc=com" 

  • ldappasswd 

-x   进行简单认证

-D   用来绑定服务器的DN

-w   绑定DN的密码

-S   提示的输入密码

-s pass 把密码设置为pass

-a pass 设置old passwd为pass

-A   提示的设置old passwd

-H   是指要绑定的服务器

-I   使用sasl会话方式

# ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S

  • ldapmodify

-a 添加新的条目.缺省的是修改存在的条目

-x 使用简单认证

-D binddn指定搜索的用户名(一般为一dn 值)

-W 该参数,提示入用户的密码

-H ldapuri 指定连接到服务器uri(ip 地址和端口号,常见格式为

   ldap://hostname:port).如果使用了-H 就不能使用-h 和-p 参数

-h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用

-p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用

# ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif   

LDAP常见错误码

LDAP常见错误码

LDAP_SUCCESS = 0 成功

LDAP_OPERATIONS_ERROR = 1 操作错误

LDAP_PROTOCOL_ERROR = 2 协议错误

LDAP_TIME_LIMIT_EXCEEDED = 3 超过最大时间限制

LDAP_SIZE_LIMIT_EXCEEDED = 4 超过最大返回条目数

LDAP_COMPARE_FALSE = 5 比较不匹配

LDAP_COMPARE_TRUE = 6 比较匹配

LDAP_AUTH_METHOD_NOT_SUPPORTED = 7 认证方法未被支持

LDAP_STRONG_AUTH_REQUIRED = 8 需要强认证

LDAP_PARTIAL_RESULTS = 9 null

LDAP_REFERRAL = 10 Referral

LDAP_ADMIN_LIMIT_EXCEEDED = 11 超出管理员权限

LDAP_UNAVAILABLE_CRITICAL_EXTENSION = 12 Critical扩展无效

LDAP_CONFIDENTIALITY_REQUIRED = 13 需要Confidentiality

LDAP_SASL_BIND_IN_PROGRESS = 14 需要SASL绑定

LDAP_NO_SUCH_ATTRIBUTE = 16 未找到该属性

LDAP_UNDEFINED_ATTRIBUTE_TYPE = 17 未定义的属性类型

LDAP_INAPPROPRIATE_MATCHING = 18 不适当的匹配

LDAP_CONSTRAINT_VIOLATION = 19 约束冲突

LDAP_ATTRIBUTE_OR_value_EXISTS = 20 属性或值已存在

LDAP_INVALID_ATTRIBUTE_SYNTAX = 21 无效的属性语法

LDAP_NO_SUCH_OBJECT = 32 未找到该对象

LDAP_ALIAS_PROBLEM = 33 别名有问题

LDAP_INVALID_DN_SYNTAX = 34 无效的DN语法

LDAP_IS_LEAF = 35 null

LDAP_ALIAS_DEREFERENCING_PROBLEM = 36 Dereference别名有问题

LDAP_INAPPROPRIATE_AUTHENTICATION = 48 不适当的认证

LDAP_INVALID_CREDENTIALS = 49 无效的Credential

LDAP_INSUFFICIENT_ACCESS_RIGHTS = 50 访问权限不够

LDAP_BUSY = 51 遇忙

LDAP_UNAVAILABLE = 52 无效

LDAP_UNWILLING_TO_PERform = 53 意外问题

LDAP_LOOP_DETECT = 54 发现死循环

LDAP_NAMING_VIOLATION = 64 命名冲突

LDAP_OBJECT_CLASS_VIOLATION = 65 对象类冲突

LDAP_NOT_ALLOWED_ON_NON_LEAF = 66 不允许在非叶结点执行此操作

LDAP_NOT_ALLOWED_ON_RDN = 67 不允许对RDN执行此操作

LDAP_ENTRY_ALREADY_EXISTS = 68 Entry已存在

LDAP_OBJECT_CLASS_MODS_PROHIBITED = 69 禁止更改对象类

LDAP_AFFECTS_MULTIPLE_DSAS = 71 null

LDAP_OTHER = 80 其它