无法将该对象添加到ldap服务器_LDAP 基础知识

4261f248b556eda1fac8de318cc60ff7.png

LDAP 基础知识

目录

简介

协议概览

目录结构

架构(Schema)

对象类(objectClass)

属性(Attribute)

条目(Entry)

LDAP 中的数据

常用命令

启动和关闭: start-ds / stop-ds

检查 LDAP 服务器状态: status

搜寻条目: ldapsearch

修改密码: ldappasswordmodify

列出 backends: list-backends

导出 LDIF 文件: export-ldif

导入 LDIF 文件: import-ldif

管理账户: manage-account

性能

LDAP 浏览器

参考文献

简介

LDAP 是 Lightweight Directory Access Protocol 的缩写,即 轻量目录访问协议。它基于 X.500 标准下更简单的子集标准开发,因此有时 LDAP 也被称之为 X.500-lite,即轻量级 x.500

目录服务在发展内部网络和因特网应用方面扮演着重要角色,它可以通过互联网分享用户、系统、网络、服务以及应用信息。

目录服务可以提供任何系统化的数据集,并以等级结构(hiearchical structure)呈现结果。比如,公司的邮件目录,或者包含地址和电话号码的电话目录。

LDAP 的一个常用功能是提供用户名和密码的集中存储。不同的应用和服务可以用其来认证用户。

协议概览

客户端发起 LDAP 会话连接到 LDAP 服务器。默认连接端口是 389(LDAP),或者 636(LDAPS)。客户端发起操作请求到服务器,服务器返回响应结果。客户端无需等待服务器响应即可发送下一个请求。服务器则会依次返回响应结果。

客户端可以发送如下操作请求:

• StartTLS - 使用 LDAPv3 TLS 扩展来请求安全连接

• Bind - 认证并指定 LDAP 协议版本

• Search - 搜索目录条目

• Compare - 测试命名条目是否包含指定的属性值

• Add a new entry - 添加一个条目

• Delete an entry - 删除一个条目

• Modify an entry - 修改一个条目

• Modify DN - 修改唯一识别名

• Extended Operation - 用于定义其他操作的通用操作

• Unbind - 关闭连接(注意,并非指 Bind 的逆向操作)

目录结构

在 LDAP 里, 一切都是等级化的,或者称之为层级化(hiearchical)。

一棵树有树干,树枝和树叶;树叶长在树枝上,树枝依附于树干。这就是一个简单的层级结构。LDAP 的结构同一棵树类似。假设 LDAP 里存储的是公司的信息,那么可以把公司(company)本身理解为树干,公司里面的各个部门,比如(group),理解为树干,把用户(user)理解为树叶。这样的结构称之为目录信息树(DIrectory Information Tree,DIT)。

ad73fef842b87f3a9c282ad95082be46.png

我们在目录信息树里创建一个条目(entry)时,条目的信息存储在属性(attribute)里,属性又被组合成对象类(objectClass),对象类进一步组成了架构(schema)。

下满我们来解释一下这几个重要的概念。

架构(Schema)

Schema 就是一个集合。所有的 objectClassattribute 都定义在 Schema 里。

• 每一个 attributeobjectClass,包括其父级 attributeobjectClass 都必须定义在一个 Schema 里,且该 Schema 必须能够被 LDAP 服务器识别。

• 定义在一个 Schema 里的 attribute 可以被另一个 Schema 里的 objectClass 使用。

d2f50a2b613e19c0aed6cfd9e021ace2.png

对象类(objectClass)

objectClassattribute 的集合。

objectClass 定义在 Shema 里。

objectClass 可以是下面的类型:

STRUCTURAL - 可以用于创建条目,即数据对象

AUXILIARY - 可以添加到任何条目

ABSTRACT - 不存在,抽象的。最常见的 ABSTRACT objectClasstop,表示每个 objectClass 层级的最高形式,用来结束一个层级。

objectClass 可以以层级的形式呈现,这里它可以继承来自父级的属性。也就是说,objectClass 可以是一个层级的一部分,这种情况下,objectClass 必须和它的父级 objectClass 保持同样的类型,即 STRUCTURAL 或者 AUXILIARY 类型。当父级是 top ABSTRACT 时无需遵守此规则,因为 top ABSTRACT 用结束任何层级结构。

• 一个 objectClass 可以有一个或多个父级的 objectClass

objectClass 是用来包含属性的方式。

objectClass 定义一个 attribute 是否是必须的(MUST)或者是可选的(MAY)。

objectClass 遵守 ASN.1 注释标准。

示例:下面是一个简单的 objectClass 定义

