系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)

第 16 章 从 NIS+ 转换为 LDAP

本章介绍如何从使用 NIS+ 名称服务转换为使用 LDAP 名称服务。

NIS+ 到 LDAP 的转换概述

NIS+ 服务器守护进程 rpc.nisd 将 NIS+ 数据 以专用文件格式存储到 /var/nis/data 目录中。尽管完全有可能使 NIS+ 数据与 LDAP 同步,但这样的同步以前需要外部代理。不过,现在使用 NIS+ 守护进程,可以将 LDAP 服务器用作 NIS+ 数据的数据仓库。由于这样一来可以使 NIS+ 客户机和 LDAP 客户机共享相同的名称服务信息,因此更易于从使用 NIS+ 作为主名称服务转换为使用 LDAP 作为主名称服务。

缺省情况下,rpc.nisd 守护进程继续按照以前的方式工作,即仅依赖 /var/nis/data NIS+ 数据库。如果需要的话,系统管理员可以选择将 LDAP 服务器用作 NIS+ 数据库任何子集的授权数据仓库。此时,/var/nis/data 文件充当 rpc.nisd 守护进程的高速缓存,这样可以减少 LDAP 查找的通信流量,而且如果 LDAP 服务器暂时不可用,则 rpc.nisd 还可以继续工作。除了可以在 NIS+ 和 LDAP 之间保持持续同步外,还可以将 NIS+ 数据上载到 LDAP 或者将 LDAP 数据下载到 NIS+。

将数据映射到 LDAP 或从 LDAP 映射数据由灵活的配置文件语法来控制。模板映射文件 /var/nis/NIS+LDAPmapping.template 包含所有标准 NIS+ 表(client_info.org_dirtimezone.org_dir 除外),对于大多数 NIS+ 安装来说,无需更改该文件或只需进行很小的改动。(有关 client_info.org_dirtimezone.org_dir 的信息,请参见client_infotimezone 表(从 NIS+ 转换为 LDAP)。)除了提供 NIS+ 数据在 LDAP 目录信息树 (Directory Information Tree, DIT) 中的位置以外,该映射文件还允许为源自 LDAP 的 NIS+ 数据提供生存时间 (time-to-live, TTL)。虽然通常情况下 NIS+ 列的值和 LDAP 属性值之间是一一对应的关系,但是该映射文件还可以用于维护更复杂的关系。

/etc/default/rpc.nisd 文件可用于选择 LDAP 服务器和验证,并控制 rpc.nisd 的一些常规行为。请参见 rpc.nisd( 4)。映射的详细消息可通过 /var/nis/NIS+LDAPmapping 文件来指定。有关更多信息,请参见 NIS+LDAPmapping(4)。映射文件的名称可以通过编辑 /lib/svc/method/nisplus 文件来更改。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具

本章使用了以下术语:

rpc.nisd 配置文件

rpc.nisd 操作 由两个配置文件来控制。

配置是通过为预定义的属性赋值来完成的。除了配置文件,配置属性还可以从 LDAP 读取(请参见将配置信息存储到 LDAP 中),或者在 rpc.nisd 命令行中通过 -x 选项指定。如果在多个位置中指定了同一个属性,则优先顺序(从高到低)如下所示:

  1. rpc.nisd -x 选项

  2. 配置文件

  3. LDAP

NIS+ 到 LDAP 转换工具和服务管理工具

与由 NIS+ 到 LDAP 的转换相关联的大多数命令行管理任务都由服务管理工具来管理。有关 SMF 的概述,请参阅System Administration Guide: Basic Administration中的“Managing Services (Overview)”。有关更多详细信息,另请参阅 svcadm(1M)svcs(1) 手册页。

何时不使用 SMF 进行 NIS+ 到 LDAP 转换

通常,/usr/sbin/rpc.nisd 守护进程是使用 svcadm 命令管理的。但是,当使用 -x nisplusLDAPinitialUpdateOnly=yes 调用 rpc.nisd 时,rpc.nisd 会执行指定的初始更新操作,然后再退出。即,rpc.nisd 不会守护进程化。服务管理工具不应当与 -x nisplusLDAPinitialUpdateOnly=yes 结合使用。SMF 可以在您希望启动、停止或重新启动 rpc.nisd 守护进程的其他任何时间使用。

以下示例说明如何将 rpc.nisd-x nisplusLDAPinitialUpdateOnly=yes 结合使用。


# /usr/sbin/rpc.nisd -m mappingfile \

-x nisplusLDAPinitialUpdateAction=from_ldap \

-x nisplusLDAPinitialUpdateOnly=yes

修改 /lib/svc/method/nisplus 文件

如果要在用服务管理工具调用 rpc.nisd 守护进程时包括特定选项,可以使用 svcprop 命令或者修改 /lib/svc/method/nisplus 文件。有关使用 svcprop 命令的更多信息,请参见 svcprop(1) 手册页。以下过程介绍如何修改 /lib/svc/method/nisplus 文件。

如何修改 /lib/svc/method/nisplus 文件
  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见 System Administration Guide: Security Services中的“Using Role-Based Access Control (Tasks)”

  2. 停止 NIS+ 服务。


    # svcadm disable network/rpc/nisplus:default
    

  3. 打开 /lib/svc/method/nisplus 文件。

    使用所选的编辑器。

  4. 编辑该文件并添加所需的选项。

    将如下内容:


    if [ -d /var/nis/data -o -d /var/nis/$hostname ]; then
    
                        /usr/sbin/rpc.nisd || exit $

    更改为:


    if [ -d /var/nis/data -o -d /var/nis/$hostname ]; then
    
                         /usr/sbin/rpc.nisd -Y -B || exit $?

    在本示例中,向 rpc.nisd 中添加了 -Y-B 选项,因此这两个选项会在系统启动时自动实现。

  5. 保存并退出 /lib/svc/method/nisplus 文件。

  6. 启动 NIS+ 服务。


    # svcadm enable network/rpc/nisplus:default
    

创建属性和对象类

根据 NIS+/LDAP 映射的配置方式,您可能希望创建许多新的 LDAP 属性和对象类。以下示例说明如何通过指定 LDIF 数据来完成此操作,这些数据可用作 ldapadd 命令的输入。创建一个包含 LDIF 数据的文件,然后调用 ldapadd(1)


# ldapadd -D bind-DN -f ldif -file

此方法适用于 Sun Java System Directory Server,还可能适用于其他 LDAP 服务器。


注意 –

除了 defaultSearchBasepreferredServerListauthenticationMethod 属性以及 SYNTAX 规范,本章中使用的对象标识符 (object identifier, OID) 仅用于说明。由于尚未指定任何正式的 OID,因此您可以自由使用任何适当的 OID。


NIS+ 到 LDAP 转换入门

有关开始使用 NIS+ 数据的 LDAP 系统信息库所需配置的介绍,请参见 NIS+LDAPmapping(4)。本节中的其余部分更详细地介绍配置文件的组织结构。

/etc/default/rpc.nisd 文件

/etc/default/rpc.nisd 文件中所有的赋值都属于 attributeName=value 类型。

常规配置

下列属性控制 rpc.nisd 的常规配置,无论 LDAP 映射是否有效,这些属性都处于活动状态。通常应当让它们保持其缺省值。有关更多信息,请参见 rpc.nisd(4)

LDAP 中的配置数据

下列属性控制如何从 LDAP 读取其他配置属性。这些属性本身不能驻留在 LDAP 中。它们只能从命令行或配置文件中读取。有关更多信息,请参见 rpc.nisd(4)

服务器选择

验证和安全性

指定验证方法,在适用于所选方法的情况下,还可指定要在 rpc.nisd 守护进程和 LDAP 服务器之间使用的代理用户(绑定的标识名 (distinguished name, DN))和口令(密钥或其他共享秘密)。有关更多信息,请参见安全性和验证

可以选择使用 SSL,并指定证书文件的位置。有关更多信息,请参见使用 SSL

LDAP 和 NIS+ 中的缺省位置

LDAP 通信的超时/大小限制和引用操作

以上参数分别是 ldap bindmodifyadddelete 操作的超时参数。通常应当让它们保持其缺省值。

以上第一个参数用于设置 LDAP 搜索操作的超时值,第二个参数用于请求服务器端的搜索时间限制。由于 nisplusLDAPsearchTimeLimit 将控制 LDAP 服务器花在搜索请求上的时间,因此请确保 nisplusLDAPsearchTimeLimit 不小于 nisplusLDAPsearchTimeout。 根据 NIS+ 服务器、LDAP 服务器以及二者之间连接的性能,您可能需要在缺省值的基础上增大搜索限制的值。查看 rpc.nisd 的超时系统日志消息,并根据消息提示来增大这些值。

