模式说明
本章描述了如何扩展slapd(8)使用的用户模式。第1个部分,“已发布的模式文件”,详细说明了软件发布版本中提供的可选的模式定义,以及从何处获取其他的定义。第2个部分,“扩展模式”,说明了如何定义新的模式项目。
1、 已发布的模式文件
OpenLDAP岁软件发布了一组模式定义,您可以直接使用它们。每一组模式定义为可以被包含到您的slapd.conf(5)中的文件。(可以使用include指令)这些模式文件在正常情况下安装在/usr/local/etc/openldap/schema目录下。
Table 8.1: Provided Schema Specifications | |
File | Description |
core.schema | OpenLDAP core (required) |
cosine.schema | Cosine and Internet X.500 (useful) |
inetorgperson.schema | InetOrgPerson (useful) |
misc.schema | Assorted (experimental) |
nis.schema | Network Information Services (FYI) |
openldap.schema | OpenLDAP Project (experimental) |
要使用其中的任何模式文件,只需要在您的slapd.conf(5)文件中的全局定义部分包含需要的文件。比如:
# include schema
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
其他的文件也可以获得。请参考OpenLDAP FAQ(http://www.openldap.org/faq/)。
2、 扩展模式
slapd(8)中使用的模式可以被扩展为支持其他的语法,匹配规则,属性类型和对象类。本章详细说明了如何使用slapd已经支持的语法和匹配规则来增加用户应用属性类型和对象属性类型。slapd也可以被扩展为支持其他的语法,匹配规则和系统模式,但是,这需要某种程度的编程,因此,在此处不予讨论。
下面是定义一个新的模式的5个步骤:
¢ 获得对象标识;
¢ 选择一个名称前缀;
¢ 创建本地模式文件;
¢ 定义自定义属性类型;(如果必须)
¢ 定义自定义对象类。
2.1、 对象标识
每一个模式元素由一个全局唯一对象标识符(OID)标识。OID同时被用来标识其他的对象。他们通常可以在ASN.1描述的协议中找到。特别是,它们在简单网络管理协议(SNMP)中被广泛使用。因为OID是层次的,您的组织可以获得一个OID,并且在需要的时候对其进行分支扩展。比如,如果您的组织被赋予一个OID1.1,您可以按照如下所示的方法扩展树:
Table 8.2: Example OID hierarchy | |
OID | Assignment |
1.1 | Organization's OID |
1.1.1 | SNMP Elements |
1.1.2 | LDAP Elements |
1.1.2.1 | AttributeTypes |
1.1.2.1.1 | myAttribute |
1.1.2.2 | ObjectClasses |
1.1.2.2.1 | myObjectClass |
您当然可以在您的组织的OID下面自由的根据组织的需要设计您的层次结构。无论您选择了怎样的层次,您应该保持一份分配注册表。这可以是一个简单的平面文件或者是一个更加复杂的东西,比如,OpenLDAP OID Registry(http://www.openldap.org/faq/index.cgi?file=197)。
有关对象标识符(和一个服务列表)的更多信息,请参阅:
http://www.alvestrand.no/harald/objectid/。
任何情况下,您都不应该使用一个伪造的OID!
为了免费得到一个注册过的OID,在Internet Assigned Numbers Authority维护的Private Enterprise arch下申请一个OID。任何私人企业或者组织可以申请一个在此arch下的OID。只需要填写一个位于http://www.iana.org/cgi-bin/enterprise.pl的IANA表单就可以了。您的合法OID将在几天内发送给您。您的基ID将是类似于1.3.6.1.4.1.X,其中X是一个整数。
注意:不要让IANA页面上的“MIB/SNMP”声明混淆您的视线。从这个表单中申请的OID可以用于任何用途,包括标识LDAP模式元素。
2.2、 名称前缀
除了给每一个模式元素分配一个唯一的对象标识符,您应该给每一个模式元素提供一个文本名称。该名称应该是既有描述性,又不会和其他的模式名称冲突。特别的,任何您选择的名称都不应该和已经有的或者是将要使用的标准名称冲突。
为了减少(但不是消除)潜在的名称冲突,一个简便的方法是在非标准名称前增加几个字母的前缀,来将组织的改变本地化。组织名称越短,就应该提供越长的前缀。
在下面的示例中,我们选择了一个很短的前缀“my”来减少空间。在一个大型的,全球性的组织中,使用这样短的前缀是不合适的。对于一个小的,本地的公司,我们推荐象“deFirm”(德国公司)或者“comExample”(和example.com关联的组织的元素)。
2.3、 本地模式文件
配置文件指令中的objectClass和attibuteTypes可以被用来定义目录中的模式规则。习惯上创建一个文件来包含对于定制的模式元素的定义。我们推荐您在目录/usr/local/etc/openldap/schema/local.schema中创建一个local.schema文件,然后,在您的slapd.conf(5)文件中的其他模式包含指令之后包含该文件。
# include schema
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
# include local schema
include /usr/local/etc/openldap/schema/local.schema
2.4、 属性类型说明
指令attributetype被用来定义一个新的属性类型。该指令和在子模式子树中的attributeTypes属性使用相同的属性类型描述(如RFC2252所定义)。比如:
attributetype <RFC2252 Attribute Type Description>
其中,Attribute Type Description按照如下BNF定义:
AttributeTypeDescription = "(" whsp
numericoid whsp ; AttributeType identifier
[ "NAME" qdescrs ] ; name used in AttributeType
[ "DESC" qdstring ] ; description
[ "OBSOLETE" whsp ]
[ "SUP" woid ] ; derived from this other
; AttributeType
[ "EQUALITY" woid ; Matching Rule name
[ "ORDERING" woid ; Matching Rule name
[ "SUBSTR" woid ] ; Matching Rule name
[ "SYNTAX" whsp noidlen whsp ] ; Syntax OID
[ "SINGLE-VALUE" whsp ] ; default multi-valued
[ "COLLECTIVE" whsp ] ; default not collective
[ "NO-USER-MODIFICATION" whsp ]; default user modifiable
[ "USAGE" whsp AttributeUsage ]; default userApplications
whsp ")"
AttributeUsage =
"userApplications" /
"directoryOperation" /
"distributedOperation" / ; DSA-shared
"dSAOperation" ; DSA-specific, value depends on server
其中,whsp是一个空格,numericoid是一个全局唯一的点分十进制格式的OID(例如:1.1.0),qdescrs是一个或者多个名称,woid或者是OID的名称,或者是OID后面加上可选的长度说明(比如:{10})。
例如,属性类型name和cn在core.schema中如下定义:
attributeType ( 2.5.4.41 NAME 'name'
DESC 'name(s) associated with the object'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
attributeType ( 2.5.4.3 NAME ( 'cn' $ 'commonName' )
DESC 'common name(s) assciated with the object'
SUP name )
请注意,每一个都定义了属性的OID,给出了一个短的名称,以及一个简短的描述。每一个名称都是OID的一个别名。Slapd(8)在返回结果的时候,将返回第1个列出的名称。
第1个名称,name,保存了directoryString(UTF-8编码的Unicode)语法。该语法由OID说明。(1.3.6.1.4.1.1466.115.121.1.15标识了目录字符串语法)。还说明了一个推荐长度为32768的选项。服务器应该支持该长度的值,但是,也可以支持更长的值。该域没有指明长度限制,因此,在服务器上被忽略,并且服务器不会限制其大小。另外,相等和子串匹配使用不区分大小写的规则。下面是经常使用的语法和匹配规则(OpenLDAP支持这些,以及更多)
Table 8.3: Commonly Used Syntaxes | ||
Name | OID | Description |
boolean | 1.3.6.1.4.1.1466.115.121.1.7 | boolean value |
distinguishedName | 1.3.6.1.4.1.1466.115.121.1.12 | DN |
directoryString | 1.3.6.1.4.1.1466.115.121.1.15 | UTF-8 string |
IA5String | 1.3.6.1.4.1.1466.115.121.1.26 | ASCII string |
Integer | 1.3.6.1.4.1.1466.115.121.1.27 | integer |
Name and Optional UID | 1.3.6.1.4.1.1466.115.121.1.34 | DN plus UID |
Numeric String | 1.3.6.1.4.1.1466.115.121.1.36 | numeric string |
OID | 1.3.6.1.4.1.1466.115.121.1.38 | object identifier |
Octet String | 1.3.6.1.4.1.1466.115.121.1.40 | arbitary octets |
Printable String | 1.3.6.1.4.1.1466.115.121.1.44 | printable string |
Table 8.4: Commonly Used Matching Rules | ||
Name | Type | Description |
booleanMatch | equality | boolean |
octetStringMatch | equality | octet string |
objectIdentiferMatch | equality | OID |
distinguishedNameMatch | equality | DN |
uniqueMemberMatch | equality | Name with optional UID |
numericStringMatch | equality | numerical |
numericStringOrderingMatch | ordering | numerical |
numericStringSubstringsMatch | substrings | numerical |
caseIgnoreMatch | equality | case insensitive, space insensitive |
caseIgnoreOrderingMatch | ordering | case insensitive, space insensitive |
caseIgnoreSubstringsMatch | substrings | case insensitive, space insensitive |
caseExactMatch | equality | case sensitive, space insensitive |
caseExactOrderingMatch | ordering | case sensitive, space insensitive |
caseExactSubstringsMatch | substrings | case sensitive, space insensitive |
caseIgnoreIA5Match | equality | case insensitive, space insensitive |
caseIgnoreIA5OrderingMatch | ordering | case insensitive, space insensitive |
caseIgnoreIA5SubstringsMatch | substrings | case insensitive, space insensitive |
caseExactIA5Match | equality | case sensitive, space insensitive |
caseExactIA5OrderingMatch | ordering | case sensitive, space insensitive |
caseExactIA5SubstringsMatch | substrings | case sensitive, space insensitive |
第2个属性,cn,是name的一个子类型,因此,它继承了语法,匹配规则,并且使用name.commonName作为别名。
两个属性都没有限制到单一值。都可以被用户应用程序所使用,都不存在过期,都不是集合。
下面的部分给出了几个示例。
2.4.1、 myUniqueName
许多组织为每个用户维护了一个单一的唯一名称。虽然可以使用displayName(RFC2798),该属性实际上意味着让用户控制,而不是被组织控制。我们可以简单的从inetorgperson.schema中拷贝displayName的定义,然后替换掉OID,name,以及description。比如:
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
但是,如果我们需要该名字被包含在name声明中[比如,(name=*Jane*)],该属性可以被定义为name的一个子类型。比如:
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
SUP name )
2.4.2、 myPhoto
许多组织包含了每一个用户的照片。可以定义一个myPhoto属性类型来保存照片。当然,可以使用jpegPhoto(RFC2798)或者其子类型来保存照片。但是,只有在照片是JPEG格式的情况下才能这样做。作为一种替代方法,可以定义一个使用Octet String语法的属性类型。比如:
attributetype ( 1.1.2.1.2 NAME 'myPhoto'
DESC 'a photo (application defined format)'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
SINGLE-VALUE )
这样,该语法没有指明照片的格式。它假设(可能不正确)所有访问该属性的应用统一处理该值。
如果需要支持多种图片格式,应该为每一种格式定义一个另外的属性类型,为照片提供类型信息,或者使用ASN.1描述值,并且使用;binary传输选项。
另外一个选择是让属性保存一个指向图片的URI。可以在labeledURI(RFC2079)之后定义该属性,或者只是简单的创建一个子类型。比如:
attributetype ( 1.1.2.1.3 NAME 'myPhotoURI'
DESC 'URI and optional label referring to a photo'
SUP labeledURI )
2.5、 对象类说明
objectclasses指令用来定义一个新的对象类。该指令和在子模式子树中的objectClasses属性使用相同的属性类型描述(如RFC2252所定义)。比如:
objectclass <RFC2252 Object Class Description>
其中,Object Class Description按照如下所示的BNF定义:
ObjectClassDescription = "(" whsp
numericoid whsp ; ObjectClass identifier
[ "NAME" qdescrs ]
[ "DESC" qdstring ]
[ "OBSOLETE" whsp ]
[ "SUP" oids ] ; Superior ObjectClasses
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
; default structural
[ "MUST" oids ] ; AttributeTypes
[ "MAY" oids ] ; AttributeTypes
whsp ")"
其中,whsp是一个空格,numericoid是一个全局唯一的点分十进制格式的OID(例如:1.1.0),qdescrs是一个或者多个名称,oids是一个或者多个OID的名称。
2.5.1、 myPhotoObject
下面定义一个允许将myPhoto增加到任何已经存在的条目中的auxiliary对象类:
objectclass ( 1.1.2.2.1 NAME 'myPhotoObject'
DESC 'mixin myPhoto'
AUXILIARY
MAY myPhoto )
2.5.2、 myPerson
如果您的组织需要一个私有的结构化对象类来表示用户,你可以子类化任何一个已经存在的person类,比如inetOrgPerson(RFC2798),然后增加需要的属性:
objectclass ( 1.1.2.2.2 NAME 'myPerson'
DESC 'my person'
SUP inetOrgPerson
MUST ( 'myUniqueName' $ 'givenName' )
MAY 'myPhoto' )
该对象类从inetOrgPerson中继承允许的或者必须的属性,但是,要求myUniqueName和givenName,允许myPhoto。
2.6、 OID宏
为了简化OID的管理和使用,slapd(8)支持对象描述宏。objectIdentifier用来将一个宏名连接到一个OID。OID可以是从一个先前已经定义的OID宏中派生的。slapd.conf(5)的语法是:
objectIdentifier <name> { <oid> | <name>[:<suffix>] }
下面显示了定义一组OID宏,并且在定义模式元素中使用它们:
objectIdentifier myOID 1.1
objectIdentifier mySNMP myOrgOID:1
objectIdentifier myLDAP myOrgOID:2
objectIdentifier myAttributeType myOrgLDAP:1
objectIdentifier myObjectClass myOrgLDAP:2
attributetype ( myAttributeType:3 NAME 'myPhotoURI'
DESC 'URI and optional label referring to a photo'
SUP labeledURI )
objectclass ( myObjectClass:1 NAME 'myPhotoObject'
DESC 'mixin myPhoto'
AUXILIARY
MAY myPhoto )