objectclass ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country'SUP top STRUCTURALMUST cMAY ( searchGuide $ description ) )

解释:

objectClass 是关键字,指明这是一个 objectClass 的定义

2.5.6.2 NAME 'country' 定义 objectClass 的全局唯一识别名。它由两部分组成:

NAME 'country' 为 objectClass 定义一个好理解的名字 country

2.5.6.2 定义全局唯一识别名,这种形式称之为 OID(ObjectIdentifier)。由哪个组织分配这个号码并不重要,但是必须是全局唯一的。通常推荐向 IANA申请一个 PEN (Private Enterprise Number)作为 OID 使用。

SUP 'top' 表示该 objectClass 有一个父级的 objectClass,也就是说它是一个层级的一部分。一个 objectClass 可以有一个或多个父级的 objectClass

STRUCTURAL 表示该 objectClass 包含属性且可以形成目录信息树(DIT)里的条目(entry)。一个条目里只能包含一个 STRUCTURAL objectClass。objectClass 也可以是 AUXILIARY,这说明它包含 attributes,可以和任何 STRUCTURAL objectClass一起使用构成一个条目,但是不可以单独构成一个条目

DESC 'a country' 为可选值,用来描述 objectClass

MUST c 表示 c 属性是必须的。这里的属性 c (c 或者 countryName)必须存在,否则 objectClass 实例无法创建成功。如果要指明多个属性是必须的,写法是 ( attr1 $ attr2 $ attrn)

MAY ( searchGuide $ description ) 表示 searchGuidedescription 是可选的,即创建 objectClass 时这两个属性不需要一定存在。

属性(Attribute)

attribute 定义在 Schema里。

• 一个 attribute 可以包含在一个或多个 objectClass 里。

• 一个 attribute 可以在包含它的 objectClass 里出现一次(SINGLE-VALUE)或多次(MULTI-VALUE)。默认为多次。

• 一个 attribute 可以是一个层级的一部分,此时它继承所有来自父级的属性。比如,commonName(cn),givenName(gn) 和 surname(sn)都是 name 属性的子类。

attribute 的定义包含它的类型(SYNTAX),比如,通过 matchingRules 定义字符串(string)或者数字(number)比较时是否大小写敏感。

attribute 定义遵守 ASN.1 注释标准

示例 1:下面是一个简单的 attribute 定义

attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' ) SUP name )

解释:

attributetype 说明这是一个关于 attribute 的定义

2.5.4.3 NAME ('cn' 'commonName') 定义一个全局唯一识别名。该识别名由两部分组成:

NAME ('cn' 'commonName') 定义一个可理解的名字 commonName 或者短别名 cn。原则上,短别名的个数没有限制。cn 排在第一位,它被称为主要名称(primary name)。这在为搜索优化做条目索引时非常重要。

2.5.4.3 定义全局唯一的 OID (ObjectIdentifier)。由哪个组织分配这个号码并不重要,但是必须是全局唯一的。通常推荐向 IANA申请一个 PEN (Private Enterprise Number)作为 OID 使用。

示例 2:

attributetype ( 2.5.4.41 NAME 'name'EQUALITY caseIgnoreMatchSUBSTR caseIgnoreSubstringsMatchSYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )

解释:

attributetype 同上。

2.5.4.41 NAME 'name' 同上。

EQUALITY caseIgnoreMatch 定义了该属性在搜索过滤(serach filter)中的行为。比如,(name=andy)。这里指定该属性在搜索中大小写不敏感。这里的 caseIgnoreSubstringMatch 就是一个 matchingRule

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} 是一个 OID,定义数据类型(data type)和要应用到数据的规则(data validation)。完整的定义可参考 RFC 2252 section 4.3.2。在本例中,OID 定义该属性为目录字符串(Directory String)类型(参考 RFC 2252 section 6.10)。 {32768} 定义字符串的最大长度,这是可选的。

条目(Entry)

目录信息树objectClass 的集合

entry 有且只能有一个 STRUCTURAL objectClass。一个 STRUCTURAL objectClass 可能有一个同为 STRUCTURAL 类型的父级。

entry 可以包含任意数目的 AUXILIARY objectClass

entry 可以有子 entry(child entry),父 entry(parent entry),同级 entry(sibling entry)

entry 有三种类型:

object entry - 最常见的一种,包含位于 objectClass 属性(attributes)里的用户数据

alias entry - 带有单一属性 aliasedObjectNameobjectClass 别名

subentry - 用于存储与父 entry 相关的管理或者操作数据

下图是关于 objectClass, attribute 以及 entry 的示意图:

ccafeef7d7902f9d69315f67b7152cd2.png

LDAP 中的数据

LDAP 中的数据以条目(entry)的形式呈现,就像英文字典里单词的条目。比如下面这个条目。它有很多属性,例如:uid:bjensen,mail:bjensen@example.com。查找条目时,只需要指定一个或者多个属性即可。

同时,该条目有一个唯一识别名称:dn: uid=bjensen,ou=People,dc=example,dc=com。DN 是 Distinguished Name 的缩合。在目录里没有两条相同的唯一识别名称。

dn: uid=bjensen,ou=People,dc=example,dc=com
uid: bjensen
cn: Babs Jensen
cn: Barbara Jensen
facsimileTelephoneNumber: +1 408 555 1992
gidNumber: 1000
givenName: Barbara
homeDirectory: /home/bjensen
l: San Francisco
mail: bjensen@example.com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
ou: People
ou: Product Development
roomNumber: 0209
sn: Jensen
telephoneNumber: +1 408 555 1862
uidNumber: 1076

常用命令

鉴于大多数的 LDAP 软件大同小异,这里的内容就以OpenDS/OpenDJ 为例。

启动和关闭: start-ds / stop-ds

• 语法: start-ds / stop-ds

• Windows:

– 打开命令窗口

– 浏览到到 bat

– 运行:

• 启动: start-ds

• 关闭: stop-ds

• *nix:

– 打开命令窗口

– 浏览到到 /bin

– 运行:

• 启动: ./start-ds

– 关闭: ./stop-ds

检查 LDAP 服务器状态: status

• 语法: status

• Windows:

– 打开命令窗口

– 浏览到到 bat

– 运行: status

• *nix:

– 打开命令窗口

– 浏览到到 /bin

• 运行: ./status

搜寻条目: ldapsearch

• 语法: ldapsearch ,其中: 为选项, 为过滤条件, 为显示的属性

• 示例: ldapsearch -p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc uid=demo ,其中:

– :-p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc

– : uid=demo

  dn: uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc
objectClass: organizationalPerson
objectClass: top
objectClass: person
objectClass: inetOrgPerson
uid: demo
mail: demouser
preferredLanguage: en-US
description: demo
sn: Demo
cn: Demo, Usero: Demo OrganizationuserPassword: {SSHA}IDSc3KN4Q1b2YSGfCBQiU4CXgBySg+AQsWkpEA==

• 我们可以使用更复杂的条件,比如 "(|(uid=demo)(mail=demouser))"ldapsearch -p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc "(|(uid=demo)(mail=demouser))"

修改密码: ldappasswordmodify

• 语法: ldappasswordmodify

• 示例: ldappasswordmodify -p 389 -h 192.168.93.128 -D cn=Manager -w ts -a uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc -n tsts ,其中:

– : -p 389 -h 192.168.93.128 -D cn=Manager -w ts -a uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc -n tsts

• 如果修改成功,则会输出: The LDAP password modify operation was successful

列出 backends: list-backends

• 语法: list-backends ,其中:

– -b, --baseDN {baseDN}

– -n, --backendID {backendName}

• 示例:list-backends

  Backend ID : Base DN
---------------:------------------
adminRoot : cn=admin data
ads-truststore : cn=ads-truststore
backup : cn=backups
config : cn=config
monitor : cn=monitor
schema : cn=schema
tasks : cn=tasks
userRoot : o=ptc

导出 LDIF 文件: export-ldif

• 语法: export-ldif

• 示例:

– 即刻导出文件: export-ldif --ldifFile /root/config.ldif --backendID config --hostName localhost --port 4444 --bindDN cn=Manager --bindPassword ts --trustAll

– 定时导出文件,比如,在 2017/03/09 11:25:00 导出文件: export-ldif --ldifFile "/root/20170309112500.ldif" --backendID userRoot --hostName "http://en2k8-wnc-x24.ptcts.com" --port 4444 --bindDN "cn=Manager" --bindPassword ts --trustAll --start "20170309112500"

– 定期导出文件,比如,每月的第一天,12:50 分导出文件: export-ldif --ldifFile "/root/50121.ldif" --backendID userRoot --hostName "http://en2k8-wnc-x24.ptcts.com" --port 4444 --bindDN "cn=Manager" --bindPassword ts --trustAll --recurringTask "50 12 1 * *"

导入 LDIF 文件: import-ldif

• 语法: import-ldif

• 示例: import-ldif --ldifFile "/root/export.ldif" --backendID "userRoot" --overwrite --hostName "http://en2k8-wnc-x24.ptcts.com" --port "4444" --bindDN "cn=Manager" "--bindPassword" ts --trustAll

