Sun Directory Server/LDAP学习笔记(一)——LDAP协议简述
3.从协议衍化上阐述LDAP,它是“目录访问协议DAP——ISO X.500”的衍生,简化了DAP协议,提供了轻量级的基于TCP/IP协议的网络访问,降低了管理维护成本,但保持了强壮且易于扩充的信息框架。LDAP的应用程序可以很轻松的新增、修改、查询和删除目录内容信息。?
LDAP目录条目—irectory Entry)简述?
从Object Classes谈起?
在LDAP目录数据库中,所有的条目都必须定义objectClass这个属性。这有点像Java语言里说阐述的“一切皆对象”的理念,每个条目(LDAP Entry)都要定义自己的Object Classes。Object Class可以看作是LDAP Entry的模板,它定义了条目的属性集,包括必有属性(requited attribute)和可选属性(option attribute)。这里要着重指出的是,在LDAP的Entry中是不能像关系数据库的表那样随意添加属性字段的,一个Entry的属性是由它所继承的所有Object Classes的属性集合决定的,此外可以包括LDAP中规定的“操作属性”(操作属性是一种独立于Object Class而存在的属性,它可以赋给目录中的任意条目)。如果你想添加的属性不在Object Classes定义属性的范畴,也不是LDAP规定的操作属性,那么是不能直接绑定(在LDAP中,给Entry赋予属性的过程称为绑定)到条目上的,你必须自定义一个含有你需要的属性的Object Class,而后将此类型赋给条目。?
Object Class是可以被继承的,这使它看上去真的很像Java语言中的POJO对象。继承类的对象实例也必须实现父?
类规定的必有属性(requited attribute),同时拥有父类规定的可选属性(option attribute)。继承类可以扩展父类的必有属性和可选属性。由于Object Class的继承特性,因此在一个LDAP Entry上,objectClass属性是一个多值属性,它涵盖了Object Class的完整继承树,如用户条目uid=Linly , ou=People, dc=jsoso , dc=net,它直接实现了inetorgperson这个对象类,那么它的objectClass属性值为inetorgperson,organizationalPerson,person,top。?
从Object Classes到Directory Server Schema?
上一章节中,我们了解了LDAP条目都要遵守的一个最重要的规定Object Classes,而实际上,对Entry更多更细的规范被涵盖在了Directory Server Schema(目录服务模式)中。Directory Schema声明了完整的LDAP数据的存储规范,这包括数据的字节大小、数值范围和格式定义。?
默认的,在一个LDAP服务器上,都定义有一套标准的Schema和一套为服务器功能定制的Schema。用户在需要的时候,是可以定制自己的LDAP属性和Object Class,以扩展标准Schema的功能。在Sun Directory Server中,使用了标准LDAPv3 Schema,并在此基础上做了轻微的扩展。?
在Schema中的标准属性(Standard Attributes)是一个键-值对,如:cn:linly ,属性ID(属性名)为cn,属性值为linly 。事实上,一个完整的条目就是由一系列的键-值对组成的。以下是一个完整的LDAP Entry:?
?
?Definition Entry:cn=PointerCoS , dc=example , dc= com定义了CoS的共享属性cosAttribute:postalCode,同时定义了CoS的模板DN cosTemplateDN:cn=cosTemplateForPostalCode,cn=data。?
?Template Entry: 它是CoS的模板,定义了共享属性值 postalCode:45773。?
?Target Entry:它是目标条目,因为它位于dc=example , dc=com的子树下。所以它获得了共享属性postalCode:45773。?
间接服务类(Indirect CoS),?
在使用间接服务类时,在Definition Entry条目中定义了CoS的共享属性cosAttribut和一个用来间接指向模板的属性cosIndirectSpecifier。?
首先,我们需要用cosIndirectSpecifier的值A作为属性名,来检索CoS父节点子树中所有拥有A属性的条目,作为目标条目Target Entry。?
其次,根据找到的Target Entry条目中A属性的值来定位模板对象。?
最后,再分别根据找到的模板对象中拥有的共享属性值赋给对应的Target Entry。?
例如,定义如下Definition Entry
?
filter布尔运算符?

