系统管理指南:名称和目录服务(DNS、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