无法将该对象添加到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 就是一个集合。所有的 objectClass 和 attribute 都定义在 Schema 里。

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

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

d2f50a2b613e19c0aed6cfd9e021ace2.png

对象类(objectClass)

• objectClass 是 attribute 的集合。

• objectClass 定义在 Shema 里。

• objectClass 可以是下面的类型:

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

– AUXILIARY - 可以添加到任何条目

– ABSTRACT - 不存在,抽象的。最常见的 ABSTRACT objectClass 是 top,表示每个 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 ) 表示 searchGuide 和 description 是可选的,即创建 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 - 带有单一属性 aliasedObjectName 的 objectClass 别名

– 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.tpcf.cn/news/501270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 (这个操…

python中pickle模块_Python pickle模块的用法

串行化主要用于网络传输或者持久化。我们知道,网络上的数据都是字节流,如果希望将某个对象传送给远端的机器,首先就必须将其转换成字节流,然后才可以在网络上传输。文件也是字节流,如果希望将某个对象保存到文件中&…

电子测量与仪器第四版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端-搜狗搜索推广当网民在…

Linux命令终端提示符显示-bash-4.2#解决方法【转载】

昨天在配置linux,突然发现root登录的CRT的终端提示符显示的是-bash-4.2# 而不是root主机名 路径的显示方式。搞了半天也不知道为什么出现这种情况。今天终于搞定这个问题, 原因是root在/root下面的几个配置文件丢失,丢失文件如下&#xff1a…

python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼严格意思上的说,Python其实是一个脚本语言,编程语言多种多样,但是却有开源和闭源之分,Python就是一种开放核心源代码编程语言,其开发代码的效率非常高,代码编写…

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…

python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式

我将如何格式化下面的饼图子图,以便在图标题和子图标题之间有更多的空白区域.理想情况下,子图标题也会更接近实际的饼图本身.我似乎无法在文档中找到任何可能启用此功能的内容,但我是matplotlib的新手.import matplotlib.pyplot as pltimport pandas as pdfrom pandas import D…

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

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

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

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