错误操作

下列参数定义在 LDAP 操作过程中出现错误时要执行的操作。通常情况下,应使用其缺省值。有关更多信息,请参见 rpc.nisd(4)

常规 LDAP 操作控制

/var/nis/NIS+LDAPmapping 文件

提供的缺省 NIS+LDAPmapping 文件可充当 NIS+/LDAP 映射的主转换器。

如果使用非缺省映射文件,则必须编辑 /lib/svc/method/nisplus 脚本,以在 rpc.nisd 行中使用 -m mappingfile 选项指定映射文件的名称。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具

对于应当映射到 LDAP 或从 LDAP 映射的每个 NIS+ 对象,NIS+LDAPmapping 文件将指定两到五个属性,具体取决于该对象以及缺省值是否满足需要。

nisplusLDAPdatabaseIdMapping 属性

必须设置一个要在其他映射属性中使用的别名。如果 NIS+ 对象名不是全限定名(不以点结尾),则将附加 nisplusLDAPbaseDomain 值。

例如,


nisplusLDAPdatabaseIdMapping	rpc:rpc.org_dir

将数据库 ID rpc 定义为 NIS+ rpc.org_dir 表的别名。

请注意,NIS+ 表对象可能会针对表对象(如果该对象应当映射到 LDAP)和表项分别出现一次,只是两种情况下的数据库 ID 不同。例如,


nisplusLDAPdatabaseIdMapping	rpc_table:rpc.org_dir

nisplusLDAPdatabaseIdMapping	rpc:rpc.org_dir

将数据库 ID rpc_tablerpc 定义为 rpc.org_dir 表的别名。后面的定义清楚表明将 rpc_table 用于 rpc.org_dir 表对象,将 rpc 用于该表中的各项。

nisplusLDAPentryTtl 属性

由于 rpc.nisd 守护进程的本地数据库(位于内存中和磁盘上)充当 LDAP 数据的高速缓存,因此可使用 nisplusLDAPentryTtl 属性来设置该高速缓存中各项的生存时间 (time-to-live, TTL) 值。每个数据库 ID 都有三个 TTL。前两个 TTL 用于控制当 rpc.nisd 首次从磁盘中装入对应的 NIS+ 对象数据时的初始 TTL,第三个 TTL 将在从 LDAP 中读取或刷新对象时指定给该对象。

例如,通过以下语句,rpc.org_dir 表对象可获取在 21600 秒到 43200 秒的范围内随机选择的初始 TTL。


nisplusLDAPentryTtl	rpc_table:21600:43200:43200

如果初始 TTL 过期并从 LDAP 中刷新了表对象,则该 TTL 将设置为 43200 秒。

同样,使用以下语句,可在首次装入 rpc.org_dir 表时向该表中的各项指定介于 1800 秒和 3600 秒之间的初始 TTL。


nisplusLDAPentryTtl	rpc:1800:3600:3600

每项都会获取各自在指定范围内随机选择的 TTL。如果某个表项过期并已刷新,则该 TTL 将设置为 3600 秒。

选择 TTL 值时,需要综合考虑性能和一致性。如果由 rpc.nisd 高速缓存的 LDAP 数据所使用的 TTL 非常长,则性能与 rpc.nisd 根本未从 LDAP 映射数据时一样。但是,如果 LDAP 数据被 rpc.nisd 以外的某个实体更改,则所做的更改也可能会在很长时间之后才显示在 NIS+ 中。

相反,如果选择非常短(或者甚至为零)的 TTL,则意味着对 LDAP 数据进行的更改会迅速显示在 NIS+ 中,但这也可能会大大降低性能。通常,对于会同时从 LDAP 中读取数据或向 LDAP 中写入数据的 NIS+ 操作而言,所需的时间将至少为没有 LDAP 通信时执行同一操作所需时间的两到三倍(而且还会带来额外的 LDAP 查找开销)。尽管性能会因为硬件资源而大不相同,但是,扫描大型 LDAP 容器(具有几万或几十万个项)以确定应当刷新的 NIS+ 项可能会需要很长时间。rpc.nisd 守护进程在后台执行扫描操作,从而可在运行时继续为可能过时的数据提供服务,但是后台扫描仍然会占用 NIS+ 服务器中的 CPU 和内存。

请仔细考虑保持 NIS+ 数据与 LDAP 密切同步的重要性,并选择每个 NIS+ 对象都可接受的最长 TTL。缺省值(未指定 nisplusLDAPentryTtl 时的值)是 1 小时。对于表项以外的对象,模板映射文件 /var/nis/NIS+LDAPmapping.template 会将该值更改为 12 小时。但是,系统无法自动识别非项对象,因此,如果要为非项对象添加映射,TTL 的缺省值将为 1 小时。


注意 –

不存在的对象没有 TTL。因此,无论哪些 TTL 对于 NIS+ 表中的 LDAP 映射项有效,对于 NIS+ 中不存在的项发出请求时都将在 LDAP 中查询该项。


nisplusLDAPobjectDN 属性

对于每个映射的 NIS+ 对象,nisplusLDAPobjectDN 都会设置对象数据在 LDAP DIT 中所处的位置。它还允许指定在删除 LDAP 项之后要执行的操作。每个 nisplusLDAPobjectDN 值都有三部分。第一部分指定从何处读取 LDAP 数据,第二部分指定将 LDAP 数据写入何处,第三部分指定在删除 LDAP 数据时应当发生的情况。请参阅以下示例:


nisplusLDAPobjectDN	rpc_table:\

										cn=rpc,ou=nisPlus,?base?\

													objectClass=nisplusObjectContainer:\

										cn=rpc,ou=nisPlus,?base?\

													objectClass=nisplusObjectContainer,\

														objectClass=top

以上示例说明应当从 DN cn=rpc,ou=nisPlus 读取 rpc.org_dir 表对象(由于该值以逗号结尾,并附加了 defaultSearchBase 属性的值),搜索范围为 baseObjectClass 属性的值为 nisplusObjectContainer 的项处于选中状态。

将该表对象写入同一个位置中。缺少删除规范,这表示执行缺省操作,如下所示。如果该 NIS+ 表对象被删除,则整个 LDAP 项也应当被删除。

如果应当从 LDAP 读取数据,而不应当向其中写入数据,请忽略写入部分(以及用于将写入部分与读取部分分开的冒号)。


nisplusLDAPobjectDN	rpc_table:\

										cn=rpc,ou=nisPlus,?base?\

										objectClass=nisplusObjectContainer

请注意,nisplusObjectContainer 对象类不属于 RFC 2307。为了使用它,必须按照映射表项以外的 NIS+ 对象中的详细说明来配置 LDAP 服务器。

对于 rpc.org_dir 表项,可以使用以下示例:


nisplusLDAPobjectDN rpc:ou=Rpc,?one?objectClass=oncRpc:\

											ou=Rpc,?one?objectClass=onRpc,objectClass=top

以上示例说明如何从基 ou=Rpc 读取和向其中写入表项。而且,结尾的逗号还会附加 defaultSearchBase 值。选择 objectClass 属性的值为 oncRpc 的项。当在 LDAP 中的 ou=Rpc 容器中创建项时,还必须将 top 指定为 objectClass 值。

请考虑以下示例中说明的非缺省删除规范:


nisplusLDAPobjectDN	user_attr:\

										ou=People,?one?objectClass=SolarisUserAttr,\

											solarisAttrKeyValue=*:\

										ou=People,?one?objectClass=SolarisUserAttr:\

											dbid=user_attr_del

user_attr.org_dir 数据驻留在 ou=People LDAP 容器中,该容器由这些数据和来自其他源(如 passwd.org_dir NIS+ 表)的帐户信息共享。

在该容器中选择具有 solarisAttrKeyValue 属性的项,因为只有这些项才包含 user_attr.org_dir 数据。nisplusLDAPobjectDNdbid=user_attr_del 部分说明在删除 user_attr.org_dir NIS+ 表中的某个项时,应当按照 user_attr_del 数据库 ID 所标识的规则集内的规则删除相应的 LDAP 项(如果有的话)。有关更多信息,请参见nisplusLDAPcolumnFromAttribute 属性

nisplusLDAPattributeFromColumn 属性

nisplusLDAPattributeFromColumn 指定用于将 NIS+ 数据映射到 LDAP 的规则。其他方向的映射规则由 nisplusLDAPcolumnFromAttribute 控制。

nisplusLDAPcolumnFromAttribute 属性

nisplusLDAPcolumnFromAttribute 指定用于将 LDAP 数据映射到 NIS+ 的规则。