管理账户: manage-account

• 显示账户的信息: manage-account -D "cn=manager" -w ts get-all --targetDN "uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"

  Password Policy DN: cn=Default Password Policy,cn=Password Policies,cn=config
Account Is Disabled: false
Account Expiration Time:
Seconds Until Account Expiration:
Password Changed Time: 20190607070745.945Z
Password Expiration Warned Time:
Seconds Until Password Expiration:
Seconds Until Password Expiration Warning:
Authentication Failure Times:
Seconds Until Authentication Failure Unlock:
Remaining Authentication Failure Count: 5
Last Login Time:
Seconds Until Idle Account Lockout:
Password Is Reset: false
Seconds Until Password Reset Lockout:
Grace Login Use Times:
Remaining Grace Login Count: 0
Password Changed by Required Time:
Seconds Until Required Change Time:
Password History:

• 显示用户状态信息: manage-account -D "cn=manager" -w ts get-account-is-disabled --targetDN "uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"

Account Is Disabled: false

• 禁用/启用账户

– 禁用账户:manage-account -h localhost -p 4444 -D "cn=Manager" -w ts -X set-account-is-disabled --operationValue true --targetDN "uid=kongwusun,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"

– 启用账户:manage-account -h localhost -p 4444 -D "cn=Manager" -w ts clear-account-is-disabled --targetDN "uid=kongwushun,ou=people,cn=AdministrativeLdap,cn=Windchill_10.0,o=ptc"

性能

可以快速查看 /logs:

BIND RES conn=5 op=2 msgID=23 result=0 authDN="uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc" etime=0

其中,etime 的值默认以毫秒(milliseconds)为单位,表示服务器处理请求的时间。过大的 etime 通常暗示服务器存在性能问题。

如果需要调整 LDAP 的 JVM运行参数,可以编辑 /config/java.properties, 然后使用 dsjavaproperties 命令使设置生效。具体示例可参考这里。

其他需要考虑的性能调优因素可以参考官方文档。

LDAP 浏览器

LDAP 浏览器可以连接到 LDAP 服务器,让我们可以方便的查看、搜索、编辑 LDAP 内容。JXplorer 就是这样一款免费的开源浏览器。当然,有很多其他的 LDAP 浏览器,大家可以自行下载尝试。

参考文献

1.

LDAP_百度百科​baike.baidu.com
4517596758a8a9a5890a0706ac250d48.png

2.

https://en.wikipedia.org/wiki/LightweightDirectoryAccess_Protocol​en.wikipedia.org

3.

LDAP for Rocket Scientists​www.zytrax.com

4.

OpenDJ 3.5 > Administration Guide​backstage.forgerock.com
2f3dc46121dcb99d5c29309856d42628.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows7系统损坏修复_【软件资讯】还在用win7?微软Windows 7系统正式停止技术支持...

本文转自IT之家,作者玄隐。早在2015年1月,微软结束了对Windows 7的主流支持,该公司停止向旧操作系统添加新功能。微软将Windows 7从主流支持转移到扩展支持。2020年1月14日,今天迎来了Windows 7的停止技术支持,微软将把…

Linux的实际操作:文件目录类的实用指令(cat more less)

