本章介绍如何从使用 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_dir 和 timezone.org_dir 除外),对于大多数 NIS+ 安装来说,无需更改该文件或只需进行很小的改动。(有关 client_info.org_dir 和 timezone.org_dir 的信息,请参见client_info 和 timezone 表(从 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 转换工具和服务管理工具。
本章使用了以下术语:
Container(容器)
容器是指 LDAP DIT 中用于存储所有相关项的位置。例如,用户帐户信息通常存储在 ou=People 容器中,而主机地址信息可以存储在 ou=Hosts 容器中。
Netname(网络名)
网络名是安全 RPC(用户或计算机)中可被验证的实体。
Mapping(映射)
映射是指 NIS+ 对象和 LDAP 项之间的关系。例如,passwd.org_dir NIS+ 表中 name 列的数据(如帐户的用户名)与 ou=People 容器中 posixAccount 对象类的 LDAP uid 属性相对应。该配置可以在 name 列和 uid 属性之间建立映射。还可以理解为将 name 列映射到 uid 属性(反之亦然)。
Principal(主体)
主体是指 NIS+(用户或计算机)中可被验证的实体。通常,网络名和主体名之间存在一一对应关系。
/etc/default/rpc.nisd
此文件包含有关 LDAP 服务器和验证、NIS+ 基本域、LDAP 缺省搜索库、异常处理和常规 rpc.nisd 配置(无论 LDAP 映射是否有效,都将应用此配置)的信息。
/var/nis/NIS+LDAPmapping
此文件包含有关在 NIS+ 数据和 LDAP 之间相互映射的信息。 模板文件 (/var/nis/NIS+LDAPmapping.template) 包含除 client_info.org_dir 和 timezone.org_dir 以外的所有标准 NIS+ 对象。请参见client_info 和 timezone 表(从 NIS+ 转换为 LDAP)和 NIS+LDAPmapping(4)。
配置是通过为预定义的属性赋值来完成的。除了配置文件,配置属性还可以从 LDAP 读取(请参见将配置信息存储到 LDAP 中),或者在 rpc.nisd 命令行中通过 -x 选项指定。如果在多个位置中指定了同一个属性,则优先顺序(从高到低)如下所示:
rpc.nisd -x 选项
配置文件
LDAP
与由 NIS+ 到 LDAP 的转换相关联的大多数命令行管理任务都由服务管理工具来管理。有关 SMF 的概述,请参阅System Administration Guide: Basic Administration中的“Managing Services (Overview)”。有关更多详细信息,另请参阅 svcadm(1M) 和 svcs(1) 手册页。
可以使用 svcadm 命令对 NIS+ 到 LDAP 转换服务执行管理操作(如启用、禁用或重新启动)。
使用 -t 选项暂时禁用服务可为服务配置提供一些保护。如果禁用服务时使用了 -t 选项,则将在重新引导后恢复服务的初始设置。如果禁用服务时未使用 -t,则服务在重新引导后仍将保持禁用状态。
NIS+ 故障管理资源标识符 (Fault Managed Resource Identifier, FMRI) 是 svc:/network/rpc/nisplus:<instance>。LDAP 客户机服务的 FMRI 是 svc:/network/ldap/client:<instance>。
可以使用 svcs 命令来查询 NIS+ 的状态。
svcs 命令和输出示例。
# svcs \*nisplus\* STATE STIME FMRI online Sep_01 svc:/network/rpc/nisplus:default |
svcs -l 命令和输出示例。要获得如下所示的输出,必须在 FMRI 中使用实例名称。
# svcs -l network/rpc/nisplus:default fmri svc:/network/rpc/nisplus:default enabled false state disabled next_state none restarter svc:/system/svc/restarter:default dependency require_all/none svc:/network/rpc/keyserv (online) |
可使用 ps 命令检查守护进程是否存在。
# ps -e | grep rpc.nisd root 23320 1 0 Aug 27 ? 16:30 ./ns-slapd -D \ /usr/iplanet/ds5/slapd-lastrev -i /usr/iplanet/ds5/slapd-lastrev/ root 25367 25353 0 15:35:19 pts/1 0:00 grep slapd |
不要将 -f 选项与 ps 结合使用,因为此选项会尝试将用户 ID 转换为名称,从而导致可能无法成功进行更多名称服务查找。
通常,/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 |
如果要在用服务管理工具调用 rpc.nisd 守护进程时包括特定选项,可以使用 svcprop 命令或者修改 /lib/svc/method/nisplus 文件。有关使用 svcprop 命令的更多信息,请参见 svcprop(1) 手册页。以下过程介绍如何修改 /lib/svc/method/nisplus 文件。
成为超级用户或承担等效角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见 System Administration Guide: Security Services中的“Using Role-Based Access Control (Tasks)”。
停止 NIS+ 服务。
# svcadm disable network/rpc/nisplus:default |
打开 /lib/svc/method/nisplus 文件。
使用所选的编辑器。
编辑该文件并添加所需的选项。
将如下内容:
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 选项,因此这两个选项会在系统启动时自动实现。
保存并退出 /lib/svc/method/nisplus 文件。
启动 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 服务器。
除了 defaultSearchBase、preferredServerList 和 authenticationMethod 属性以及 SYNTAX 规范,本章中使用的对象标识符 (object identifier, OID) 仅用于说明。由于尚未指定任何正式的 OID,因此您可以自由使用任何适当的 OID。
有关开始使用 NIS+ 数据的 LDAP 系统信息库所需配置的介绍,请参见 NIS+LDAPmapping(4)。本节中的其余部分更详细地介绍配置文件的组织结构。
/etc/default/rpc.nisd 文件中所有的赋值都属于 attributeName=value 类型。
下列属性控制 rpc.nisd 的常规配置,无论 LDAP 映射是否有效,这些属性都处于活动状态。通常应当让它们保持其缺省值。有关更多信息,请参见 rpc.nisd(4)。
nisplusNumberOfServiceThreads
nisplusThreadCreationErrorAction
nisplusThreadCreationErrorAttempts
nisplusThreadCreationErrorTimeout
nisplusDumpErrorAction
nisplusDumpErrorAttempts
nisplusDumpErrorTimeout
nisplusResyncService
nisplusUpdateBatching
nisplusUpdateBatchingTimeout
下列属性控制如何从 LDAP 读取其他配置属性。这些属性本身不能驻留在 LDAP 中。它们只能从命令行或配置文件中读取。有关更多信息,请参见 rpc.nisd(4)。
nisplusLDAPconfigDN
nisplusLDAPconfigPreferredServerList
nisplusLDAPconfigAuthenticationMethod
nisplusLDAPconfigTLS
nisplusLDAPconfigTLSCertificateDBPath
nisplusLDAPconfigProxyUser
nisplusLDAPconfigProxyPassword
preferredServerList
指定 LDAP 服务器和端口号。
# LDAP server can be found at port 389 # LDAP server can be found at port 389 on the local machine # preferredServerList=127.0.0.1 # Could also be written # preferredServerList=127.0.0.0.1:389 LDAP server on the machine at IP # address "1.2.3.4", at port 65042 # preferredServerList=1.2.3.4:65042 |
authenticationMethod
nisplusLDAPproxyUser
nisplusLDAPproxyPassword
指定验证方法,在适用于所选方法的情况下,还可指定要在 rpc.nisd 守护进程和 LDAP 服务器之间使用的代理用户(绑定的标识名 (distinguished name, DN))和口令(密钥或其他共享秘密)。有关更多信息,请参见安全性和验证。
nisplusLDAPTLS
nisplusLDAPTLSCertificateDBPath
defaultSearchBase
LDAP DIT 中用于存放 RFC 2307 样式的名称服务数据的位置。当未在单独的容器 DN 中指定完整的搜索库时,会使用此缺省位置。有关更多信息,请参见nisplusLDAPobjectDN 属性。
nisplusLDAPbaseDomain
当 NIS+ 对象规范(请参见nisplusLDAPdatabaseIdMapping 属性)未完全限定时使用的缺省 NIS+ 域名。
nisplusLDAPbindTimeout
nisplusLDAPmodifyTimeout
nisplusLDAPaddTimeout
nisplusLDAPdeleteTimeout
以上参数分别是 ldap bind、modify、add 和 delete 操作的超时参数。通常应当让它们保持其缺省值。
nisplusLDAPsearchTimeout
nisplusLDAPsearchTimeLimit
以上第一个参数用于设置 LDAP 搜索操作的超时值,第二个参数用于请求服务器端的搜索时间限制。由于 nisplusLDAPsearchTimeLimit 将控制 LDAP 服务器花在搜索请求上的时间,因此请确保 nisplusLDAPsearchTimeLimit 不小于 nisplusLDAPsearchTimeout。 根据 NIS+ 服务器、LDAP 服务器以及二者之间连接的性能,您可能需要在缺省值的基础上增大搜索限制的值。查看 rpc.nisd 的超时系统日志消息,并根据消息提示来增大这些值。
nisplusLDAPsearchSizeLimit
以上参数请求 LDAP 搜索请求所返回的 LDAP 数据量的限制值。缺省值为请求无限制。 这是服务器端限制。LDAP 服务器可能会强行限制最大值,并且这些限制可能会绑定到所使用的代理用户(绑定 DN)。请确保 LDAP 服务器允许 rpc.nisd 传送足以填充最大容器(具体取决于站点设置,通常是指用于 passwd.org_dir、mail_aliases.org_dir 或 netgroup.org_dir 的容器)的数据。有关更多信息,请查阅 LDAP 服务器文档。
nisplusLDAPfollowReferral
以上参数用于定义在 LDAP 操作导致引用其他 LDAP 服务器时要执行的操作。缺省值为不遵循引用。如果您希望或者需要遵循引用,请启用“遵循引用”。请记住,尽管引用会带来方便,但是它们还会使 rpc.nisd 针对每个请求都与多台 LDAP 服务器通信,从而降低操作速度。rpc.nisd 通常应当直接指向能够处理 rpc.nisd 可能发出的任何 LDAP 请求的 LDAP 服务器。
下列参数定义在 LDAP 操作过程中出现错误时要执行的操作。通常情况下,应使用其缺省值。有关更多信息,请参见 rpc.nisd(4)。
nisplusLDAPinitialUpdateAction
nisplusLDAPinitialUpdateOnly
nisplusLDAPretrieveErrorAction
nisplusLDAPretrieveErrorAttempts
nisplusLDAPretrieveErrorTimeout
nisplusLDAPstoreErrorAction
nisplusLDAPstoreErrorAttempts
nisplusLDAPstoreErrorTimeout
nisplusLDAPrefreshErrorAction
nisplusLDAPrefreshErrorAttempts
nisplusLDAPrefreshErrorTimeout
nisplusLDAPmatchFetchAction
以上参数用于确定是否应当针对 NIS+ 匹配操作来预先提取 LDAP 数据。在大多数情况下,应保留其缺省值。有关更多信息,请参见 rpc.nisd(4)。
提供的缺省 NIS+LDAPmapping 文件可充当 NIS+/LDAP 映射的主转换器。
如果使用非缺省映射文件,则必须编辑 /lib/svc/method/nisplus 脚本,以在 rpc.nisd 行中使用 -m mappingfile 选项指定映射文件的名称。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具。
对于应当映射到 LDAP 或从 LDAP 映射的每个 NIS+ 对象,NIS+LDAPmapping 文件将指定两到五个属性,具体取决于该对象以及缺省值是否满足需要。
必须设置一个要在其他映射属性中使用的别名。如果 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_table 和 rpc 定义为 rpc.org_dir 表的别名。后面的定义清楚表明将 rpc_table 用于 rpc.org_dir 表对象,将 rpc 用于该表中的各项。
由于 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 中查询该项。
对于每个映射的 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 属性的值),搜索范围为 base,ObjectClass 属性的值为 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 数据。nisplusLDAPobjectDN 的 dbid=user_attr_del 部分说明在删除 user_attr.org_dir NIS+ 表中的某个项时,应当按照 user_attr_del 数据库 ID 所标识的规则集内的规则删除相应的 LDAP 项(如果有的话)。有关更多信息,请参见nisplusLDAPcolumnFromAttribute 属性。
nisplusLDAPattributeFromColumn 指定用于将 NIS+ 数据映射到 LDAP 的规则。其他方向的映射规则由 nisplusLDAPcolumnFromAttribute 控制。
nisplusLDAPcolumnFromAttribute 指定用于将 LDAP 数据映射到 NIS+ 的规则。
完整的项映射语法可以在 NIS+LDAPmapping(4) 中找到。但是,使用几个示例可以更清楚地解释映射语法。
NIS+ rpc.org_dir 表中包含四个名为 cname、name、numbe 和 comment 的列。因此,NIS+ RPC 程序号 (100300) 的标准名称为 nisd、别名为 rpc.nisd 和 nisplusd 的项可以由 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 |
oncRpcNumber 和 description 属性值只是相应 NIS+ 列的简单赋值。rpc.nisd 会将多个 NIS+ 项收集到一个 LDAP 项中,并用多个 cn 值来表示不同的 name 列值。
同样,从 LDAP 到 NIS+ 的映射将如下所示:
nisplusLDAPcolumnFromAttribute \ rpc: cname=cn, \ (name)=(cn), \ number=oncRpcNumber, \ comment=description |
以上示例会将 oncRpcNumber 和 description 值赋予相应的 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 项被删除时,SolarisUserQualifier、SolarisAttrReserved1、SolarisAttrReserved2 和 SolarisAttrKeyValue 属性(如果有的话)会从以下规则所指定的 ou=People 项中删除:
dn=("uid=%s,", name) |
LDAP 项的其余部分保持不变。
以下列出了从 NIS+ 迁移到 LDAP 时可能的迁移方案:
通过一次操作将所有的 NIS+ 客户机转换为使用 LDAP。可以使用 rpc.nisd 守护进程来上载 LDAP 中尚不存在的任何 NIS+ 数据。请参见如何通过一个操作将所有的 NIS+ 数据转换为 LDAP。
从 NIS+ 逐步迁移到 LDAP。 首先将 NIS+ 数据转换为 LDAP(请参见如何通过一个操作将所有的 NIS+ 数据转换为 LDAP)。 可以使 NIS+ 客户机和 LDAP 客户机共享相同的名称服务数据,并使 rpc.nisd 自动保持 NIS+ 数据和 LDAP 数据同步。NIS+ 最初可能是授权的名称服务,LDAP 服务器则维护 NIS+ 数据的副本以便于 LDAP 客户机使用。在适当的时候,可以使 LDAP 成为授权的名称服务,并逐步取消 NIS+ 服务,直到不再有 NIS+ 客户机。
LDAP 已经用作名称服务,因此您需要合并 NIS+ 数据和 LDAP 数据。有三种可能的方法来执行此合并。
将 NIS+ 数据添加到 LDAP 中。将 NIS+ 中存在而 LDAP 中不存在的项添加到 LDAP 中。NIS+ 和 LDAP 中均存在但是具有不同数据的项以保留 NIS+ 数据告终。请参见如何通过一个操作将所有的 NIS+ 数据转换为 LDAP。
使用 LDAP 数据覆写 NIS+ 数据。如果某些项在 NIS+ 中存在,而在 LDAP 中不存在,它们将从 NIS+ 中消失。在 NIS+ 和 LDAP 中均存在的项以保留 LDAP 数据告终。请参见如何通过一步操作将所有的 LDAP 数据转换为 NIS+。
合并 NIS+ 数据和 LDAP 数据并逐一解决冲突。请参见合并 NIS+ 数据和 LDAP 数据。
使用 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 属性。
使用 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+ 数据的备份放到 /nisbackup 目录中。
/etc/default/rpc.nisd 和 /var/nis/tmpmap 中已经存在有效的映射配置(对于应当合并的表)。
在合并之前将 NIS+ 数据以平面文件形式存储到 /before 中,在合并之后将其以平面文件形式存储到 /after 中。
niscat 用于转储以平面文件形式表示的自定义 NIS+ 表,这些表不受 nisaddent(1M) 支持。可以使用自己的命令或脚本,来从 NIS+ 装入这样的自定义表或者将这些表转储到 NIS+ 中。如果是这样,则这些命令/脚本应当优先于 niscat 使用,因为 niscat 没有将数据方便地重新装入到 NIS+ 中的相应命令。
如果不得不使用 niscat(1) 来转储数据,则可以使用 nistbladm(1) 将项逐个重新装入到 NIS+ 中。
命令路径中包括 /usr/lib/nis(这是 nisaddent(1M) 所在的位置)。
如果 LDAP 数据在步骤 4 的下载和步骤 10 的上载之间发生变化,则上载过程可能会覆写这些更改。因此,应当尽量避免在该过程中修改 LDAP 数据。有关更多信息,请查阅 LDAP 服务器文档。
使用 nisbackup 命令备份所有的 NIS+ 数据。
# nisbackup -a /nisbackup |
标识那些包含必须与 LDAP 合并的数据的 NIS+ 表。将这些表的内容转储到平面文件中。例如,使用 nisaddent,按以下方式转储 group.org_dir 的内容:
# nisaddent -d group | sort > /before/group |
将 nisaddent 输出传输到 sort 将便于稍后进行比较。
停止 NIS+ 服务。
# svcadm disable network/rpc/nisplus:default |
将 LDAP 数据下载到 NIS+ 中。
# /usr/sbin/rpc.nisd -D -m tmpmap \ -x nisplusLDAPinitialUpdateAction=from_ldap \ -x nisplusLDAPinitialUpdateOnly=yes |
启动 NIS+ 服务。
# svcadm enable network/rpc/nisplus:default |
rpc.nisd 守护进程现在将为从 LDAP 下载的数据提供服务。如果不应当将 NIS+ 客户机向需要解决的冲突数据公开,请确保在活动 NIS+ 客户机很少(最好没有)时执行此步骤和后面的几个步骤。
转储受到影响的表中的 NIS+ 数据。
以下示例使用 group.org_dir 表。
# nisaddent -d group | sort > /after/group |
创建这些表的合并版本。
使用所选的文件合并过程来生成合并后的表。如果没有其他工具,则可以使用 diff(1) 来收集 /before 和 /after 文件之间的不同部分,并用文本编辑器手动合并。
以下示例假定合并结果位于 /after 中。
将合并后的数据装入到 NIS+ 中。以下示例使用 group 表。
# nisaddent -m -f /after/group group |
删除在合并之后不应当存在的 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-address 和 bind-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. 对于至少包含一个必须删除的项的容器,重复上述过程。
将合并后的 NIS+ 数据上载到 LDAP 中。
(可选)根据需要编辑 /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 转换工具和服务管理工具。
启动 NIS+ 服务。
# svcadm enable network/rpc/nisplus:default |
只允许 NIS+ 主服务器将数据写入 LDAP 中。NIS+ 副本服务器可以从 NIS+ 主服务器获取更新(此更新可能是从 LDAP 获取的,也可能不是),也可以直接从 LDAP 服务器读取数据。也可能会存在这两种情况的组合。因此,可通过两种主要方法来安排 NIS+ 复制。
保持 NIS+ 副本服务器不变,并使其从 NIS+ 主服务器获取数据更新。
这种安排的优点在于配置简单(只有 NIS+ 主服务器需要与 LDAP 服务器建立连接),并且还可保持以前的复制关系(主服务器先于副本服务器获知新数据)。当 NIS+ 始终是名称服务数据的授权源时,这种安排可能是最方便的解决方案。但是,此方案也会延长 LDAP 与 NIS+ 副本服务器之间的路径。
使 NIS+ 副本服务器直接从 LDAP 而非 NIS+ 主服务器获取其数据。
在这种情况下,副本服务器可能已在 NIS+ 主服务器之前或之后更新了数据,具体取决于查找通信流量和从 LDAP 派生的数据的 TTL。这种安排更为复杂,但是,如果 LDAP 是授权的名称服务系统信息库,而且很少或不对 NIS+ 数据进行直接更新,则这种安排非常方便。
如果 NIS+ 副本服务器是从 LDAP 为特定 NIS+ 目录中至少一个对象获取数据,则 nisping(1M) 列显的更新时间标记不必指示 NIS+ 主服务器和副本服务器之间数据的一致程度。例如,假定 NIS+ 目录 dir1 中包含 table1 和 table2 表。如果副本服务器是从 NIS+ 主服务器获取 table1 和 table2 的数据,则可能会看到类似以下的输出:
# 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 获取 table1 和 table2 中任意一个表的数据或同时获取二者的数据,则输出中仅显示副本服务器已从主服务器接收了 NIS_PING,并且更新了其重新同步时间标记以进行内务处理。如果符合以下任一条件,从 LDAP 映射的一个或多个表中的数据可能会与 NIS+ 主服务器中的数据不同:
LDAP 数据与 NIS+ 主服务器中的数据不同。
副本服务器的高速缓存(NIS+ 数据库的本地版本)中存在尚未过期但与 LDAP 不同步的数据。
如果您不接受这种类型的数据不一致,请允许所有的 NIS+ 副本服务器仅从 NIS+ 主服务器获取其数据。在已经配置 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 文档集合。
可以使用 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 验证:
none
none 验证方法为缺省方法。虽然使用 none 无需进行任何设置,但是它并不提供安全性。它仅适用于根本没有安全要求的环境。
要使用 none 验证,请确保 authenticationMethod 属性具有以下值:
authenticationMethod=none |
至少需要实际提供一定安全性的验证方法通常要求您将共享秘密(口令或密钥)与 LDAP 中的 DN 相关联。选择用于 rpc.nisd 守护进程的 DN 可以是唯一的,也可以用于其他目的。它应当具有支持预期的 LDAP 通信流量所必需的相应功能。例如,如果 rpc.nisd 守护进程应当能够向 LDAP 中写入数据,则所选 DN 必须有权在用于 NIS+ 数据的容器中添加/更新/删除 LDAP 数据。此外,在缺省情况下,LDAP 服务器可能会对资源使用情况施加限制(如搜索时间限制或搜索结果大小限制)。如果属于这种情况,则所选 DN 必须具有足够的能力来支持对 NIS+ 数据容器进行枚举。
simple
simple 验证方法通过交换未经加密的口令字符串来提供验证。由于口令在 LDAP 客户机(rpc.nisd 守护进程)和 LDAP 服务器之间以明文形式发送,因此,只有当 NIS+ 和 LDAP 服务器之间的信息交换受到某种其他方法的保护时,simple 方法才适用。
例如,对 LDAP 通信流量进行传输层加密,或者 NIS+ 和 LDAP 服务器是同一个系统,并且 NIS+/LDAP 通信流量保持在内核中(非授权用户无法看到)。
借助于要用于 simple 验证的 DN 和口令来修改 rpc.nisd 守护进程的配置。例如,如果 DN 是 cn=nisplusAdmin,ou=People,dc=some,dc=domain,口令是 aword,请设置以下内容:
authenticationMethod=simple nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain nisplusLDAPproxyPassword=aword |
一定要防止对口令的存储位置进行未经授权的访问。请记住,如果口令是在 rpc.nisd 命令行上指定的,那么,系统上的任何用户都可以通过诸如 ps(1) 之类的命令来查看口令。
sasl/digest-md5
sasl/digest-md5 验证方法使用 digest/md5 算法来提供验证。
有关如何设置要与 digest-md5 一起使用的授权标识以及如何修改 /etc/default/rpc.nisd 文件以指定此标识及其相关口令的信息,请查阅 LDAP 服务器文档。
authenticationMethod=sasl/digest-md5 nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain nisplusLDAPproxyPassword=aword |
一定要防止对用于存储口令的文件进行未经授权的访问。
sasl/cram-md5
使用 cram/md5 算法进行验证。可能只有过时的 SunDS LDAP 服务器才支持此验证方法。
有关如何设置要与 cram-md5 一起使用的绑定 DN 以及如何修改 /etc/default/rpc.nisd 文件以指定此 DN 及其相关口令的信息,请查阅 LDAP 服务器文档。
authenticationMethod=sasl/cram-md5 nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain nisplusLDAPproxyPassword=aword |
一定要防止对用于存储口令的文件进行未经授权的访问。
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 与其他验证方法(simple 和 sasl/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
server-address
/etc/default/rpc.nisd 中 preferredServerList 值的 IP 地址部分
bind-DN
/etc/default/rpc.nisd 中的 nisplusLDAPproxyUser 值
password
/etc/default/rpc.nisd 中的 nisplusLDAPproxyPassword 值
container
RFC 2307 容器名(ou=Services、ou=Rpc 等等)之一
search-base
/etc/default/rpc.nisd 中的 defaultSearchBase 值
由 /bin/time 列显的“实际”值是经过的(挂钟)时间。如果此值超出相应表项 TTL 很大一部分(25% 或更多)(请参见验证和安全性),那么,为 LDAP 容器创建索引可能会非常有用。
rpc.nisd 支持 simple page 和 VLV 索引方法。要查找 rpc.nisd 支持哪种索引方法以及如何创建这样的索引,请参阅 LDAP 服务器文档。
可以将表项以外的 NIS+ 对象存储在 LDAP 中。但是,除非您还拥有可从 LDAP 获取这些 NIS+ 对象的 NIS+ 副本服务器,否则这样做没有多大意义。建议使用以下选项:
没有副本服务器,或者副本服务器仅从 NIS+ 主服务器获取其数据。
编辑映射配置文件(请参见 NIS+LDAPmapping(4))以删除所有非表项对象的下列属性值。
nisplusLDAPdatabaseIdMapping nisplusLDAPentryTtl nisplusLDAPobjectDN |
例如,如果是从 /var/nis/NIS+LDAPmapping.template 文件开始操作的,则需要删除(或通过加注释来禁用)以下部分:
# Standard NIS+ directories nisplusLDAPdatabaseIdMapping basedir: . . . |
nisplusLDAPdatabaseIdMapping user_attr_table:user_attr.org_dir |
nisplusLDAPdatabaseIdMapping audit_user_table:audit_user.org_dir # Standard NIS+ directories nisplusLDAPentryTtl basedir:21600:43200:43200 . . . |
nisplusLDAPentryTtl user_attr_table:21600:43200:43200 nisplusLDAPentryTtl audit_user_table:21600:43200:43200 # Standard NIS+ directories nisplusLDAPobjectDN basedir:cn=basedir,ou=nisPlus,?base?\ |
objectClass=nisplusObjectContainer:\ cn=basedir,ou=nisPlus,?base?\ objectClass=nisplusObjectContainer,\ objectClass=top . . . |
nisplusLDAPobjectDN audit_user_table:cn=audit_user,ou=nisPlus,?base?\ objectClass=nisplusObjectContainer:\ cn=audit_user,ou=nisPlus,?base?\ objectClass=nisplusObjectContainer,\ objectClass=top |
NIS+ 副本服务器从 LDAP 服务器获取其数据。
创建 nisplusObject 属性和 nisplusObjectContainer 对象类,如以下示例中所示(LDIF 数据适用于 ldapadd( 1)。属性和对象类 OID 仅用于说明。)
dn: cn=schema changetype: modify add: attributetypes attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.1.0 NAME 'nisplusObject' DESC 'An opaque representation of an NIS+ object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE ) |
dn: cn=schema changetype: modify add: objectclasses |
objectclasses: (1.3.6.1.4.1.42.2.27.5.42.42.2.0 NAME'nisplusObjectContainer' |
SUP top STRUCTURAL DESC 'Abstraction of an NIS+ object' MUST ( cn $ nisplusObject ) ) |
还需要为 NIS+ 对象创建容器。以下 LDIF 语法说明如何创建 ou=nisPlus,dc=some,dc=domain 容器,此语法可用作 ldapadd (1) 的输入。
dn: ou=nisPlus,dc=some,dc=domain ou: nisPlus objectClass: top objectClass: organizationalUnit |
如果 NIS+ 表项是从 LDAP 数据创建的,则缺省行为是使用项对象所在表对象中的属主、组、访问权限和 TTL 来初始化项对象的相应值。这通常是足够的,但也可能会存在必须单独设置这些 NIS+ 项属性的情况。例如,当站点不使用 rpc.nispasswdd(1M) 守护进程时。为了允许个别用户更改其 NIS+ 口令(并重新加密存储在 cred.org_dir 表中的 Diffie-Hellman 密钥),该用户应当拥有自己的 passwd.org_dir 和 cred.org_dir 项,而且对这些项必须拥有与项属主相同的修改权限。
如果您需要将一个或多个 NIS+ 表中表项的属主、组、访问权限或 TTL 存储在 LDAP 中,则需要执行以下操作。
请查阅 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 ) ) |
修改相关表的 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 |
编辑 nisplusLDAPattributeFromColumn 和 nisplusLDAPcolumnFromAttribute 属性值,以指定所需的属主、组、访问权限或 TTL 的任何子集。
在步骤 2 中,创建了用于存储这些值的 LDAP 属性。对于 NIS+,存在几个名称分别为 zo_owner、zo_group、zo_access 和 zo_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 |
[[将属主、组、访问权限和/或 TTL 项数据上载到 LDAP 中。]]
有关更多信息,请参见如何通过一个操作将所有的 NIS+ 数据转换为 LDAP。
重新启动 NIS+ 服务,以便使对映射进行的更改生效。
# svcadm restart network/rpc/nisplus:default |
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+ 安装要求,但在某些情况下,该方法也会失败,如下所示:
cred.org_dir 表的属主名称不属于由 cred.org_dir 表中的主体和网络名共享的域。对于子域中的 cred.org_dir 表,如果属主是来自父域的主体,可能会出现这种情况。 此问题可通过以下方法之一来解决:
更改 cred.org_dir 表的属主,使其与该表中项的域一致。
更改 cred.org_dir 数据库 ID 的映射规则,以使用某个其他 NIS+ 对象(如果不存在合适的对象,可能会针对此目的专门创建一个)的属主。
例如,如果 sub.dom.ain. 域中的 cred.org_dir 表由 master.dom.ain. 拥有,但是 cred.org_dir.sub.dom.ain. 中的主体和网络名应当属于 sub.dom.ain,则可以按以下方式创建一个链接对象:
# nisln cred.org_dir.sub.dom.ain. \ credname.sub.dom.ain. |
按以下方式将链接对象的属主设置为 sub.dom.ain. 中的相应主体:
# nischown trusted.sub.dom.ain. credname.sub.dom.ain. |
编辑映射文件。将以下内容:
(nis+:zo_owner[]cred.org_dir, "*.%s")), \ |
更改为:
(nis+:zo_owner[]credname.sub.dom.ain., "*.%s")), \ |
请注意,名为 credname 的链接对象仅用于举例说明,可以使用任何有效的对象类型(项对象除外)和对象名称。要点是将对象的属主设置为具有正确的域名。
如果不想将所有权(甚至特殊用途对象的所有权)赋予来自主体和网络名所用域中的主体,请按照以下详细说明来创建 nisplusPrincipalName 和 nisplusNetname 属性。
cred.org_dir 表中包含属于多个域的主体和网络名。
请查阅 LDAP 服务器的文档,并创建 nisplusPrincipalName 和 nisplusNetname 属性以及 nisplusAuthName 对象类。(以下是 ldapadd 的 LDIF 数据。属性和对象类 OID 仅用于说明。)
dn: cn=schema changetype: modify add: attributetypes attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.7.0 NAME 'nisplusPrincipalName' \ DESC 'NIS+ principal name' \ SINGLE-VALUE \ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) |
attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.9.0 NAME 'nisplusNetname' \ DESC 'Secure RPC netname' \ SINGLE-VALUE \ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) dn: cn=schema changetype: modify add: objectclasses objectclasses: ( 1.3.6.1.4.1.42.2.27.5.42.42.10.0 NAME 'nisplusAuthName' \ SUP top AUXILLIARY DESC 'NIS+ authentication identifiers' \ MAY ( nisplusPrincipalName $ nisplusNetname ) ) |
现在,需要启用 cred.org_dir 映射,以便使用新创建的 nisplusNetname 和 nisplusPrincipalName 属性。模板映射文件 /var/nis/NIS+LDAPmapping.template 中包含用于此目的的已取消注释的行。请参见 credlocal、creduser 和 crednode 数据库 ID 的 nisplusObjectDN 和 nisplusLDAPattributeFromColumn/nisplusLDAPcolumnFromAttribute 属性值。在对映射文件进行编辑以获得此效果之后,重新启动 NIS+ 服务。不要忘记编辑 /lib/svc/method/nisplus 文件,以便根据需要包括 -m 和 -Y 选项或者使用 svcprop 命令。有关详细信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具。
# svcadm restart network/rpc/nisplus:default |
由于 RFC 2307 不为保存在 NIS+ client_info.org_dir 和 timezone.org_dir 表中的信息提供架构,因此在缺省情况下,不会在模板映射文件 (/var/nis/NIS+LDAPmapping.template) 中启用对这些表的映射。如果您希望将 client_info 和 timezone 信息保存到 LDAP 中,请查阅 LDAP 服务器文档,并新建以下各节中讨论的属性和对象类。
按以下方式创建属性和对象类,然后为 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 数据创建容器。建议的容器名称是 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 数据。
模板映射文件 /var/nis/NIS+LDAPmapping.template 中包含 所有标准 NIS+ 对象的映射信息。为了支持对特定于站点或应用程序的对象进行映射,将需要添加新的映射项。对于非项(即,目录、组、链接或表)对象来说,此任务非常简单,但是对于项对象来说,如果相应项数据的 LDAP 组织与 NIS+ 所使用的组织有很大区别,则此任务会变得较为复杂。以下示例说明非项对象的简单情况。
查找要映射的对象的全限定名。
如果此名称位于由 nisplusLDAPbaseDomain 属性指定的域名下面,则可以省略等于 nisplusLDAPbaseDomain 值的部分。
例如,如果 nisplusLDAPbaseDomain 的值为 some.domain.,要映射的对象是名为 nodeinfo.some.domain. 的表,则对象名可以缩短为 nodeinfo。
创建用于标识对象的数据库 ID。
数据库 ID 对于所使用的映射配置必须唯一,而没有进行其他方面的解释。它不显示在 LDAP 数据中。为了避免与项对象映射混淆,请创建一个用于标识表对象属性(而非表项)的数据库 ID 并在末尾处使用解释性字符串(如 _table)。
在本示例中,使用的是数据库 ID nodeinfo_table,并通过添加以下内容在该数据库 ID 和标准映射文件位置 (/var/nis/NIS+LDAPmapping) 中的对象之间建立连接:
nisplusLDAPdatabaseIdMapping nodeinfo_table:nodeinfo.some.domain. |
假定 nisplusLDAPbaseDomain 为 some.domain.,则以下内容也有效:
nisplusLDAPdatabaseIdMapping nodeinfo_table:nodeinfo |
确定适合该对象的 TTL。
在这段时间内,rpc.nisd 守护进程会将该对象的本地副本视为有效。在 TTL 过期之后,再次引用该对象会启动 LDAP 查找功能以刷新该对象。
有两个不同的 TTL 值:第一个值是在 rpc.nisd 守护进程(在重新引导或重新启动之后)首次从磁盘中装入该对象时设置的,第二个值与从 LDAP 执行的所有刷新有关。第一个 TTL 是从所配置的范围中随机选择的。例如,如果 nodeinfo_table 应当在初始装入之后的一到三个小时内以及此后的十二个小时内有效,则需要指定如下内容:
nisplusLDAPentryTtl nodeinfo_table:3600:10800:43200 |
确定对象数据在 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。
(如果尚未在 NIS+ 中创建要映射的 NIS+ 对象,请跳过此步骤。)将对象数据存储到 LDAP 中。可以使用 rpc.nisd 守护进程来存储对象数据,但是使用 nisldapmaptest(1M) 实用程序会更方便,因为您可以使 rpc.nisd 守护进程保持运行状态。
# nisldapmaptest -m /var/nis/NIS+LDAPmapping -o -t nodeinfo -r |
-o 选项指定表对象本身(而非表项)。
检验对象数据是否存储在 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> |
重新启动 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 属性,nodeInventory 和 nodeOwner 是 MAY 属性。
为了将现有的 nodeinfo 数据上载到 LDAP 中,在单独的文件中新建映射属性将会很方便。例如,可以使用 /var/nis/tmpmapping。
创建一个数据库 ID 来标识要映射的 NIS+ 表。
nisplusLDAPdatabaseIdMapping nodeinfo:nodeinfo |
为 nodeinfo 表中的项设置 TTL。由于极少对这些信息进行更改,因此请将 TTL 设置为十二个小时。当 rpc.nisd 守护进程首次从磁盘中加载 nodeinfo 表时,该表中项的 TTL 将随机选择为六到十二个小时之间的值。
nisplusLDAPentryTtl nodeinfo:21600:43200:43200 |
标识与要创建的映射具有相似属性的现有映射。在本示例中,映射属性值非常简单(直接赋值),而将 LDAP 数据存储到现有容器中则较为复杂,因此,在删除 nodeinfo 数据的过程中一定要格外小心。如果不希望删除整个 ou=Hosts 项,而只希望删除 nodeInventory 和 nodeOwner 属性,则将需要一个特殊的删除规则集。
总之,就是要查找一个共享容器且具有删除规则集的映射。一个可能的备选项就是 netmasks 映射,该映射共享 ou=Networks 容器,而且确实具有一个删除规则集。
模板映射 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 |
创建一个将 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 |
将数据从 LDAP 映射到 NIS+ 时,模板的 netmasks 项如下所示:
nisplusLDAPcolumnFromAttribute \ netmasks: addr=ipNetworkNumber, \ mask=ipNetmaskNumber, \ comment=description |
在替换属性名和列名之后,结果如下所示:
nisplusLDAPcolumnFromAttribute \ nodeinfo: cname=cn, \ inventory=nodeInventory, \ owner=nodeOwner |
netmasks 的删除规则集如下所示:
nisplusLDAPattributeFromColumn \ netmasks_del: dn=("ipNetworkNumber=%s,", addr), \ ipNetmaskNumber= |
以上规则集指定当 NIS+ 中的 netmasks 项被删除时,相应 ou=Networks LDAP 项中的 ipNetmaskNumber 属性也会被删除。在本例中,删除的是 nodeInventory 和 nodeOwner 属性。因此,使用步骤 5 中的 dn 规范时,结果如下所示:
nisplusLDAPattributeFromColumn \ nodeinfo_del: dn=("cn=%s+ipHostNumber=%s,", cname, \ ldap:ipHostNumber:?one?("cn=%s", cname)), \ nodeInventory=, \ nodeOwner= |
映射信息完整无缺。
停止 NIS+ 服务并随后启动它,以便开始使用映射文件。
# svcadm disable network/rpc/nisplus:default |
如果 NIS+ nodeinfo 表中已经有数据,请将这些数据上载到 LDAP 中。将新的 nodeinfo 映射信息放到一个单独的文件 /var/nis/tmpmapping 中。
# /usr/sbin/rpc.nisd -D -m /var/nis/tmpmapping \ -x nisplusLDAPinitialUpdateAction=to_ldap \ -x nisplusLDAPinitialUpdateOnly=yes |
将临时文件 /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 |
请注意双箭头 ">>" 表示重定向。单箭头 ">" 表示将覆写目标文件。
向 /lib/svc/method/nisplus 文件中添加 -m 选项。还可以根据需要添加 -Y 或 -B 选项。有关更多信息,请参见NIS+ 到 LDAP 转换工具和服务管理工具。
启动 NIS+ 服务。
# svcadm enable network/rpc/nisplus:default |
除了将 NIS+/LDAP 配置信息保存在配置文件中和命令行上,还可以将配置属性存储到 LDAP 中。如果配置信息由许多 NIS+ 服务器共享,并且将定期进行更改,则这非常有用。
要在 LDAP 中启用对配置属性的存储,请查阅 LDAP 服务器文档并新建下列属性和对象类。配置信息应当位于由 nisplusLDAPconfigDN 值(来自 rpc.nisd 命令行或来自 /lib/svc/method/nisplus)指定的位置中,而且 cn 等于 nisplusLDAPbaseDomain 值(因为 rpc.nisd 守护进程从 LDAP 读取任何配置信息之前,就已经获知了该值)。
LDIF 数据适用于 ldapadd(1)(属性和对象类 OID 仅用于举例说明)。
defaultSearchBase、preferredServerList 和 authenticationMethod 属性是从“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