完整的项映射语法可以在 NIS+LDAPmapping(4) 中找到。但是,使用几个示例可以更清楚地解释映射语法。

NIS+ rpc.org_dir 表中包含四个名为 cnamenamenumbecomment 的列。因此,NIS+ RPC 程序号 (100300) 的标准名称为 nisd、别名为 rpc.nisdnisplusd 的项可以由 rpc.org_dir 中的下列 NIS+ 项表示:


nisd nisd 100300	NIS+ server

nisd rpc.nisd 100300	NIS+ server

nisd nisplusd 100300	NIS+ server

假定 defaultSearchBase 值为 dc=some,dc=domain,相应的 LDAP 项(列在 ldapsearch(1) 中)将如下所示:


dn: cn=nisd,ou=Ppc,dc=some,dc=domain

cn: nisd

cn: rpc.nsid

cn: nisplusd

oncRpcNumber: 100300

description: NIS+ server

objectClass: oncRpc

这有助于在 NIS+ 数据和 LDAP 数据之间建立简单的一一映射的关系,而且从 NIS+ 到 LDAP 的相应映射属性值如下所示:


nisplusLDAPattributeFromColumn \

rpc:		dn=("cn=%s,", name), \

				cn=cname, \

				cn=name, \

				oncRpcNumber=number, \

				description=comment

这会使该项的 DN 为 cn=%s,并用 cname 列的值替换 %s


cn=nisd,

由于该值以逗号结尾,因此将附加从 nisplusObjectDN 读取的基值,结果如下所示:


cn=nisd,ou=Rpc,dc=some,dc=domain

oncRpcNumberdescription 属性值只是相应 NIS+ 列的简单赋值。rpc.nisd 会将多个 NIS+ 项收集到一个 LDAP 项中,并用多个 cn 值来表示不同的 name 列值。

同样,从 LDAP 到 NIS+ 的映射将如下所示:


nisplusLDAPcolumnFromAttribute \

 					rpc:		cname=cn, \

			 						(name)=(cn), \

									number=oncRpcNumber, \

									comment=description

以上示例会将 oncRpcNumberdescription 值赋予相应的 NIS+ 列。多值 cn(由 (cn) 表示)映射到多个 name 列值(由 (name) 表示)。由于 name 列不能具有多值,因此 rpc.nisd 会为每个 cn 值创建一个 NIS+ 项。

最后,nisplusLDAPattributeFromColumn 值是用于删除操作的规则集的示例。


nisplusLDAPattributeFromColumn \

user_attr_del:	dn=("uid=%s,", name), \

						SolarisUserQualifier=, \

						SolarisAttrReserved1=, \

 						SolarisAttrReserved2=, \

						SolarisAttrKeyValue= 

而且,user_attr.org_dir 数据与其他帐户信息(来自 passwd.org_dir 和其他表)共享 ou=People 容器。如果 user_attr.org_dir 表中的一项被删除,您可能不希望整个 ou=People 项被删除。相反,以上删除项假设当 user_attr.org_dir 项被删除时,SolarisUserQualifierSolarisAttrReserved1SolarisAttrReserved2SolarisAttrKeyValue 属性(如果有的话)会从以下规则所指定的 ou=People 项中删除:


dn=("uid=%s,", name)

LDAP 项的其余部分保持不变。

NIS+ 到 LDAP 迁移方案

以下列出了从 NIS+ 迁移到 LDAP 时可能的迁移方案:

如何通过一个操作将所有的 NIS+ 数据转换为 LDAP
  1. 使用 rpc.nisd 上载 LDAP 中尚不存在的任何 NIS+ 数据。

    使用以下命令(假设已在缺省位置 (/var/nis/NIS+LDAPmapping) 建立了所有 NIS+/LDAP 数据映射):


    # /usr/sbin/rpc.nisd -D \
    
    -x nisplusLDAPinitialUpdateAction=to_ldap \
    
    -x nisplusLDAPinitialUpdateOnly=yes
    

    以上命令会使 rpc.nisd 将数据上载到 LDAP,然后退出。NIS+ 数据将不会受到此操作的影响。

    请参见 rpc.nisd(4)nisplusLDAPinitialUpdateAction 属性。

如何通过一步操作将所有的 LDAP 数据转换为 NIS+
  1. 使用 rpc.nisd 将所有的 LDAP 数据下载到 NIS+,从而覆写现有的 NIS+ 数据。

    使用以下命令(假设已在缺省位置 (/var/nis/NIS+LDAPmapping) 建立了所有 NIS+/LDAP 数据映射):


    # /usr/sbin/rpc.nisd -D \
    
    -x nisplusLDAPinitialUpdateAction=from_ldap \
    
    -x nisplusLDAPinitialUpdateOnly=yes
    

    以上命令会使 rpc.nisd 守护进程从 LDAP 下载数据,然后退出。LDAP 数据将不会受到此操作的影响。

    请参见 rpc.nisd(4)nisplusLDAPinitialUpdateAction 属性。

合并 NIS+ 数据和 LDAP 数据

NIS+ 到 LDAP 迁移方案说明了当应该通过让 NIS+ 数据或 LDAP 数据成为授权数据来解决 NIS+ 数据和 LDAP 数据之间的冲突时,如何对 NIS+ 数据和 LDAP 数据进行同步。合并数据需要更复杂的过程。

本节中的示例过程做出了以下假定:

如何合并 NIS+ 数据和 LDAP 数据

注意 – 注意 –

如果 LDAP 数据在步骤 4 的下载和步骤 10 的上载之间发生变化,则上载过程可能会覆写这些更改。因此,应当尽量避免在该过程中修改 LDAP 数据。有关更多信息,请查阅 LDAP 服务器文档。


  1. 使用 nisbackup 命令备份所有的 NIS+ 数据。


    # nisbackup -a /nisbackup 
    
  2. 标识那些包含必须与 LDAP 合并的数据的 NIS+ 表。将这些表的内容转储到平面文件中。例如,使用 nisaddent,按以下方式转储 group.org_dir 的内容:


    # nisaddent -d group | sort > /before/group
    

    nisaddent 输出传输到 sort 将便于稍后进行比较。

  3. 停止 NIS+ 服务。


    # svcadm disable network/rpc/nisplus:default
    

  4. 将 LDAP 数据下载到 NIS+ 中。


    # /usr/sbin/rpc.nisd -D -m tmpmap \
    
    -x nisplusLDAPinitialUpdateAction=from_ldap \
    
    -x nisplusLDAPinitialUpdateOnly=yes
    
  5. 启动 NIS+ 服务。


    # svcadm enable network/rpc/nisplus:default
    

    rpc.nisd 守护进程现在将为从 LDAP 下载的数据提供服务。如果不应当将 NIS+ 客户机向需要解决的冲突数据公开,请确保在活动 NIS+ 客户机很少(最好没有)时执行此步骤和后面的几个步骤。

  6. 转储受到影响的表中的 NIS+ 数据。

    以下示例使用 group.org_dir 表。


    # nisaddent -d group | sort > /after/group
    
  7. 创建这些表的合并版本。

    使用所选的文件合并过程来生成合并后的表。如果没有其他工具,则可以使用 diff(1) 来收集 /before/after 文件之间的不同部分,并用文本编辑器手动合并。

    以下示例假定合并结果位于 /after 中。

  8. 将合并后的数据装入到 NIS+ 中。以下示例使用 group 表。


    # nisaddent -m -f /after/group group
    
  9. 删除在合并之后不应当存在的 LDAP 项。

    A. 如果某些 LDAP 项在(现在合并的)NIS+ 数据中不存在,但是在上载之后不应当在 LDAP 中存在,则必须删除这些 LDAP 项。

    LDAP 服务器可能会提供一种用于删除多项的方便方法,如用于删除容器中所有项的方法。如果不属于这种情况,则可以使用 ldapsearch(1) 来为每个容器生成一系列项。例如,要生成 ou=Rpc 容器中所有项的列表,请按以下方式使用 ldapsearch (1)


    # ldapsearch -h server-address -D bind-DN -w password \
    
    -b ou=Rpc,search-base 'objectClass=*' dn | \
    
    grep -i ou=Rpc | grep -v -i \^ou=Rpc > \
    
    /tmp/delete-dn
    

    有关元参数(例如,server-addressbind-DN)的说明,请参见性能和索引

    B. 现在可以编辑结果文件 (/tmp/delete-dn),以便仅指定那些应当删除的项。或者,为了删除该容器中的所有项,可以按原样使用该文件,并依赖 NIS+ 上载功能来恢复 LDAP 数据。无论使用哪种方法,都应当先备份 LDAP 数据,然后执行下面的 ldapdelete 操作。

    C. 使用 ldapdelete 删除 LDAP 项,将 stdout(对于已删除的各项,通常为空行)重定向到 /dev/null


    # ldapdelete -h server-address -D bind-DN -w password \
    
    /tmp/delete-dn /dev/null
    

    D. 对于至少包含一个必须删除的项的容器,重复上述过程。

  10. 将合并后的 NIS+ 数据上载到 LDAP 中。

    1. 停止 NIS+ 服务。


      # svcadm disable network/rpc/nisplus:default
      
    2. 执行上载。


      # /usr/sbin/rpc.nisd -D -m tmpmap \
      
      -x nisplusLDAPinitialUpdateAction=to_ldap \
      
      -x nisplusLDAPinitialUpdateOnly=yes
      
  11. (可选)根据需要编辑 /lib/svc/method/nisplus 文件。

    • 如果 rpc.nisd 守护进程使用 LDAP 系统信息库,而且未在使用缺省文件 /var/yp/NIS+LDAPmapping,请使用 -m mappingfile 选项指定相应的映射文件。

    • 如果 rpc.nisd 守护进程提供 NIS (YP) 仿真,请通过使用 svcprop 或通过修改 /lib/svc/method/nisplus 文件来指定 -Y 选项。

    有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具

  12. 启动 NIS+ 服务。


    # svcadm enable network/rpc/nisplus:default
    