搜索过滤器示例?
- 下列过滤器将搜索包含一个或多个 manager 属性值的条目。这也称为存在搜索:manager=*
- 下列过滤器将搜索包含通用名 Ray Kultgen 的条目。这也称为等价搜索:cn=Ray Kultgen
- 下列过滤器返回所有不包含通用名 Ray Kultgen 的条目:(!(cn=Ray Kultgen))
- 下列过滤器返回的所有条目中都有包含子字符串 X.500 的说明属性:description=*X.500*
- 下列过滤器返回所有组织单元为 Marketing 且说明字段中不包含子字符串 X.500 的条目:(&(ou=Marketing)(!(description=*X.500*)))
- 下列过滤器返回所有组织单元为 Marketing 且 manager 为 Julie Fulmer 或 Cindy Zwaska 的条目:(&(ou=Marketing)(|(manager=cn=Julie Fulmer,ou=Marketing,dc=siroe,dc=com)(manager=cn=Cindy Zwaska,ou=Marketing,dc=siroe,dc=com)))
- 下列过滤器返回所有不代表人员的条目:(!(objectClass=person))
- 下列过滤器返回所有不代表人员且通用名近似于 printer3b 的条目:(&(!(objectClass=person))(cn~=printer3b))
ldapsearch指令参数-b 搜索的起始上下文?- -D 绑定搜索的账号Distinguished Name
- -h 主机名。地址
- -p LDAP服务端口
- -l 搜索的最大耗时
- -s 从上下文开始的搜索范围,有三个常量base(表示仅当前根对象)/one(当前根对象及下一级)/sub(当前根对象的全部子树)
- -W 绑定账号密码
- -z 返回结果的最大数量
搜索“操作属性”?
在LDAP搜索中,操作属性在默认情况下是不会跟随搜索结果返回的。必须在搜索中明确显示的指定操作属性,如:?
搜索“操作对象类”的条目?
在LDAP中Role、CoS等对象被定义为特殊的Object Class——操作对象类(operational object class),在一般的搜索中,这类对象是不会作为结果返回给用户的。要想查找这些对象,必须在filter中显式定义要找这个对象类。例如:(objectclass=ldapsubentry)。?
ACI权限控制?
ACI(Access Control Instruction)访问控制指令是LDAP 服务中用以控制用户访问权限的有力手段。在目录的Entry中,aci属性记录了对该条目的多条访问控制指令。(aci属性是一个多值操作属性,可以赋予任意的LDAP条目)?
ACI的语法格式如下:aci: (target)(version 3.0;acl "name";permission bind_rules;)?
?target?指定了ACI要控制访问的目标属性(集合)或条目(集合)。target可以用DN,一个或多个属性,或者一个filter来定义。它是一个可选项。?
target语法是:关键字 <op> 表达式?
target关键字表??
(更多详细的target用法,请参阅 Sun ONE Directory Server 5.2 Administration Guide )?
version 3.0?这是一个必须的常量字窜,用以识别ACI的版本。?
name?指定ACI的名称,可以使任意的字窜,只要区别于同一个条目aci属性下的其他ACI,这是一个必须属性。?
permission?指定权限许可。?
权限包括:read、write、add、delete、search、compare、selfwrite、 proxy 或 all,其中all表示出了proxy之外的所有操作。?
权限语法:allow | deny (权限)?
bind_rules?绑定规则。绑定规则定义了何人、何时,以及从何处可以访问目录。绑定规则可以是如下规则之一:?- ? 被授予访问权限的用户、组以及角色
- ? 实体必须从中绑定的位置
- ? 绑定必须发生的时间或日期
- ? 绑定期间必须使用的验证类型
绑定规则语法:keyword? = 或者 != "expression"; (注:timeofday 关键字也支持不等式<、<=、>、>=)。?
LDIF 绑定规则关键字表??
(更多详细的绑定规则用法,请参阅 Sun ONE Directory Server 5.2 Administration Guide )?
ACI样例?- 1.用户 bjensen 具有修改其自己的目录条目中所有属性的权限。aci:(target="ldap:///uid=bjensen,dc=example,dc=com")(targetattr=*)(version 3.0; acl "aci1"; allow (write) userdn="ldap:///self";)
- 2.允许 Engineering Admins 组的成员修改 Engineering 业务类别中所有条目的 departmentNumber 和 manager 属性aci:(targetattr="departmentNumber || manager")(targetfilter="(businessCategory=Engineering)") (version 3.0; acl "eng-admins-write"; allow (write) groupdn ="ldap:///cn=Engineering Admins, dc=example,dc=com";)
- 3.允许匿名用户对o=NetscapeRoot下的条目读取和搜索aci:(targetattr="*")(targetfilter=(o=NetscapeRoot))(version 3.0; acl "Default anonymous access"; allow (read, search) userdn="ldap:///anyone";)
- 4.向所有经过验证的用户授予对整个树的读取访问,可以在dc=example,dc=com 节点创建下列 ACI:aci:(version 3.0; acl "all-read"; allow (read)userdn="ldap:///all";)
- 5.允许对整个 example.com 树进行匿名读取和搜索访问,可以在dc=example,dc=com 节点创建下列 ACI:aci:(version 3.0; acl "anonymous-read-search";allow (read, search) userdn = "ldap:///anyone";)
- 授予Administrators 组对整个目录树写入的权限,则可以在 dc=example,dc=com 节点创建下列 ACI:aci:(version 3.0; acl "Administrators-write"; allow (write) groupdn="ldap:///cn=Administrators,dc=example,dc=com";)?
?