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

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