主服务器和副本服务器(从 NIS+ 转换为 LDAP)

只允许 NIS+ 主服务器将数据写入 LDAP 中。NIS+ 副本服务器可以从 NIS+ 主服务器获取更新(此更新可能是从 LDAP 获取的,也可能不是),也可以直接从 LDAP 服务器读取数据。也可能会存在这两种情况的组合。因此,可通过两种主要方法来安排 NIS+ 复制。

复制时间标记

如果 NIS+ 副本服务器是从 LDAP 为特定 NIS+ 目录中至少一个对象获取数据,则 nisping(1M) 列显的更新时间标记不必指示 NIS+ 主服务器和副本服务器之间数据的一致程度。例如,假定 NIS+ 目录 dir1 中包含 table1table2 表。如果副本服务器是从 NIS+ 主服务器获取 table1table2 的数据,则可能会看到类似以下的输出:


# nisping dir1

Master server is "master.some.domain."

Last update occurred at Mon Aug  5 22:11:09 2002



Replica server is "replica.some.domain."

	Last Update seen was Mon Aug  5 22:11:09 2002

以上输出表明主服务器和副本服务器具有完全相同的数据。但是,如果副本服务器是从 LDAP 获取 table1table2 中任意一个表的数据或同时获取二者的数据,则输出中仅显示副本服务器已从主服务器接收了 NIS_PING,并且更新了其重新同步时间标记以进行内务处理。如果符合以下任一条件,从 LDAP 映射的一个或多个表中的数据可能会与 NIS+ 主服务器中的数据不同:

如果您不接受这种类型的数据不一致,请允许所有的 NIS+ 副本服务器仅从 NIS+ 主服务器获取其数据。在已经配置 NIS+ 主服务器,使其从 LDAP 获取数据之后,就无需对副本服务器进行修改了。

目录服务器(从 NIS+ 转换为 LDAP)

rpc.nisd 守护进程的 LDAP 映射部分使用 LDAP 协议版本 3 来与 LDAP 服务器通信。缺省的映射配置 (/var/nis/NIS+LDAPmapping.template) 希望 LDAP 服务器支持扩展版本的 RFC 2307。RFC 可从 http://www.ietf.org/rfc.html 获取。虽然可以使用 NIS+LDAPmapping (4) 来修改 NIS+ 数据和 LDAP 数据之间的映射,但基本的前提条件是假设 LDAP 数据是按照 RFC 2307 中规定的原则进行组织的。

例如,为了在直接 LDAP 客户机和 NIS+ 客户机之间共享帐户信息,LDAP 服务器必须支持以 UNIX crypt 格式存储帐户(用户)口令。如果无法配置 LDAP 服务器实现此操作,则仍可以将 NIS+ 数据(包括帐户)存储到 LDAP 中。但是,将无法在 NIS+ 用户和 LDAP bindDN 之间完全共享帐户信息。

配置 Sun Java System Directory Server

有关安装、设置和管理 Sun Java System Directory Server 的详细说明,请参阅 Sun Java System Directory Server 文档集合。

可以使用 idsconfig(1M) 为 LDAP 客户机配置 Sun Java System Directory Server,以便使用 LDAP 作为名称服务。在将 NIS+ 与 LDAP 数据仓库结合使用时,由 idsconfig(1M) 提供的安装也是适用的。


注意 –

如果使用的是 Sun Java System Directory Server 以外的 LDAP 服务器,则必须手动配置该服务器,使其支持 RFC 2307 架构。


指定服务器地址和端口号

/etc/default/rpc.nisd 文件被设置为在端口 389 上使用本地 LDAP 服务器。如果您的配置不属于这种情况,请为 preferredServerList 属性设置一个新值。例如,要在 IP 地址 192.0.0.1 和端口 65535 上使用 LDAP 服务器,请指定如下内容:


preferredServerList=192.0.0.1:65535

安全性和验证

如果 NIS+ 服务器从 LDAP 获取数据,则 NIS+ 客户机和 NIS+ 服务器之间的验证不受影响。但是,为了维护存储在 LDAP 中 NIS+ 数据的完整性,请考虑在 rpc.nisd 守护进程和 LDAP 服务器之间配置验证。根据 LDAP 服务器的功能,可以使用几种不同类型的验证。

以下列出了 rpc.nisd 守护进程支持的 LDAP 验证:

至少需要实际提供一定安全性的验证方法通常要求您将共享秘密(口令或密钥)与 LDAP 中的 DN 相关联。选择用于 rpc.nisd 守护进程的 DN 可以是唯一的,也可以用于其他目的。它应当具有支持预期的 LDAP 通信流量所必需的相应功能。例如,如果 rpc.nisd 守护进程应当能够向 LDAP 中写入数据,则所选 DN 必须有权在用于 NIS+ 数据的容器中添加/更新/删除 LDAP 数据。此外,在缺省情况下,LDAP 服务器可能会对资源使用情况施加限制(如搜索时间限制或搜索结果大小限制)。如果属于这种情况,则所选 DN 必须具有足够的能力来支持对 NIS+ 数据容器进行枚举。

使用 SSL

rpc.nisd 守护进程还支持使用 SSL 对 LDAP 通信流量进行传输层加密。有关如何生成用于进行 LDAP 服务器验证的 SSL 证书的信息,请查阅 LDAP 服务器文档。将该证书存储到 NIS+ 服务器上的某个文件(例如,/var/nis/cert7.db)中并按以下方式修改 /etc/default/rpc.nisd


nisplusLDAPTLS=ssl

nisplusLDAPTLSCertificateDBPath=/var/nis/cert7.db

一定要防止对证书文件进行未经授权的访问。 请注意,以上方法提供会话加密,还提供 LDAP 服务器到 rpc.nisd 的验证。它并不提供 rpc.nisd 到 LDAP 服务器的验证,因为证书中不包含用于标识 LDAP 客户机 (rpc.nisd) 的任何内容。但是,可以将 SSL 与其他验证方法(simplesasl/digest-md5)结合使用来实现相互验证。

性能和索引

rpc.nisd 守护进程被请求枚举从 LDAP 映射的 NIS+ 表(例如,使用 niscat(1))时,如果该表中至少有一项具有过期的 TTL,该守护进程将枚举相应的 LDAP 容器。尽管此容器是在后台进行枚举的,因此 LDAP 性能显得不太重要,但是建立 LDAP 索引的好处是有助于加速对大型容器的枚举。

要获取枚举特定容器所需的大概时间,可以使用如下所示的命令:

% /bin/time ldapsearch -h server-address -D bind-DN -w password \

-b container, search-base 'cn=*' /dev/null

其中,

/bin/time 列显的“实际”值是经过的(挂钟)时间。如果此值超出相应表项 TTL 很大一部分(25% 或更多)(请参见验证和安全性),那么,为 LDAP 容器创建索引可能会非常有用。

rpc.nisd 支持 simple page 和 VLV 索引方法。要查找 rpc.nisd 支持哪种索引方法以及如何创建这样的索引,请参阅 LDAP 服务器文档。

映射表项以外的 NIS+ 对象

