简介
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 "administrator@xx.com" -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 其它