JavaScript is required to for searching.
跳过导航链接
退出打印视图
系统管理指南:命名和目录服务(DNS、NIS 和 LDAP)     Oracle Solaris 10 8/11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分关于命名和目录服务

1.  命名和目录服务(概述)

2.  名称服务转换器(概述)

第 2 部分DNS 设置和管理

3.  DNS 设置和管理(参考)

第 3 部分NIS 设置和管理

4.  网络信息服务 (Network Information Service, NIS)(概述)

5.  设置和配置 NIS 服务

6.  管理 NIS(任务)

7.  NIS 疑难解答

第 4 部分LDAP 命名服务的设置和管理

8.  LDAP 命名服务介绍(概述/参考)

9.  LDAP 基本组件和概念(概述)

10.  LDAP 命名服务的规划要求(任务)

11.  为使用 LDAP 客户机设置 Sun Java System Directory Server(任务)

12.  设置 LDAP 客户机(任务)

13.  LDAP 疑难解答(参考)

14.  LDAP 一般参考(参考)

15.  从 NIS 转换为 LDAP(概述/任务)

16.  从 NIS+ 转换为 LDAP

NIS+ 到 LDAP 的转换概述

rpc.nisd 配置文件

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

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

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

创建属性和对象类

NIS+ 到 LDAP 转换入门

/etc/default/rpc.nisd 文件

常规配置

来自 LDAP 的配置数据

服务器选择

验证和安全性

LDAP 和 NIS+ 中的缺省位置

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

错误操作

常规 LDAP 操作控制

/var/nis/NIS+LDAPmapping 文件

nisplusLDAPdatabaseIdMapping 属性

nisplusLDAPentryTtl 属性

nisplusLDAPobjectDN 属性

nisplusLDAPattributeFromColumn 属性

nisplusLDAPcolumnFromAttribute 属性

NIS+ 到 LDAP 迁移方案

如何通过一步操作将所有的 NIS+ 数据转换为 LDAP

如何通过一步操作将所有的 LDAP 数据转换为 NIS+

合并 NIS+ 数据和 LDAP 数据

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

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

复制时间标记

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

配置 Sun Java System Directory Server

指定服务器地址和端口号

安全性和验证

使用 SSL

性能和索引

映射表项以外的 NIS+ 对象

NIS+ 项的所有者、组、访问权限和 TTL

如何将其他项属性存储到 LDAP 中

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

client_infotimezone 表(从 NIS+ 转换为 LDAP)

client_info 属性和对象类

timezone 属性和对象类

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

如何映射非项对象

添加项对象

将配置信息存储到 LDAP 中

A.  Solaris 10 软件中对 DNS、NIS 和 LDAP 的更新

服务管理工具的更改

DNS BIND

pam_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

如何通过一步操作将所有的 LDAP 数据转换为 NIS+

合并 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. 将 LDAP 数据下载到 NIS+ 中。
    # /usr/sbin/rpc.nisd -D -m tmpmap \
    -x nisplusLDAPinitialUpdateAction=from_ldap \
    -x nisplusLDAPinitialUpdateOnly=yes
  4. 启动 NIS+ 服务。
    # svcadm enable network/rpc/nisplus:default

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

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

    以下示例使用 group.org_dir 表。

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

    使用您选择的文件合并过程生成合并的表。如果没有其他工具可用,可以使用 diff(1) 收集 /before/after 文件之间存在差异的部分,然后用文本编辑器手动合并。

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

  7. 将合并后的数据装入到 NIS+ 中。以下示例使用 group 表。
    # nisaddent -m -f /after/group group
  8. 删除在合并之后不应当存在的 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. 对每个包含至少一个必删项的容器,重复上述过程。