可以将表项以外的 NIS+ 对象存储在 LDAP 中。但是,除非您还拥有可从 LDAP 获取这些 NIS+ 对象的 NIS+ 副本服务器,否则这样做没有多大意义。建议使用以下选项:

NIS+ 项的属主、组、访问权限和 TTL

如果 NIS+ 表项是从 LDAP 数据创建的,则缺省行为是使用项对象所在表对象中的属主、组、访问权限和 TTL 来初始化项对象的相应值。这通常是足够的,但也可能会存在必须单独设置这些 NIS+ 项属性的情况。例如,当站点不使用 rpc.nispasswdd(1M) 守护进程时。为了允许个别用户更改其 NIS+ 口令(并重新加密存储在 cred.org_dir 表中的 Diffie-Hellman 密钥),该用户应当拥有自己的 passwd.org_dircred.org_dir 项,而且对这些项必须拥有与项属主相同的修改权限。

如果您需要将一个或多个 NIS+ 表中表项的属主、组、访问权限或 TTL 存储在 LDAP 中,则需要执行以下操作。

如何将其他项属性存储到 LDAP 中
  1. 请查阅 LDAP 服务器文档,并新建下列属性和对象类。(LDIF 数据适用于 ldapadd。属性和对象类 OID 仅用于说明。)


    dn: cn=schema
    
    changetype: modify
    
    add: attributetypes
    
    attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.4.0 NAME 'nisplusEntryOwner' \
    
    		  						DESC 'Opaque representation of NIS+ entry owner' \
    
    		  						SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
    
    attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.4.1 NAME 'nisplusEntryGroup' \
    
    		  						DESC 'Opaque representation of NIS+ entry group' \
    
    		  						SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
    
    attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.4.2 NAME 'nisplusEntryAccess' \
    
    		  						DESC 'Opaque representation of NIS+ entry access' \
    
    		  						SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
    
    attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.4.3 NAME 'nisplusEntryTtl' \
    
    		  						DESC 'Opaque representation of NIS+ entry TTL' \
    
    		  						SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

    dn: cn=schema
    
    changetype: modify
    
    add: objectclasses

    objectclasses:(1.3.6.1.4.1.42.2.27.5.42.42.5.0 NAME 'nisplusEntryData'\
    
    SUP top STRUCTURAL DESC 'NIS+ entry object non-column data'\

    MUST ( cn ) MAY ( nisplusEntryOwner $ nisplusEntryGroup $\
    
    nisplusEntryAccess $ nisplusEntryTtl ) )
  2. 修改相关表的 nisplusLDAPobjectDN 属性值,以使写入部分包括新创建的 nisplusEntryData 对象类。

    例如,对于 passwd.org_dir 表,假定使用的是基于 /var/nis/NIS+LDAPmapping.template 的映射文件,并按以下方式进行编辑:


    nisplusLDAPobjectDN	passwd:ou=People,?one?objectClass=shadowAccount,\
    
    												objectClass=posixAccount:\
    
    										ou=People,?one?objectClass=shadowAccount,\
    
    												objectClass=posixAccount,\
    
    												objectClass=account,objectClass=top

    按如下方式编辑属性值:


    nisplusLDAPobjectDN	passwd:ou=People,?one?objectClass=shadowAccount,\
    
    												objectClass=posixAccount:\
    
    										ou=People,?one?objectClass=shadowAccount,\
    
    												objectClass=posixAccount,\
    
    												objectClass=nisplusEntryData,\
    
    												objectClass=account,objectClass=top
  3. 编辑 nisplusLDAPattributeFromColumnnisplusLDAPcolumnFromAttribute 属性值,以指定所需的属主、组、访问权限或 TTL 的任何子集。

    在步骤 2 中,创建了用于存储这些值的 LDAP 属性。对于 NIS+,存在几个名称分别为 zo_ownerzo_groupzo_accesszo_ttl 的预定义伪列。例如,为了将 passwd.org_dir 项的属主、组和访问权限存储在 LDAP 中,请修改以下内容中的 nisplusLDAPattributeFromColumn 值:


    nisplusLDAPattributeFromColumn \
    
    		passwd:		dn=("uid=%s,", name), \
    
    				cn=name, \
    
    				uid=name, \
    
    				userPassword=("{crypt$}%s", passwd), \
    
    				uidNumber=uid, \
    
    				gidNumber=gid, \
    
    				gecos=gcos, \
    
    				homeDirectory=home, \
    
    				loginShell=shell, \
    
    				(shadowLastChange,shadowMin,shadowMax, \
    
    				 shadowWarning, shadowInactive,shadowExpire)=\
    
    					(shadow, ":")

    按以下方式编辑读取部分:


    nisplusLDAPattributeFromColumn \
    
    		passwd:		dn=("uid=%s,", name), \
    
    				cn=name, \
    
    				uid=name, \
    
    				userPassword=("{crypt$}%s", passwd), \
    
    				uidNumber=uid, \
    
    				gidNumber=gid, \
    
    				gecos=gcos, \
    
    				homeDirectory=home, \
    
    				loginShell=shell, \
    
    				(shadowLastChange,shadowMin,shadowMax, \
    
    				 shadowWarning, shadowInactive,shadowExpire)=\
    
    					(shadow, ":"), \
    
    				nisplusEntryOwner=zo_owner, \
    
    				nisplusEntryGroup=zo_group, \
    
    				nisplusEntryAccess=zo_access

    同样,要从 LDAP 数据中为 passwd.org_dir 表设置 NIS+ 项的属主、组和访问权限,请修改以下内容:


    nisplusLDAPcolumnFromAttribute \
    
    		passwd:		name=uid, \
    
    				("{crypt$}%s", passwd)=userPassword, \
    
    				uid=uidNumber, \
    
    				gid=gidNumber, \
    
    				gcos=gecos, \
    
    				home=homeDirectory, \
    
    				shell=loginShell, \
    
    				shadow=("%s:%s:%s:%s:%s:%s", \
    
    					shadowLastChange, \
    
    					shadowMin, \
    
    					shadowMax, \
    
    					shadowWarning, \
    
    					shadowInactive, \
    
    					shadowExpire)

    按以下方式编辑读取部分:


    nisplusLDAPcolumnFromAttribute \
    
    		passwd:		name=uid, \
    
    				("crypt$%s", passwd)=authPassword, \
    
    				uid=uidNumber, \
    
    				gid=gidNumber, \
    
    				gcos=gecos, \
    
    				home=homeDirectory, \
    
    				shell=loginShell, \
    
    				shadow=("%s:%s:%s:%s:%s:%s", \
    
    					shadowLastChange, \
    
    					shadowMin, \
    
    					shadowMax, \
    
    					shadowWarning, \
    
    					shadowInactive, \
    
    					shadowExpire), \
    
    				zo_owner=nisplusEntryOwner, \
    
    				zo_group=nisplusEntryGroup, \
    
    				zo_access=nisplusEntryAccess
  4. [[将属主、组、访问权限和/或 TTL 项数据上载到 LDAP 中。]]

    有关更多信息,请参见如何通过一个操作将所有的 NIS+ 数据转换为 LDAP

  5. 重新启动 NIS+ 服务,以便使对映射进行的更改生效。


    # svcadm restart network/rpc/nisplus:default
    

主体名和网络名(从 NIS+ 转换为 LDAP)

NIS+ 验证依赖主体名(由域名限定的用户名或主机名)和网络名(主体名的安全 RPC 等效名称)来唯一地标识可以进行验证的实体(主体)。尽管 RFC 2307 提供用于存储 NIS+ 验证所用 Diffie-Hellman 密钥的位置,却没有为主体名或网络名指定任何位置。

/var/nis/NIS+LDAPmapping.template 文件可通过从 cred.org_dir 表的属主名称(本身就是主体名称)派生主体和网络名的域部分来解决此问题。因此,如果 NIS+ 域是 x.y.z.cred.org_dir 表的属主是 aaa.x.y.z.,那么,从 LDAP 数据创建的 NIS+ 项的所有主体名将采用以下形式:

用户或系统 .x.y.z.

网络名采用以下形式:

unix.uid@x.y.z.

unix.nodename@x.y.z.

虽然这种构造主体和网络名的方法可能足以满足大多数 NIS+ 安装要求,但在某些情况下,该方法也会失败,如下所示:

client_infotimezone 表(从 NIS+ 转换为 LDAP)

由于 RFC 2307 不为保存在 NIS+ client_info.org_dirtimezone.org_dir 表中的信息提供架构,因此在缺省情况下,不会在模板映射文件 (/var/nis/NIS+LDAPmapping.template) 中启用对这些表的映射。如果您希望将 client_infotimezone 信息保存到 LDAP 中,请查阅 LDAP 服务器文档,并新建以下各节中讨论的属性和对象类。