1.cat 要查看的文件 (是以只读的方式打开,区别于vim可以查看文件并且编辑) cat -n 要查看的文件 (只读,且提供行号) cat -n 要查看的文件 | more (这个操…

电子测量与仪器第四版pdf_准确选择表面粗糙度仪的测量参数应该从哪些地方着手好【电子仪器吧】...

表面粗糙度仪的参数怎么选择?首先要先满足运用功能要求,其次再兼顾经济性能。即,在满足运用要求的前题下,尽可能下降外表粗糙度要求,放大表面粗糙度允许值。对多数外表面来说,给出高度特色评定参数即可反映…

Linux的实际操作:文件目录类的实用指令(重定向“>“和追加“>>“)

1. > 表示重定向 (重定向什么意思呢?就是把一个文件的内容,保存到指定的位置) > 是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空&#…

wrapper怎么用_用责任链模式设计拦截器

我在 Redant(https://github.com/all4you/redant) 中通过继承 ChannelHandler 实现了拦截器的功能,并且 pipeline 就是一种责任链模式的应用。但是我后面对原本的拦截器进行了重新设计,为什么这样做呢,因为原本的方式是在 ChannelHandler 的基…

VS2019 配色_这个双11,凯里-欧文陪你过!欧文6正式发布,城市版配色真的香

北京时间11月5日,在篮网主场对阵鹈鹕的比赛中,欧文一上场就让教主眼前一亮,这鞋骚的有点过分啊。欧文6代已经于北京时间11月5日正式发布,虽然首发配色毫无惊喜,毕竟早在休赛期就已经被曝得连底裤都不剩了,但…

Linux的实际操作:文件目录类的实用指令(echo head tail)

1.echo 输出内容到控制台 例子:实用echo指令输出环境变量,输出当前的环境变量路径 2.head 用于显示文件的开头部分内容,默认情况下head显示文件的前10行内容(因为有些文件比较大,我们有时候不全去看) 空格…

如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...

最近,听到李笑来说,讲解编程的过程中,举例子很重要。而且,我最近看的各种javaScript工具书中的例子,也都有点复杂。所以啊,我试着举一些简单又直观的例子,与各位苦学javaScript的同学&#xff0…

word2vector数据集样式_这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难...

2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现。以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数据呈现是静态的&#…

Linux的实际操作:文件目录类的实用指令(ln history)

1.ln 软连接也叫做符号链接,类似于windows的快捷方式,主要是存放了链接其它文件的路径 ln -s 原文件或者目录 软链接名 (功能:给原文件创建一个软链接) 案例:将/roo…

mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑

问题群友提问:MySQL这样删除重复数据为啥不成功呢?严小样儿:安排!咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单!# 大家想象中这样写是对的,其实…

搜狗手机浏览器_搜狗推广开户费多少钱?【搜狗开户代理商】

搜狗开户流程提供落地页审核提供服务器ip 安排解析账户预存款4000币上传关键词及素材开启广告上线福如海广告,搜狗开户代理商全国行业开户,有无资质均可手机:18705657032【同微信】搜狗广告详细介绍搜狗广告展现形式PC端-搜狗搜索推广当网民在…

understand 6.0_软件工程专业篇-vc++6.0安装教程(解决win10不兼容)

在进行安装教程之前还是和大家说几句废话啊。VC6.0就是出品的一款开发C的IDE。所谓IDE就是:为了方便程序员开发,集成了代码编辑器、编译器、链接器、调试器等工具的集成开发环境。 现在外面企业已经很少有使用VC6.0的了,毕竟已经是将近17年前…

Linux的实际操作:时间日期类的实用指令(date cal)

1.date 显示当前日期 (1)date 显示当前时间 (2) date %Y 显示年份 date%m 显示月份 date%d 显示日 date "%Y-%m-%d %H:%M:%S" 显示年月日时分秒 注意:加号不能少 双引号中间的连接可以取任意符号 &a…

Linux的实际操作:搜索查找类的实用指令(find locate grep 管道符|)

1.find 将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端 find 【搜索范围】 【选项】 文件 (搜索范围往往是绝对路径或者相对路径) 选项功能-name按照指定文件名查找文件-user查找属于指定用户名所有…

error:java:无效的源发行版_IDEA java出现无效的源发行版14解决方案_java

这篇文章主要介绍了IDEA java出现无效的源发行版14解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下问题描述问题原因出现该问题的原因是项目Project当中的jdk与电脑当中的jdk版本不一致造成的。解决方法…

为什么买入不了创业版_详解实战抄底——如何抄到下引线的最底端。及妖股的首板买入点...

11月26日上周四,如果方便的朋友可以打开下创业板当天的分时图,更加有利于理解。(下图所示)主板和创业板11月26日分时图当天创业板冲高回落开始探底,我在10点17分的时候提示准备抄底,在10点22分的时候,再次强调创业板跌…

Linux的实际操作:文件目录类实用指令(压缩gzip tar -zcvf和解压缩gunzip tar -zxvf)

1.gzip 用于压缩文件 (压缩文件后,原文件就会消失自动成为一个新的压缩文件,意思是压缩后不保留原文件) 2.gunzip 用于解压文件 (解压缩后,压缩文件也会自动生成一个未解压文件&…

keil+proteus 制作计算器_设计费 | 工程设计费计算器使用指南

工程设计费,即工程设计收费,是设计人根据发包人的委托,提供编制建设项目初步设计文件、施工图设计文件、非标准设备设计文件、施工图预算文件、竣工图文件等服务所收取的费用。工程设计收费标准2002年国家发展计划委员会和建设部发布了计价格…

解决:Xshell如何修改默认的登录用户,自动跳转到密码界面

1.打开Xshell会话,选择远程主机号,点击“打开会话文件夹” 2.右键,用记事本打开 3.打开后CtrlF搜索UserName 4.将参数改为空的即可