client_info 属性和对象类

按以下方式创建属性和对象类,然后为 client_info 数据创建容器。建议的容器名称是 ou=ClientInfo。LDIF 数据适用于 ldapadd(1)。以下内容中使用的属性和对象类 OID 仅用于举例说明。


dn: cn=schema

changetype: modify

add: attributetypes

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.12.0 \

		  NAME 'nisplusClientInfoAttr' \

		  DESC 'NIS+ client_info table client column' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.12.1 \

		  NAME 'nisplusClientInfoInfo' \

		  DESC 'NIS+ client_info table info column' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.12.2 \

		  NAME 'nisplusClientInfoFlags' \

		  DESC 'NIS+ client_info table flags column' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )



dn: cn=schema

changetype: modify

add: objectclasses

objectclasses:	( 1.3.6.1.4.1.42.2.27.5.42.42.13.0 \

		  NAME 'nisplusClientInfoData' \

		  DESC 'NIS+ client_info table data' \

		  SUP top STRUCTURAL MUST ( cn ) \

		  MAY ( nisplusClientInfoAttr $ nisplusClientInfoInfo $ nisplusClientInfoFlags ) )

要创建容器,请将以下 LDIF 数据放在一个文件中,并用实际的搜索库替换 searchBase

dn: ou=ClientInfo, searchBase

objectClass: organizationalUnit

ou: ClientInfo

objectClass: top

将以上文件用作 ldapadd 命令的输入,以便创建 ou=ClientInfo 容器。例如,如果 LDAP 管理员 DN 是 cn=directory manager,而且具有 LDIF 数据的文件名为 cifile,请执行以下操作:


# ldapadd -D cn="directory manager" -f cifile

根据所需的验证,ldapadd 命令可能会提示您输入口令。

/var/nis/NIS+LDAPmapping.template 文件中包含 client_info.org_dir 表的已取消注释的定义。请将这些内容复制到实际映射文件,通过删除注释字符 '#' 来启用它们,然后重新启动 rpc.nisd 守护进程。


# svcadm restart network/rpc/nisplus:default

如有必要,请按照NIS+ 到 LDAP 迁移方案中的说明同步 NIS+ 和 LDAP 数据。

timezone 属性和对象类

按以下方式创建属性和对象类,然后为 timezone 数据创建容器。建议的容器名称是 ou=Timezone。(LDIF 数据适用于 ldapadd (1)。属性和对象类 OID 仅用于举例说明。)


dn: cn=schema

changetype: modify

add: attributetypes

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.15.0 NAME 'nisplusTimeZone' \

		  DESC 'tzone column from NIS+ timezone table' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )



dn: cn=schema

changetype: modify

add: objectclasses

objectclasses:	( 1.3.6.1.4.1.42.2.27.5.42.42.16.0 NAME 'nisplusTimeZoneData' \

		  DESC 'NIS+ timezone table data' \

		  SUP top STRUCTURAL MUST ( cn ) \

		  MAY ( nisplusTimeZone $ description ) )

要创建 ou=Timezone 容器,请将以下 LDIF 数据放在一个文件中,并用实际的搜索库替换 searchBase

dn: ou=Timezone,searchBase ou: Timezone objectClass: top

objectClass: organizationalUnit

将以上文件用作 ldapadd(1) 的输入,以便创建 ou=Timezone 容器。例如,如果 LDAP 管理员 DN 是 cn=directory manager,而且具有 LDIF 数据的文件名为 tzfile


# ldapadd -D cn="directory manager" -f tzfile

根据所需的验证,ldapadd 命令可能会提示您输入口令。

/var/nis/NIS+LDAPmapping.template 文件中包含 timezone.org_dir 表的已取消注释的定义。请将这些内容复制到实际映射文件,通过删除注释字符 '#' 来启用它们,然后重新启动 rpc.nisd 守护进程。


# svcadm restart network/rpc/nisplus:default

如有必要,请按照NIS+ 到 LDAP 迁移方案中的说明同步 NIS+ 和 LDAP 数据。

添加新的对象映射(从 NIS+ 转换为 LDAP)

模板映射文件 /var/nis/NIS+LDAPmapping.template 中包含 所有标准 NIS+ 对象的映射信息。为了支持对特定于站点或应用程序的对象进行映射,将需要添加新的映射项。对于非项(即,目录、组、链接或表)对象来说,此任务非常简单,但是对于项对象来说,如果相应项数据的 LDAP 组织与 NIS+ 所使用的组织有很大区别,则此任务会变得较为复杂。以下示例说明非项对象的简单情况。

如何映射非项对象
  1. 查找要映射的对象的全限定名。

    如果此名称位于由 nisplusLDAPbaseDomain 属性指定的域名下面,则可以省略等于 nisplusLDAPbaseDomain 值的部分。

    例如,如果 nisplusLDAPbaseDomain 的值为 some.domain.,要映射的对象是名为 nodeinfo.some.domain. 的表,则对象名可以缩短为 nodeinfo

  2. 创建用于标识对象的数据库 ID。

    数据库 ID 对于所使用的映射配置必须唯一,而没有进行其他方面的解释。它不显示在 LDAP 数据中。为了避免与项对象映射混淆,请创建一个用于标识表对象属性(而非表项)的数据库 ID 并在末尾处使用解释性字符串(如 _table)。

    在本示例中,使用的是数据库 ID nodeinfo_table,并通过添加以下内容在该数据库 ID 和标准映射文件位置 (/var/nis/NIS+LDAPmapping) 中的对象之间建立连接:


    nisplusLDAPdatabaseIdMapping	nodeinfo_table:nodeinfo.some.domain.

    假定 nisplusLDAPbaseDomainsome.domain.,则以下内容也有效:


    nisplusLDAPdatabaseIdMapping	nodeinfo_table:nodeinfo
  3. 确定适合该对象的 TTL。

    在这段时间内,rpc.nisd 守护进程会将该对象的本地副本视为有效。在 TTL 过期之后,再次引用该对象会启动 LDAP 查找功能以刷新该对象。

    有两个不同的 TTL 值:第一个值是在 rpc.nisd 守护进程(在重新引导或重新启动之后)首次从磁盘中装入该对象时设置的,第二个值与从 LDAP 执行的所有刷新有关。第一个 TTL 是从所配置的范围中随机选择的。例如,如果 nodeinfo_table 应当在初始装入之后的一到三个小时内以及此后的十二个小时内有效,则需要指定如下内容:


    nisplusLDAPentryTtl		nodeinfo_table:3600:10800:43200
  4. 确定对象数据在 LDAP 中的存储位置。

    模板映射文件建议将非项对象数据放到 ou=nisPlus 容器中。

    如果您使用此方案,而且尚未创建相应的属性、对象类和容器,请参见映射表项以外的 NIS+ 对象

    例如,假定您希望将 nodeinfo 对象存储到 ou=nisPlus,dc=some,dc=domain 容器中,而且 LDAP 项应当具有 cn nodeinfo。创建以下 nisplusLDAPobjectDN


    nisplusLDAPobjectDN	nodeinfo_table:\
    
    				cn=nodeinfo,ou=nisPlus,dc=some,dc=domain?base?\
    
    				objectClass=nisplusObjectContainer:\
    
    				cn=nodeinfo,ou=nisPlus,dc=some,dc=domain?base?\
    
    					objectClass=nisplusObjectContainer,\
    
    					objectClass=top

    由于 NIS+ 副本服务器不将数据写入 LDAP 中,因此您可以针对主服务器和副本服务器使用以上 nisplusLDAPobjectDN

  5. (如果尚未在 NIS+ 中创建要映射的 NIS+ 对象,请跳过此步骤。)将对象数据存储到 LDAP 中。可以使用 rpc.nisd 守护进程来存储对象数据,但是使用 nisldapmaptest(1M) 实用程序会更方便,因为您可以使 rpc.nisd 守护进程保持运行状态。


    # nisldapmaptest -m /var/nis/NIS+LDAPmapping -o -t nodeinfo -r
    

    -o 选项指定表对象本身(而非表项)。

  6. 检验对象数据是否存储在 LDAP 中。(本示例假定 LDAP 服务器在本地计算机的端口 389 上运行。)


    # ldapsearch -b ou=nisPlus,dc=some,dc=domain cn=nodeinfo
    

    会出现类似以下的输出:


    dn: cn=nodeinfo,ou=nisPlus,dc=some,dc=domain
    
    objectclass: nisplusObjectContainer
    
    objectclass: top
    
    cn: nodeinfo
    
    nisplusobject=<base 64 encoded data>
  7. 重新启动 NIS+ 服务。

    该服务将使用新的映射信息启动。不要忘记编辑 /lib/svc/method/nisplus 文件,以便根据需要添加 -m-Y 选项或者使用 svcprop 命令。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具


    # svcadm restart network/rpc/nisplus:default
    

添加项对象

NIS+LDAPmapping(4) 详细指定了表项映射的语法和语义,还举例说明了如何使用每个语义元素。但是,最简单且最不易出错的方法通常是标识与所需映射相似的现有映射,然后复制并修改这个现有映射。

例如,假定您有一个名为 nodeinfo 的 NIS+ 表,该表用于存储节点的清单和属主信息。假定该 NIS+ 表是通过以下命令创建的。


# nistbladm -c -D access=og=rmcd,nw=r -s : nodeinfo_tbl \

cname=S inventory=S owner= nodeinfo.`domainname`.

cname 列中应当包含节点的标准名称,换言之,与节点的 hosts.org_dir 表中 cname 列的值相同。

还做出以下假定:相应的信息保存在 LDAP 中的 ou=Hosts 容器中,nodeInfo 对象类(在本示例中为新创建的对象类,而不是在 RFC 中定义的对象类)将 cn 用作 MUST 属性,nodeInventorynodeOwner 是 MAY 属性。

为了将现有的 nodeinfo 数据上载到 LDAP 中,在单独的文件中新建映射属性将会很方便。例如,可以使用 /var/nis/tmpmapping

  1. 创建一个数据库 ID 来标识要映射的 NIS+ 表。


    nisplusLDAPdatabaseIdMapping	nodeinfo:nodeinfo
  2. nodeinfo 表中的项设置 TTL。由于极少对这些信息进行更改,因此请将 TTL 设置为十二个小时。当 rpc.nisd 守护进程首次从磁盘中加载 nodeinfo 表时,该表中项的 TTL 将随机选择为六到十二个小时之间的值。


    nisplusLDAPentryTtl		nodeinfo:21600:43200:43200
  3. 标识与要创建的映射具有相似属性的现有映射。在本示例中,映射属性值非常简单(直接赋值),而将 LDAP 数据存储到现有容器中则较为复杂,因此,在删除 nodeinfo 数据的过程中一定要格外小心。如果不希望删除整个 ou=Hosts 项,而只希望删除 nodeInventorynodeOwner 属性,则将需要一个特殊的删除规则集。

    总之,就是要查找一个共享容器且具有删除规则集的映射。一个可能的备选项就是 netmasks 映射,该映射共享 ou=Networks 容器,而且确实具有一个删除规则集。

  4. 模板映射 netmasks 具有缺省映射(位于 /var/nis/NIS+LDAPmapping.template 中),如下所示:


    nisplusLDAPobjectDN	netmasks:ou=Networks,?one?objectClass=ipNetwork,\
    
     													ipNetMaskNumber=*:\
    
    											ou=Networks,?one?objectClass=ipNetwork:
    
    														dbid=netmasks_del

    在转移到新的 nodeinfo 映射之后,数据库 ID 应当为 nodeinfo,容器应当为 ou=Hosts,对象类应当为 nodeInfo。因此,nodeinfo 映射的第一行将变为:


    nisplusLDAPobjectDN	nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\

    netmasks 映射的第二行是搜索过滤器的一部分,它只选择那些包含 ipNetMaskNumber 属性的 ou=Networks 项。在本示例中,它选择那些具有以下 nodeInventory 属性的 ou=Hosts 项:


    nodeInventory=*:\

    第三行和第四行是 nisplusLDAPobjectDN 的写入部分,它们指定 nodeinfo 数据在 LDAP 中的写入位置以及在删除 nodeinfo 数据时所使用的规则集。在本例中,创建一个由数据库 ID nodeinfo_del 标识的删除规则集。因为您总是写入 ou=Hosts 中的现有项,所以只需要为 nodeinfo 数据属性指定对象类,如下所示:


    ou=Hosts,?one?objectClass=nodeInfo:\
    
    								dbid=nodeinfo_del
    
    	

    将所有这些汇总到一起,nisplusLDAPobjectDN 将如下所示:


    nisplusLDAPobjectDN	nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\
    
    					 							nodeInventory=*:\
    
    											ou=Hosts,?one?objectClass=nodeInfo:\
    
    												dbid=nodeinfo_del
  5. 创建一个将 nodeinfo 数据从 NIS+ 映射到 LDAP 的规则集。模板(来自 netmasks)如下所示:


    nisplusLDAPattributeFromColumn \
    
    		netmasks:	dn=("ipNetworkNumber=%s,", addr), \
    
    						ipNetworkNumber=addr, \
    
    						ipNetmaskNumber=mask, \
    
    						description=comment

    在本例中,ou=Hosts 容器会使情况更复杂,因为 RFC 2307 中规定 dn 中应当包含 IP 地址。但是,IP 地址不存储在 nodeinfo 表中,因此您必须以其他方式获取它。幸运的是,模板文件中的 crednode 映射说明了如何获取 IP 地址。


    nisplusLDAPattributeFromColumn \
    
    		crednode:	dn=("cn=%s+ipHostNumber=%s,", \
    
    								(cname, "%s.*"), \
    
    			ldap:ipHostNumber:?one?("cn=%s", (cname, "%s.*"))), \

    因此,您可以复制 crednode 映射的这一部分。但是,在本例中,cname 列的值是实际的主机名(而非主体名),因此,您不必单独提取 cname 的某个部分,而是可以明确替换属性名和列名,此时 nodeinfo 映射将变为:


    nisplusLDAPattributeFromColumn \
    
    		nodeinfo:	dn=("cn=%s+ipHostNumber=%s,", cname, \
    
    			ldap:ipHostNumber:?one?("cn=%s", cname)), \
    
    				nodeInventory=inventory, \
    
    				nodeOwner=owner
  6. 将数据从 LDAP 映射到 NIS+ 时,模板的 netmasks 项如下所示:


    nisplusLDAPcolumnFromAttribute \
    
    		netmasks:	addr=ipNetworkNumber, \
    
    				mask=ipNetmaskNumber, \
    
    				comment=description

    在替换属性名和列名之后,结果如下所示:


    nisplusLDAPcolumnFromAttribute \
    
    		nodeinfo:	cname=cn, \
    
    				inventory=nodeInventory, \
    
    				owner=nodeOwner
  7. netmasks 的删除规则集如下所示:


    nisplusLDAPattributeFromColumn \
    
    		netmasks_del:	dn=("ipNetworkNumber=%s,", addr), \
    
    				ipNetmaskNumber=

    以上规则集指定当 NIS+ 中的 netmasks 项被删除时,相应 ou=Networks LDAP 项中的 ipNetmaskNumber 属性也会被删除。在本例中,删除的是 nodeInventorynodeOwner 属性。因此,使用步骤 5 中的 dn 规范时,结果如下所示:


    nisplusLDAPattributeFromColumn \
    
    		nodeinfo_del:	dn=("cn=%s+ipHostNumber=%s,", cname, \
    
    			ldap:ipHostNumber:?one?("cn=%s", cname)), \
    
    				nodeInventory=, \
    
    				nodeOwner=

    映射信息完整无缺。

  8. 停止 NIS+ 服务并随后启动它,以便开始使用映射文件。


    # svcadm disable network/rpc/nisplus:default
    

  9. 如果 NIS+ nodeinfo 表中已经有数据,请将这些数据上载到 LDAP 中。将新的 nodeinfo 映射信息放到一个单独的文件 /var/nis/tmpmapping 中。


    # /usr/sbin/rpc.nisd -D -m /var/nis/tmpmapping \
    
    -x nisplusLDAPinitialUpdateAction=to_ldap \
    
    -x nisplusLDAPinitialUpdateOnly=yes
    
  10. 将临时文件 /var/nis/tmpmapping 中的映射信息添加到实际映射文件中。这可以借助于编辑器来完成,也可以按以下方式附加数据(假定实际映射文件为 /var/nis/NIS+LDAPmapping)来完成:


    # cp -p /var/nis/NIS+LDAPmapping \
    
    /var/nis/NIS+LDAPmapping.backup
    

    # cat /var/nis/tmpmapping >> /var/nis/NIS+LDAPmapping
    

    注意 – 注意 –

    请注意双箭头 ">>" 表示重定向。单箭头 ">" 表示将覆写目标文件。


  11. /lib/svc/method/nisplus 文件中添加 -m 选项。还可以根据需要添加 -Y-B 选项。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具

  12. 启动 NIS+ 服务。


    # svcadm enable network/rpc/nisplus:default
    

将配置信息存储到 LDAP 中

除了将 NIS+/LDAP 配置信息保存在配置文件中和命令行上,还可以将配置属性存储到 LDAP 中。如果配置信息由许多 NIS+ 服务器共享,并且将定期进行更改,则这非常有用。

要在 LDAP 中启用对配置属性的存储,请查阅 LDAP 服务器文档并新建下列属性和对象类。配置信息应当位于由 nisplusLDAPconfigDN 值(来自 rpc.nisd 命令行或来自 /lib/svc/method/nisplus)指定的位置中,而且 cn 等于 nisplusLDAPbaseDomain 值(因为 rpc.nisd 守护进程从 LDAP 读取任何配置信息之前,就已经获知了该值)。

LDIF 数据适用于 ldapadd(1)(属性和对象类 OID 仅用于举例说明)。

defaultSearchBasepreferredServerListauthenticationMethod 属性是从“DUA 配置”草稿架构(将成为 IETF 标准)派生的。在任何情况下,以下定义都可以满足 NIS+LDAPmapping(4) 的要求:


dn: cn=schema

changetype: modify

add: attributetypes

attributetypes:	( 1.3.6.1.4.1.11.1.3.1.1.1 NAME 'defaultSearchBase' \

		  DESC 'Default LDAP base DN used by a DUA' \

		  EQUALITY distinguishedNameMatch \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.11.1.3.1.1.2 NAME 'preferredServerList' \

		  DESC 'Preferred LDAP server host addresses to be used by a DUA' \

		  EQUALITY caseIgnoreMatch \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.11.1.3.1.1.6 NAME 'authenticationMethod' \

		  DESC 'Identifies the authentication method used to connect to the DSA'\

		  EQUALITY caseIgnoreMatch \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

NIS+/LDAP 配置属性如下所示:


dn: cn=schema

changetype: modify

add: attributetypes

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.0 \

		  NAME 'nisplusLDAPTLS' \

		  DESC 'Transport Layer Security' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.1 \

		  NAME 'nisplusLDAPTLSCertificateDBPath' \

		  DESC 'Certificate file' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.2 \

		  NAME 'nisplusLDAPproxyUser' \

		  DESC 'Proxy user for data store/retrieval' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.3 \

		  NAME 'nisplusLDAPproxyPassword' \

		  DESC 'Password/key/shared secret for proxy user' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.4 \

		  NAME 'nisplusLDAPinitialUpdateAction' \

		  DESC 'Type of initial update' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.5 \

		  NAME 'nisplusLDAPinitialUpdateOnly' \

		  DESC 'Exit after update ?' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.6 \

		  NAME 'nisplusLDAPretrieveErrorAction' \

		  DESC 'Action following an LDAP search error' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.7 \

		  NAME 'nisplusLDAPretrieveErrorAttempts' \

		  DESC 'Number of times to retry an LDAP search' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.8 \

		  NAME 'nisplusLDAPretrieveErrorTimeout' \

		  DESC 'Timeout between each search attempt' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.9 \

		  NAME 'nisplusLDAPstoreErrorAction' \

		  DESC 'Action following an LDAP store error' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.10 \

		  NAME 'nisplusLDAPstoreErrorAttempts' \

		  DESC 'Number of times to retry an LDAP store' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.11 \

		  NAME 'nisplusLDAPstoreErrorTimeout' \

		  DESC 'Timeout between each store attempt' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.12 \

		  NAME 'nisplusLDAPrefreshErrorAction' \

		  DESC 'Action when refresh of NIS+ data from LDAP fails' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.13 \

		  NAME 'nisplusLDAPrefreshErrorAttempts' \

		  DESC 'Number of times to retry an LDAP refresh' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.14 \

		  NAME 'nisplusLDAPrefreshErrorTimeout' \

		  DESC 'Timeout between each refresh attempt' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.15 \

		  NAME 'nisplusNumberOfServiceThreads' \

		  DESC 'Max number of RPC service threads' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.16 \

		  NAME 'nisplusThreadCreationErrorAction' \

		  DESC 'Action when a non-RPC-service thread creation fails' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.17 \

		  NAME 'nisplusThreadCreationErrorAttempts' \

		  DESC 'Number of times to retry thread creation' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.18 \

		  NAME 'nisplusThreadCreationErrorTimeout' \

		  DESC 'Timeout between each thread creation attempt' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.19 \

		  NAME 'nisplusDumpErrorAction' \

		  DESC 'Action when an NIS+ dump fails' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.20 \

		  NAME 'nisplusDumpErrorAttempts' \

		  DESC 'Number of times to retry a failed dump' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.21 \

		  NAME 'nisplusDumpErrorTimeout' \

		  DESC 'Timeout between each dump attempt' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.22 \

		  NAME 'nisplusResyncService' \

		  DESC 'Service provided during a resync' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.23 \

		  NAME 'nisplusUpdateBatching' \

		  DESC 'Method for batching updates on master' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.24 \

		  NAME 'nisplusUpdateBatchingTimeout' \

		  DESC 'Minimum time to wait before pinging replicas' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.25 \

		  NAME 'nisplusLDAPmatchFetchAction' \

		  DESC 'Should pre-fetch be done ?' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.26 \

		  NAME 'nisplusLDAPbaseDomain' \

		  DESC 'Default domain name used in NIS+/LDAP mapping' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.27 \

		  NAME 'nisplusLDAPdatabaseIdMapping' \

		  DESC 'Defines a database id for an NIS+ object' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.28 \

		  NAME 'nisplusLDAPentryTtl' \

		  DESC 'TTL for cached objects derived from LDAP' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.29 \

		  NAME 'nisplusLDAPobjectDN' \

		  DESC 'Location in LDAP tree where NIS+ data is stored' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.30 \

		  NAME 'nisplusLDAPcolumnFromAttribute' \

		  DESC 'Rules for mapping LDAP attributes to NIS+ columns' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetypes:	( 1.3.6.1.4.1.42.2.27.5.42.42.18.31 \

		  NAME 'nisplusLDAPattributeFromColumn' \

		  DESC 'Rules for mapping NIS+ columns to LDAP attributes' \

		  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )



dn: cn=schema

changetype: modify

add: objectclasses

objectclasses:	( 1.3.6.1.4.1.42.2.27.5.42.42.19.0 NAME 'nisplusLDAPconfig' \

		  DESC 'NIS+/LDAP mapping configuration' \

		  SUP top STRUCTURAL MUST ( cn ) \

		  MAY ( preferredServerList $ defaultSearchBase $

authenticationMethod $ nisplusLDAPTLS $ nisplusLDAPTLSCertificateDBPate

$ nisplusLDAPproxyUser $ nisplusLDAPproxyPassword $ nisplusLDAPinitialUpdateAction

$ nisplusLDAPinitialUpdateOnly $ nisplusLDAPretrieveErrorAction

$ nisplusLDAPretrieveErrorAttempts $ nisplusLDAPretrieveErrorTimeout

$ nisplusLDAPstoreErrorAction $ nisplusLDAPstoreErrorAttempts

$ nisplusLDAPstoreErrorTimeout $ nisplusLDAPrefreshErrorAction

$ nisplusLDAPrefreshErrorAttempts $ nisplusLDAPrefreshErrorTimeout

$ nisplusNumberOfServiceThreads $nisplusThreadCreationErrorAction

$ nisplusThreadCreationErrorAttempts $ nisplusThreadCreationErrorTimeout

$ nisplusDumpErrorAction $ nisplusDumpErrorAttempts

$ nisplusDumpErrorTimeout $ nisplusResyncService $ nisplusUpdateBatching

$ nisplusUpdateBatchingTimeout $ nisplusLDAPmatchFetchAction

$ nisplusLDAPbaseDomain $ nisplusLDAPdatabaseIdMapping $ nisplusLDAPentryTtl 

$ nisplusLDAPobjectDN $ nisplusLDAPcolumnFromAttribute !

$ nisplusLDAPattributeFromColumn ) )

创建一个包含以下 LDIF 数据的文件(并用实际的搜索库替换 searchBase,用完全限定的域名替换 domain)。

dn: cn=domain,searchBase

cn: domain

objectClass: top objectClass: nisplusLDAPconfig

将以上文件用作 ldapadd(1) 的输入,以便创建 NIS+/LDAP 配置项。该项最初为空。使用 ldapmodify(1) 添加配置属性。例如,要将 nisplusNumberOfServiceThreads 属性设置为 "32",请创建以下文件(用作 ldapmodify(1) 的输入):

dn: cn=domain, searchBasenisplusNumberOfServiceThreads: 32