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

部件 IV LDAP 名称服务的设置和管理

本部分提供了有关 LDAP 名称服务的概述。此外,还介绍了有关 Solaris OS 中 LDAP 名称服务的安装、配置、管理及疑难解答,重点介绍如何使用 Sun JavaTM System Directory Server(即先前的 Sun ONE Directory Server)。

第 8 章 LDAP 名称服务介绍(概述/参考)

有关 LDAP 的各章介绍了如何设置 Solaris LDAP 名称服务客户机以使其与 Sun Java System Directory Server(以前称为 Sun ONE Directory Server)协作。但是,尽管建议使用 Sun Java System Directory Server,但这不是必需的。第 14 章,LDAP 一般参考(参考)中简要说明了目录服务器的一般要求。


注意 –

目录服务器不一定是 LDAP 服务器。但是,在这些章的上下文中,术语“目录服务器”与“LDAP 服务器”同义。


目标用户

有关 LDAP 名称服务的各章是为已经熟悉 LDAP 的系统管理员编写的。以下列出了用户必须非常熟悉的部分概念。如果不熟悉这些概念,使用本指南在 Solaris 系统中部署 LDAP 名称服务可能会遇到困难。

建议的背景读物

要更多地了解上述任一概念或者学习 LDAP 及目录服务部署的一般知识,请参阅以下文献:

其他先决条件

如果需要安装 Sun Java System Directory Server,请参阅所使用的 Sun Java System Directory Server 版本的安装指南

LDAP 名称服务与其他名称服务的比较

下表对 DNS、NIS、NIS+ 和 LDAP 名称服务进行了比较。

 

DNS 

NIS 

NIS+ 

LDAP 

名称空间

分层 

不分层 

分层 

分层 

数据存储

文件/资源记录 

包含 2 列的映射 

包含多列的表 

目录(视情况而定) 

索引数据库 

服务器

主/从 

主/从 

根主/ 

非根主;主/ 

辅助;高速缓存/存根 

主/副本 

多主副本 

安全性

无 

无(根或不包含任何内容) 

安全 RPC (AUTH_DH) 

验证  

SSL(视情况而定) 

传输

TCP/IP 

RPC 

RPC 

TCP/IP 

范围

全局 

LAN 

LAN 

全局 

LDAP 名称服务的优点

LDAP 名称服务的限制

以下是与 LDAP 名称服务相关联的一些限制:


注意 –

目录服务器(LDAP 服务器)不能是其自身的客户机。即,不能将运行目录服务器软件的计算机配置为 LDAP 名称服务客户机。


设置 LDAP 名称服务(任务列表)

任务 

参考 

确认是否已安装了修补程序 

  

规划网络模型 

规划 LDAP 网络模型

规划 DIT 

第 10 章,LDAP 名称服务的规划要求(任务)

设置副本服务器 

LDAP 和副本服务器

规划安全模型 

规划 LDAP 安全模型

选择客户机配置文件和缺省属性值 

规划 LDAP 的客户机配置文件和缺省属性值

规划数据填充 

规划 LDAP 数据填充

配置 Sun Java System Directory Server 之后,再将其用于 LDAP 名称服务 

Sun ONE Directory Server 5.2 (Solaris Edition)

设置 Sun Java System Directory Server,使其与 LDAP 名称客户机一起使用 

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

管理打印机项 

管理打印机项

初始化 LDAP 客户机 

初始化 LDAP 客户机

使用配置文件初始化客户机 

使用配置文件初始化客户机

手动初始化客户机  

手动初始化客户机

取消对客户机的初始化 

取消客户机初始化

使用服务搜索描述符修改客户机配置文件 

使用服务搜索描述符来修改客户机对各个服务的访问

检索名称服务信息 

检索 LDAP 名称服务信息

自定义客户机环境 

自定义 LDAP 客户机环境

第 9 章 LDAP 的基本组件和概念(概述)

本章包含以下主题:

LDAP 数据交换格式 (LDAP Data Interchange Format, LDIF)

LDIF 是一种基于文本的格式,用于描述目录服务实体及其属性。使用 LDIF 格式,可以借助 ldapaddldapmodify 等命令将信息从一个目录移到另一个目录。下面是每个服务的 LDIF 格式示例。使用带有 -l 选项的 ldaplist(1) 可以显示以下信息:

% ldaplist -l hosts myhost


hosts



dn: cn=myhost+ipHostNumber=7.7.7.115,ou=Hosts,dc=mydc,dc=mycom,dc=com

cn: myhost

iphostnumber: 7.7.7.115

objectclass: top

objectclass: device

objectclass: ipHost

description: host 1 - floor 1 - Lab a - building b

% ldaplist -l passwd user1


passwd



dn: uid=user1,ou=People,dc=mydc,dc=mycom,dc=com

uid: user1

cn: user1

userpassword: {crypt}duTx91g7PoNzE

uidnumber: 199995

gidnumber: 20

gecos: Joe Smith [New York]

homedirectory: /home/user1

loginshell: /bin/csh

objectclass: top

objectclass: shadowAccount

objectclass: account

objectclass: posixAccount

% ldaplist -l services name


services



dn: cn=name+ipServiceProtocol=udp,ou=Services,dc=mydc,dc=mycom,dc=com

cn: name

cn: nameserver

ipserviceprotocol: udp

ipserviceport: 42

objectclass: top

objectclass: ipService

% ldaplist -l group mygroup


group



dn: cn=mygroup,ou=Group,dc=mydc,dc=mycom,dc=com

cn: mygroup

gidnumber: 4441

memberuid: user1

memberuid: user2

memberuid: user3

userpassword: {crypt}duTx91g7PoNzE

objectclass: top

objectclass: posixGroup

% ldaplist -lnetgroup mynetgroup


netgroup



cn=mynetgroup,ou=netgroup,dc=central,dc=sun,dc=com

objectclass=nisNetgroup

objectclass=top

cn=mynetgroup

nisnetgrouptriple=(user1..mydc.mycom.com,-,)

nisnetgrouptriple=(user1.,-,)

membernisnetgroup=mylab

% ldaplist -l networks 200.20.20.0


networks



dn: ipNetworkNumber=200.20.20.0,ou=Networks,dc=mydc,dc=mycom,dc=com

cn: mynet-200-20-20

ipnetworknumber: 200.20.20.0

objectclass: top

objectclass: ipNetwork

description: my Lab Network

ipnetmasknumber: 255.255.255.0

% ldaplist -l netmasks 201.20.20.0


netmasks



dn: ipNetworkNumber=201.20.20.0,ou=Networks,dc=mydc,dc=mycom,dc=com

cn: net-201

ipnetworknumber: 201.20.20.0

objectclass: top

objectclass: ipNetwork

description: my net 201

ipnetmasknumber: 255.255.255.0

% ldaplist -l rpc ypserv


rpc



dn: cn=ypserv,ou=Rpc,dc=mydc,dc=mycom,dc=com

cn: ypserv

cn: ypprog

oncrpcnumber: 100004

objectclass: top

objectclass: oncRpc

% ldaplist -l protocols tcp


protocols



dn: cn=tcp,ou=Protocols,dc=mydc,dc=mycom,dc=com

cn: tcp

ipprotocolnumber: 6

description: transmission control protocol

objectclass: top

objectclass: ipProtocol

% ldaplist -l bootparams myhost


bootparams



dn: cn=myhost,ou=Ethers,dc=mydc,dc=mycom,dc=com

bootparameter: root=boothost:/export/a/b/c/d/e

objectclass: top

objectclass: device

objectclass: bootableDevice

cn: myhost

% ldaplist -l ethers myhost


ethers



dn: cn=myhost,ou=Ethers,dc=mydc,dc=mycom,dc=com

macaddress: 8:1:21:71:31:c1

objectclass: top

objectclass: device

objectclass: ieee802Device

cn: myhost

% ldaplist -l publickey myhost


publickey



dn: cn=myhost+ipHostNumber=200.20.20.99,ou=Hosts,dc=mydc,dc=mycom,dc=com

cn: myhost

iphostnumber: 200.20.20.99

description: Joe Smith

nispublickey: 9cc01614d929848849add28d090acdaa1c78270aeec969c9

nissecretkey: 9999999998769c999c39e7a6ed4e7afd687d4b99908b4de99

objectclass: top

objectclass: NisKeyObject

objectclass: device

objectclass: ipHost

% ldaplist -l aliases myname


aliases



dn: mail=myname,ou=aliases,dc=mydc,dc=mycom,dc=com

cn: myname

mail: myname

objectclass: top

objectclass: mailgroup

mgrprfc822mailmember: my.name

LDAP 使用全限定域名

与 NIS 或 NIS+ 客户机不同,LDAP 客户机总是 返回主机名的全限定域名 (fully qualified domain name, FQDN)。LDAP FQDN 与 DNS 返回的 FQDN 相似。例如,假设域名为以下形式:


west.example.net

查找主机名 server 时,gethostbyname()getnameinfo() 都将返回 FQDN 版本。


server.west.example.net

此外,如果使用特定于接口的别名(例如 server-#),则将返回一个较长的全限定主机名列表。 如果要使用主机名共享文件系统或者进行类似的其他检查,则必须对这些检查进行说明。例如,如果将非 FQDN 用于本地主机,FQDN 仅用于由 DNS 解析的远程主机,则必须说明二者之间的区别。如果使用与 DNS 不同的域名设置 LDAP,则同一个主机可能会以两个不同的 FQDN 结尾,具体情况取决于查找源。

缺省目录信息树 (Directory Information Tree, DIT)

缺省情况下,Solaris LDAP 客户机在访问信息时假设 DIT 具有给定的结构。对于 LDAP 服务器支持的每个域,都存在一个具有假定结构的子树。不过,通过指定服务搜索描述符 (Service Search Descriptor, SSD) 可以覆盖缺省结构。对于给定域,缺省 DIT 将具有一个用于存放许多已知容器的基本容器,这些已知容器用于存储特定信息类型的项。有关这些子树的名称,请参见下表。(此信息可在 RFC 2307 和其他参考资料中找到。)

表 9–1 DIT 缺省位置

缺省容器 

信息类型 

ou=Ethers

bootparams(4)、ethers(4) 

ou=Group

group(4) 

ou=Hosts

hosts(4)、ipnodes(4) 和主机的 publickey 

ou=Aliases

aliases(4) 

ou=Netgroup

netgroup(4) 

ou=Networks

networks(4)、netmasks(4) 

ou=People

passwd(1)、shadow(4)、user_attr(4)、audit_user(4) 和用户的 publickey 

ou=printers

printers(4) 

ou=Protocols

protocols(4) 

ou=Rpc

rpc(4) 

ou=Services

services(4) 

ou=SolarisAuthAttr

auth_attr(4) 

ou=SolarisProfAttr

prof_attr(4)、exec_attr(4) 

ou=projects

project 

automountMap=auto_*

auto_* 

缺省 LDAP 架构

架构是用于描述可作为项存储在 LDAP 目录中的信息类型的定义。要支持 LDAP 名称客户机,可能需要扩展目录服务器的架构。第 14 章,LDAP 一般参考(参考)中提供了有关 IETF 和 Solaris 特定架构的详细消息。还可以从 IETF Web 站点 http://www.ietf.org 访问各种 RFC。

服务搜索描述符 (Service Search Descriptor, SSD) 和架构映射


注意 –

使用架构映射时一定要谨慎,而且必须采用一致的方式。应确保所映射属性的语法与其映射到的属性的语法一致。换而言之,应确保单值属性映射到单值属性,属性的语法保持一致,并且映射对象类应该具有正确的强制性属性(可能是映射属性)。


如上所述,缺省情况下,LDAP 名称服务要求以特定方式构造 DIT。如果需要,可以指示 Solaris LDAP 名称服务在 DIT 的非缺省位置中进行搜索。另外,还可以指定用不同的属性和对象类来代替缺省架构所指定的属性和对象类。有关缺省过滤器的列表,请参见LDAP 名称服务使用的缺省过滤器

SSD 说明

serviceSearchDescriptor 属性 定义 LDAP 名称服务客户机搜索特定服务信息的方式和位置。serviceSearchDescriptor 包含一个服务名称,其后跟一个或多个用分号分隔的基 (base)-范围 (scope) -过滤器 (filter) 三元参数。 使用这些基 (base)-范围 (scope) -过滤器 (filter) 三元参数,可以定义仅搜索特定服务并按顺序进行搜索。 如果针对给定服务指定了多个基 (base)-范围 (scope) -过滤器 (filter),则该服务查找特定项时,将使用指定的范围和过滤器在每个基本容器中进行搜索。


注意 –

使用 SSD 时,不会在缺省位置中搜索服务(数据库),除非该 SSD 中包括缺省位置。 如果针对某个服务指定了多个 SSD,将会产生不可预测的行为。


在以下示例中,Solaris LDAP 名称服务客户机会依次在 ou=west,dc=example,dc=comou=east,dc=example,dc=com 中执行一级搜索,以查找 passwd 服务。要查找用户 usernamepasswd 数据,可以针对每个 BaseDN 使用缺省的 LDAP 过滤器 (&(objectClass=posixAccount)(uid=username))


serviceSearchDescriptor: passwd:ou=west,dc=example,dc=com;ou=east,

dc=example,dc=com 

在以下示例中,Solaris LDAP 名称服务客户机将在 ou=west,dc=example,dc=com 中执行子树搜索以查找 passwd 服务。要查找用户 usernamepasswd 数据,可以使用 LDAP 过滤器 (&(fulltimeEmployee=TRUE)(uid=username)) 搜索 ou=west,dc=example,dc=com 子树。


serviceSearchDescriptor: passwd:ou=west,dc=example,

dc=com?sub?fulltimeEmployee=TRUE

还可以将多个容器与一个特定的服务类型关联。在以下示例中,服务搜索描述符指定在三个容器中搜索口令项。

请注意,在下面的示例中,SSD 中的结尾 ',' 表示 defaultSearchBase 将附加在相对基本容器之后。


defaultSearchBase: dc=example,dc=com

serviceSearchDescriptor: \

passwd:ou=myuser,;ou=newuser,;ou=extuser,dc=example,dc=com

属性映射

使用 Solaris LDAP 名称服务时, 可以重新映射其任何服务的一个或多个属性名。(Solaris LDAP 客户机使用第 14 章,LDAP 一般参考(参考)中列出的已知属性。) 如果映射一个属性,则必须确保该属性与初始属性具有相同的含义和语法。请注意,映射 userPassword 属性可能会产生问题。

出于多种原因,您可能需要使用架构映射。

此属性的格式为 service:attribute-name=mapped-attribute-name

如果要针对给定服务映射多个属性,则可以定义多个 attributeMap 属性。

在以下示例中,将 uidhomeDirectory 属性用于 passwd 服务时便会使用 employeeNamehome 属性。


attributeMap: passwd:uid=employeeName

attributeMap: passwd:homeDirectory=home

但也会出现以下特殊情况:将 passwd 服务的 gecos 属性映射到多个属性。下面是一个示例:


attributemap: gecos=cn sn title

以上示例将 gecos 值映射到用空格分隔的 cnsntitle 属性值的列表。

对象类映射

使用 Solaris LDAP 名称服务时, 可以重新映射其任何服务的对象类。如果要针对给定服务映射多个对象类,则可以定义多个 objectclassMap 属性。在以下示例中,使用 posixAccount 对象类时便会使用 myUnixAccount 对象类。


objectclassMap: passwd:posixAccount=myUnixAccount

LDAP 客户机配置文件

为了简化 Solaris 客户机设置,并避免针对每台客户机都重新输入同样的信息,可以在目录服务器上创建一个客户机配置文件。这样,通过一个配置文件便可以为所有配置为使用该配置文件的客户机定义配置。以后对配置文件属性进行的任何更改都会按刷新间隔所定义的频率传播到客户机。

这些客户机配置文件应存储在 LDAP 服务器上的已知位置中。给定域的根 DN 必须具有对象类 nisDomainObject 以及包含客户机所在域的 nisDomain 属性。 所有的配置文件都位于相对于此容器的 ou=profile 容器中。这些配置文件应可以匿名读取。

客户机的配置文件属性

下表列出了 Solaris LDAP 客户机的配置文件属性,这些属性可以在运行 idsconfig 时自动设置。有关如何手动设置客户机配置文件的信息,请参见手动初始化客户机以及 idsconfig (1M) 手册页。

表 9–2 客户机的配置文件属性

属性 

说明 

cn

配置文件的名称。该属性没有缺省值。必须指定该属性值。 

preferredServerList

首选服务器的主机地址是用空格分隔的服务器地址的列表。(请勿使用主机名。) 将先尝试与该列表中的服务器建立连接,然后再尝试与 defaultServerList 中的服务器建立连接,直到成功建立连接。该属性没有缺省值。在 preferredServerListdefaultServerList 中至少必须指定一台服务器。

defaultServerList

缺省服务器的主机地址是用空格分隔的服务器地址的列表。(请勿使用主机名。)在尝试与 preferredServerlist 中的服务器建立连接之后,会先尝试与客户机所在子网中的缺省服务器建立连接,然后再尝试与其余的缺省服务器建立连接,直到成功建立连接。在 preferredServerListdefaultServerList 中至少必须指定一台服务器。只有在尝试与首选服务器列表中的服务器建立连接之后,才会尝试与该列表中的服务器建立连接。该属性没有缺省值。

defaultSearchBase

相对于要在其中查找已知容器的位置的 DN。该属性没有缺省值。不过,对于给定服务,可以使用 serviceSearchDescriptor 属性覆盖该属性。

defaultSearchScope

定义客户机要搜索的数据库范围。可以使用 serviceSearchDescriptor 属性覆盖该属性。可能的值为 onesub。缺省搜索级别为 one

authenticationMethod

标识客户机使用的验证方法。缺省值为 none(匿名)。有关更多信息,请参见选择验证方法

credentialLevel

标识客户机应该用于验证的凭证类型。选项包括 anonymousproxy。缺省值为 anonymous

serviceSearchDescriptor

定义客户机搜索名称数据库的方式和位置,例如,客户机应在 DIT 中的一个点还是多个点执行查找。缺省情况下,不定义任何 SSD。 

serviceAuthenticationMethod

客户机针对指定服务使用的验证方法。缺省情况下,不定义任何服务验证方法。如果某个服务未定义 serviceAuthenticationMethod,则使用 authenticationMethod 的缺省值。

attributeMap

客户机使用的属性映射。缺省情况下,不定义任何 attributeMap

objectclassMap

客户机使用的对象类映射。缺省情况下,不定义任何 objectclassMap

searchTimeLimit

客户机上的搜索操作在超时之前可以执行的最长时间(以秒为单位)。这并不影响在 LDAP 服务器上完成搜索所需的时间。缺省值为 30 秒。

bindTimeLimit

客户机与服务器的绑定在超时之前可以持续的最长时间(以秒为单位)。缺省值为 30 秒。

followReferrals

指定客户机是否应遵循 LDAP 引用。可能的值为 TRUEFALSE。缺省值为 TRUE

profileTTL

ldap_cachemgr (1M) 从 LDAP 服务器刷新客户机配置文件的时间间隔。缺省值为 43200 秒(即 12 小时)。如果指定的值为 0,则不刷新配置文件。

本地客户机属性

下表列出了可以使用 ldapclient 在本地设置的客户机属性。有关更多信息,请参见 ldapclient(1M) 手册页。

表 9–3 本地客户机属性

属性 

说明 

domainName

指定客户机的域名(该域将成为此客户机的缺省域)。该属性没有缺省值。必须指定该属性值。 

proxyDN

代理的标识名。如果使用代理credentialLevel 配置客户机,则必须指定 proxyDN

proxyPassword

代理的口令。如果使用代理的 credentialLevel 配置客户机,则必须定义 proxyPassword

certificatePath

包含证书数据库的本地文件系统中的目录。如果借助 TLS 使用 authenticationMethodserviceAuthenticationMethod 配置客户机,则将使用此属性。缺省值为 /var/ldap


注意 –

如果 SSD 中的 BaseDN 包含一个结尾逗号,则将其视为 defaultSearchBase 的相对值。执行搜索之前,会将 defaultSearchBase 的值附加在 BaseDN 后面。


ldap_cachemgr 守护进程

ldap_cachemgr 是运行于 LDAP 客户机上的守护进程。启动 LDAP 客户机时,系统会调用 ldap_cachemgr 守护进程。该守护进程执行以下主要功能:


注意 –

ldap_cachemgr 必须一直运行,LDAP 名称服务才能正常工作。


有关详细信息,请参阅 ldap_cachemgr(1M) 手册页。

LDAP 名称服务安全模型

简介

Solaris LDAP 名称服务将 LDAP 系统信息库用作名称服务和验证服务的源。本节讨论客户机标识、验证方法、 pam_ldap(5)pam_unix 模块和帐户管理的概念。


注意 –

启用 pam_ldap 帐户管理后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh等工具进行的不基于口令的登录将会失败。


要访问 LDAP 系统信息库中的信息,客户机首先向目录服务器证明自己的身份。此身份可以是匿名的,也可以是 LDAP 服务器能够识别的对象。基于客户机的身份和服务器的访问控制信息 (access control information, ACI),LDAP 服务器将允许客户机读写目录信息。有关 ACI 的更多信息,请查阅所用 Sun Java System Directory Server 版本的管理指南

如果客户机对于任何给定的请求以非匿名方式进行连接,则客户机必须使用客户机和服务器均支持的验证方法来向服务器证明自己的身份。客户机在证明自己的身份之后即可发出各种 LDAP 请求。

名称服务和验证服务 (pam_ldap) 访问目录的方式有所不同。名称服务基于预定义的身份从目录中读取各项及其属性,验证服务通过使用用户的名称和口令进行登录到 LDAP 服务器的验证,确认用户输入的口令是否正确。 有关验证服务的更多信息,请参见 pam_ldap(5) 手册页。

传输层安全性 (Transport Layer Security, TLS)


注意 –

为了将 TLS 用于 Solaris LDAP 名称服务,目录服务器必须针对 LDAP 和 SSL 分别使用缺省端口 389 和 636。如果目录服务器未使用这些端口,则 TLS 此时便不可用。


TLS 可用于 保护 LDAP 客户机和目录服务器之间的通信安全,提供保密性和数据完整性。TLS 协议是 安全套接字层 (Secure Sockets Layer, SSL) 协议的一个超集。Solaris LDAP 名称服务支持 TLS 连接。请注意,使用 SSL 会增加目录服务器和客户机的负荷。

需要针对 SSL 设置目录服务器。有关针对 SSL 设置 Sun Java System Directory Server 的更多信息,请参阅所用 Sun Java System Directory Server 版本的管理指南。还需要针对 SSL 设置 LDAP 客户机。

如果使用 TLS,则必须安装必要的安全数据库,特别是需要安装证书和密钥数据库文件。例如,如果采用 Netscape Communicator 的旧数据库格式,则需要以下两个文件:cert7.dbkey3.db。或者,如果使用 Mozilla 提供的新数据库格式,则需要三个文件:cert8.dbkey3.dbsecmod.dbcert7.dbcert8.db 文件包含受信任证书。key3.db 文件包含客户机的密钥。即使 LDAP 名称服务客户机不使用客户机密钥,此文件也必须存在。secmod.db 文件包含安全模块,如 PKCS#11 模块。如果使用的是旧格式,则不需要此文件。

有关更多信息,请参见设置 TLS 安全性

指定客户机凭证级别

LDAP 名称服务 客户机根据客户机的凭证级别进行登录到 LDAP 服务器的验证。可以为 LDAP 客户机指定三个可能的凭证级别,LDAP 客户机将使用这些凭证级别进行登录到目录服务器的验证。

Anonymous

如果使用 anonymous 进行访问,则只能访问所有人都能使用的数据。此外,还应考虑安全问题。允许 anonymous 访问目录的某些部分意味着任何具有该目录访问权限的人都具有读取访问权限。如果使用 anonymous 凭证级别,则需要允许对所有的 LDAP 名称项和属性都具有读取访问权限。


注意 – 注意 –

绝对不要对目录进行 anonymous 写入,因为任何人都可以在具有写入访问权限的 DIT 中更改信息,包括其他用户的口令或他们自己的标识。



注意 –

Sun Java System Directory Server 允许基于 IP 地址、DNS 名称、验证方法和时间来限制访问。您可能希望进一步限制访问。有关更多信息,请参阅所用 Sun Java System Directory Server 版本的管理指南中的“管理访问控制”。


Proxy

客户机 使用代理帐户进行登录到目录的验证或绑定到目录。此代理帐户可以是任何允许绑定到目录的项。此代理帐户需要有足够的权限以便在 LDAP 服务器上执行名称服务功能。 需要使用 proxy 凭证级别在每台客户机上配置 proxyDNproxyPassword。经过加密的 proxyPassword 存储在客户机本地。可以为不同组的客户机设置不同的代理。例如,可以为所有的销售客户机配置一个代理,使其可以访问公司范围内可访问的目录和销售目录,同时禁止销售客户机访问包含薪水信息的人力资源目录。或者,在极端情况下,可以为每台客户机指定不同的代理或者为所有客户机仅指定一个代理。典型的 LDAP 部署一般介于这两种极端情况之间。请认真做出选择。代理太少,可能不便于您控制用户对资源的访问。但是,代理太多,又会增加系统设置和维护难度。 您需要根据自己的环境授予代理用户适当的权限。 有关如何确定哪种验证方法最适合您的配置的信息,请参见凭证存储

如果某个代理用户的口令发生变化,则需要在使用此代理用户的每台客户机上更新该口令。如果针对 LDAP 帐户使用口令失效功能,请确保针对代理用户关闭此功能。


注意 –

请注意,代理凭证级别应用于任何给定计算机上所有的用户和进程。如果两个用户需要使用不同的命名策略,则他们必须使用不同的计算机。


另外,如果客户机要使用 proxy 凭证进行验证,则 proxyDN 在所有服务器上都必须具有相同的 proxyPassword

proxy anonymous

proxy anonymous 是一个多值项,其中定义了多个凭证级别。指定了 proxy anonymous 级别的客户机将首先尝试使用其代理标识进行验证。如果客户机由于某种原因(例如,用户锁定、口令过期)而无法作为代理用户进行验证,客户机将使用匿名访问机制。这可能会导致不同级别的服务,具体情况取决于目录的配置方式。

凭证存储

如果将客户机配置为使用 代理标识,则客户机会将其 proxyDNproxyPassword 保存在 /var/ldap/ldap_client_cred 中。为了增强安全性,将仅限超级用户可以访问该文件,并且对 proxyPassword 值进行了加密。尽管以前的 LDAP 实现已将代理凭证存储在客户机的配置文件中,但是 Solaris 9 LDAP 名称服务却未这样做。初始化过程中使用 ldapclient 设置的任何代理凭证都存储在本地。这会提高代理的 DN 和口令信息的安全性。有关设置客户机配置文件的更多信息,请参见第 12 章,设置 LDAP 客户机(任务)

选择验证方法

为客户机指定 proxyproxy-anonymous 凭证级别时,还需要选择代理进行登录到目录服务器的验证的方法。缺省情况下,验证方法是 none,它指示进行匿名访问。对于该验证方法,还存在与之关联的传输安全选项。

与凭证级别一样,验证方法也可以为多值。例如,在客户机配置文件中,可以指定客户机首先尝试使用由 TLS 保护的 simple 方法进行绑定。如果绑定失败,则客户机将尝试使用 sasl/digest-MD5 方法进行绑定。因此,authenticationMethod 可以为 tls:simple;sasl/digest-MD5

LDAP 名称服务支持某些简单身份验证和安全层 (Simple Authentication and Security Layer, SASL) 机制。这些机制无需 TLS 便可安全交换口令。但是,这些机制不提供数据完整性和保密性。有关 SASL 的信息,请参见 RFC 2222。

以下是受支持的验证机制:


注意 – 注意 –

为了使用 digest-MD5,Sun Java System Directory Server 要求以明文形式存储口令。如果将验证方法设置为 sasl/digest-MD5tls:sasl/digest-MD5,则代理用户的口令必须以明文形式存储。应特别小心的是,如果 userPassword 属性以明文形式存储,它将具有正确的 ACI,以便使其不可读。


下表概述了各种验证方法及其各自的特征。

表 9–4 验证方法

 

绑定 

线路上的口令 

Sun Java System Directory Server 上的口令 

会话 

none

否 

N/A 

N/A 

不加密 

simple

是 

明文 

任何 

不加密 

sasl/digest-MD5

是 

加密 

明文 

不加密 

sasl/cram-MD5

是 

加密 

N/A 

不加密 

tls:simple

是 

加密 

任何 

加密 

tls:sasl/cram-MD5

是 

加密 

N/A 

加密 

tls:sasl/digest-MD5

是 

加密 

明文 

加密 

验证和服务

可以在 serviceAuthenticationMethod 属性中为给定的服务指定验证方法。目前,以下服务支持此操作:


注意 –

如果未针对服务设置 serviceAuthenticationMethod,则缺省情况下将使用 authenticationMethod 属性的值。


下面示例列出了客户机配置文件的一部分,在这部分客户机配置文件中,用户将使用 sasl/digest-MD5 进行登录到目录服务器的验证,使用 SSL 会话更改其口令。


serviceAuthenticationMethod=pam_ldap:sasl/digest-MD5

serviceAuthenticationMethod=passwd-cmd:tls:simple

可插拔验证方法

使用 PAM 框架,可以在多种验证服务中进行选择。可以将 pam_unixpam_ldap 与 LDAP 结合使用。

建议使用 pam_ldap,因为它的灵活性更强,支持更强大的验证方法并且能够使用帐户管理功能。

pam_unix

如果未对 pam.conf(4) 文件进行过更改,则缺省情况下,pam_unix 功能处于启用状态。


注意 –

Solaris 已经删除了 pam_unix 模块而且将不再支持它。但是,通过一组其他服务模块提供了等效或更强的功能。因此,在本指南中,pam_unix 是指等效的功能,而不是指 pam_unix 模块本身。


下面列出了可提供等效 pam_unix 功能的模块:

pam_unix 遵循传统的 UNIX 验证模型,如下所述。

  1. 客户机从名称服务检索用户的加密口令。

  2. 系统提示用户输入其口令。

  3. 对用户的口令进行加密。

  4. 客户机比较这两个经过加密的口令,确定用户是否通过了验证。

另外,使用 pam_unix 时还存在以下两个限制:


注意 –

pam_unixsasl 验证方法 digest-MD5 不兼容,因为 Sun Java System Directory Server 要求以明文形式存储口令,以便使用 digest-MD5。而 pam_unix 要求以 crypt 格式存储口令。


pam_ldap

实现 pam_ldap 时,用户使用在 pam_ldapserviceAuthenticationMethod 参数(如果存在的话)中定义的验证方法绑定到 LDAP 服务器。否则,将使用 authenticationMethod

如果 pam_ldap 能够使用用户的标识和提供的口令绑定到服务器,它将对用户进行验证。


注意 –

启用 pam_ldap 帐户管理之后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh 等工具进行的不基于口令的登录将会失败。


pam_ldap 不读取 userPassword 属性。因此,除非其他客户机正在使用 pam_unix,否则无需授予对 userPassword 属性的读取访问权限。此外,pam_ldap 不支持 none 验证方法。因此,您必须定义 serviceAuthenticationMethodauthenticationMethod 属性,以便客户机可以使用 pam_ldap。有关更多信息,请参见 pam_ldap(5) 手册页。


注意 – 注意 –

如果使用 simple 验证方法,则 userPassword 属性在传输过程中可被第三方读取。


请参见pam_ldap 的示例 pam.conf 文件

下表概述了 pam_unixpam_ldap 之间的主要区别。

表 9–5 pam_unixpam_ldap

 

pam_unix

pam_ldap

口令的发送方式  

使用 passwd 服务验证方法

使用 passwd 服务验证方法

新口令的发送方式 

加密 

不加密(除非使用 TLS) 

新口令的存储方式 

crypt 格式

Sun Java System Directory Server 中定义的口令存储方案 

是否需要读取口令? 

是 

否 

更改口令之后,是否与 sasl/digest-MD5 兼容

否。口令不以 clear 形式存储。用户无法进行验证。

是。只要将缺省的存储方案设置为 clear,用户就可以进行验证。

PAM 和更改口令

可以使用 passwd(1) 更改口令。要更改口令,用户必须对 userPassword 属性具有写入权限。请记住,对于此操作,passwd-cmdserviceAuthenticationMethod 会覆盖 authenticationMethod。在传输过程中可能未对当前的口令进行加密,具体取决于所使用的验证方法。

对于 pam_unix,新的 userPassword 属性在写入 LDAP 之前会使用 UNIX crypt 格式进行加密和标记。因此,无论使用哪种验证方法绑定到服务器,在传输过程中都会对新口令进行加密。有关更多信息,请参见 pam_authtok_store(5) 手册页。

从 Solaris 10 软件发行版开始,pam_ldap 不再支持口令更新。以前建议使用的带有 server_policy 选项的 pam_authtok_store 现已取代pam_ldap 口令更新功能。使用 pam_authtok_store 时,新口令将以明文形式发送到 LDAP 服务器。因此,为了确保保密性,请使用 TLS。如果不使用 TLS,新的 userPassword 很容易被窥探。 如果使用 Sun Java System Directory Server 设置未标记的口令,则该软件会使用 passwordStorageScheme 属性对口令进行加密。有关 passwordStorageScheme 的更多信息,请参见所用 Sun Java System Directory Server 版本的管理指南中有关用户帐户管理的章节。


注意 –

设置 passwordStorageScheme 属性时,需要考虑以下配置问题。如果 NIS、NIS+ 或另一台使用 pam_unix 的客户机将 LDAP 用作系统信息库,则 passwordStorageScheme 必须为 crypt。此外,如果在 Sun Java System Directory Server 上结合使用 pam_ldapsasl/digest-MD5,则必须将 passwordStorageScheme 设置为 clear。


帐户管理

LDAP 名称服务可以利用 Sun Java System Directory Server 中的口令和帐户锁定策略支持。可以将 pam_ldap(5) 配置为支持用户帐户管理。将 passwd(1) 和正确的 PAM 配置结合使用时,将遵循 Sun Java System Directory Server 口令策略所设置的口令语法规则。

通过 pam_ldap(5) 可以支持以下帐户管理功能。这些功能取决于 Sun Java System Directory Server 的口令和帐户锁定策略配置。可以根据需要启用任意功能。


注意 –

前面介绍的帐户管理功能仅适用于 Sun Java System Directory Server。 有关在服务器上配置口令和帐户锁定策略的信息,请参见所用 Sun Java System Directory Server 版本的管理指南中的“用户帐户管理”一章。 另请参见为帐户管理配置的 pam_ldap 的示例 pam_conf 文件。请勿针对 proxy 帐户启用帐户管理。


在 Sun Java System Directory Server 上配置口令和帐户锁定策略之前,请确保所有主机都使用具有 pam_ldap 帐户管理功能的“最新”LDAP 客户机。

另外,还应确保客户机上具有已正确配置的 pam.conf(4) 文件。否则,当 proxy 或用户口令到期后,LDAP 名称服务将无法工作。


注意 –

启用 pam_ldap 帐户管理之后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh 等工具进行的不基于口令的登录将会失败。


第 10 章 LDAP 名称服务的规划要求(任务)

本章讨论开始设置和安装服务器与客户机之前应进行的高级规划。

本章包含以下主题:

LDAP 规划概述

LDAP 客户机配置文件是配置信息的集合,供 LDAP 客户机用来访问有关支持 LDAP 服务器的 LDAP 名称服务信息。本章讨论如何规划 LDAP 名称服务的各个方面,其中包括网络模型、目录信息树、安全模型和各种配置文件属性的缺省值,最后讨论如何准备进行数据填充。

规划 LDAP 网络模型

出于可用性和性能方面的考虑,公司范围的网络的每个子网都应当有各自的 LDAP 服务器,以便为子网中的所有 LDAP 客户机提供服务。 其中仅有一台服务器需要成为主 LDAP 服务器,其余服务器都可以是主服务器的副本。

要规划网络配置,请考虑可用服务器的数目,一台客户机如何与各台服务器通信,以及按什么顺序访问各台服务器。 如果每个子网只有一台服务器,则可以使用 defaultServerList 属性列出所有的服务器,并由 LDAP 客户机排列和处理访问顺序。如果由于速度或数据管理方面的原因而需要按特定顺序访问服务器,则应当使用 preferredServerList 属性定义服务器的固定访问顺序。请注意,为了减少主服务器上的负荷,不应将主服务器放在其中任何一个列表中。

此外,在规划服务器和网络配置时,可能会发现还有以下三个值得考虑的属性。bindTimeLimit 属性可用于设置 TCP 连接请求的超时值,searchTimeLimit 属性可用于设置 LDAP 搜索操作的超时值,profileTTL 属性可用于控制 LDAP 客户机从服务器下载其配置文件的频率。对于较慢或不稳定的网络,bindTimeLimitsearchTimeLimit 属性所需的值可能大于缺省值。对于部署的早期测试阶段,可能需要减小 profileTTL 属性的值,以便客户机加快对存储在 LDAP 服务器中的配置文件的频繁更改。

规划目录信息树 (Directory Information Tree , DIT)

LDAP 名称服务具有一个缺省的目录信息树 (Directory Information Tree , DIT) 和一个关联的缺省架构。例如,ou=people 容器包含用户帐户、口令和阴影信息。ou=hosts 容器包含有关网络中系统的信息。 ou=people 容器中的每一项都包含 objectclass posixAccountshadowAccount

缺省 DIT 是设计完善的目录结构,基于开放标准。 它能够满足大多数名称服务的需要,建议不对其进行更改直接使用。如果选择使用缺省 DIT,唯一需要确定的就是将从目录树中的哪个节点(基 DN)中搜索给定域的名称服务信息。此节点是使用 defaultSearchBase 属性指定的。 另外,您可能还需要设置 defaultSearchScope 属性,以通知客户机应当在哪个搜索范围内执行名称服务查找。是仅搜索该 DN 下的一层 (one),还是搜索该 DN 下的所有子树 (sub)?

但有时候,LDAP 名称服务需要更大的灵活性,以便可以处理现有的 DIT 或名称服务数据分散在目录树中的复杂 DIT。例如,用户帐户项可能存在于树的不同部分。客户机配置文件中的 serviceSearchDescriptorattributeMapobjectclassMap 属性旨在用于处理这些情况。

可以使用服务搜索描述符覆盖特定服务的缺省搜索基 DN、搜索范围和搜索过滤器。请参见服务搜索描述符 (Service Search Descriptor, SSD) 和架构映射

AttributeMapObjectclassMap 属性提供了一种进行架构映射的方法。这些属性使 LDAP 名称服务可以处理现有 DIT。例如,可以将 posixAccount 对象类映射到现有的对象类 myAccount,也可以将 posixAccount 对象类中的属性映射到 myAccount 对象类中的属性。

多台目录服务器

多台 LDAP 服务器可以为一个 DIT 提供服务。例如,DIT 的某些子树驻留在其他 LDAP 服务器上。 这种情况下,LDAP 服务器可能会指示 LDAP 客户机引用其他服务器,以获取已知但不在其自身数据库中的名称数据。如果规划这种 DIT 配置,则应当设置客户机的配置文件属性 followReferrals,指明 LDAP 名称服务遵循服务器引用,从而继续执行名称服务查找。但是,应尽可能使给定域的所有名称数据都位于一个目录服务器上。

如果希望客户机在大多数时间访问只读副本,并且仅在必要时才对读/写主服务器进行引用,则引用可能非常有用。这样,主服务器不会因为副本服务器可处理的请求而过载。

与其他应用程序共享数据

要充分利用 LDAP,对于每个逻辑项都应该有一个 LDAP 项。例如,对于用户,您不但可以拥有公司的用户数据库信息,还可以拥有 Solaris 帐户信息,还可能拥有特定于应用程序的数据。由于 posixAccountshadowAccount 是辅助对象类,因此可以将其添加到目录内的任何项中。 这将需要仔细规划、设置和管理。

选择目录后缀

有关如何选择适当目录后缀的信息,请参见 Sun Java System Directory Server(以前称为 Sun ONE Directory Server)文档。

LDAP 和副本服务器

设置副本服务器时可以采用三种不同的策略。

单主

在单主复制中,对于任何给定的分区或非分区网络,仅有一台主服务器保存有目录项的可写副本。所有副本服务器都拥有目录项的只读副本。副本服务器和主服务器都可以执行搜索、比较和绑定操作,但仅有主服务器才可以执行写入操作。

单主复制策略的潜在缺点是主服务器会出现单点故障。如果主服务器关闭,任何副本都无法处理写入操作。

浮动主

浮动主策略与单主策略相似,即在任何给定时间内,对于给定的分区或非分区网络,仅有一台主服务器具有写入功能。但是,实现浮动主策略时,如果主服务器关闭,则会有一台副本服务器通过某种算法自动转换为主服务器。

浮动主复制策略的潜在缺点是,如果网络成为分区网络并且分区任一端的副本服务器成为主服务器,则网络重新连接后,协调新主服务器的过程会非常复杂。

多主

通过多主复制,多台主服务器各自拥有目录项数据的读写副本。尽管多主策略消除了单点故障问题,但服务器之间仍会发生更新冲突。换句话说,如果几乎同时在两台主服务器上修改某项的属性,则必须备有解决更新冲突的策略,如“最后写入者取得权限”。

有关如何设置副本服务器的信息,请参阅所使用的 Sun Java System Directory Server 版本的管理指南

规划 LDAP 安全模型

要规划安全模型,首先应当考虑 LDAP 客户机与 LDAP 服务器通信应使用的身份。例如,必须确定是否希望使用强验证来防止用户口令通过网络传输,以及/或者是否需要加密 LDAP 客户机与 LDAP 服务器之间的会话以保护传输的 LDAP 数据。

可以使用配置文件中的 credentialLevelauthenticationMethod 属性实现此目的。credentialLevel 有三种可能的凭证级别:anonymousproxyproxy anonymous。 有关 LDAP 名称服务安全概念的详细讨论,请参见LDAP 名称服务安全模型


注意 –

如果启用 pam_ldap 帐户管理,则所有用户每次登录到系统时都必须提供口令。进行验证时必须提供登录口令。因此,如果启用了 pam_ldap,则使用 rshrloginssh 等工具进行的不基于口令的登录将会失败。


以下列出在规划安全模型时需要做出的主要决定:

规划 LDAP 的客户机配置文件和缺省属性值

完成以上规划步骤(网络模型、DIT 和安全模型)之后,应当对以下配置文件属性的值有一些了解:

以上各属性中,仅有 cndefaultServerListdefaultSearchBase 是必需的。这些属性没有缺省值。其余属性是可选的,其中有些具有缺省值。

有关设置 LDAP 客户机的更多信息,请参见第 12 章,设置 LDAP 客户机(任务)

规划 LDAP 数据填充

要使用数据填充 LDAP 服务器, 请在使用正确的 DIT 和架构配置 LDAP 服务器后,使用新的 ldapaddent 工具。此工具将根据 /etc 文件在 LDAP 容器中创建与文件对应的各项。 使用此工具,可以将数据填充到以下数据类型的容器中:aliasesauto_*bootparamsethersgrouphosts(包括 IPv6 地址)、netgroupnetmasksnetworkspasswdshadowprotocolspublickeyrpcservices

缺省情况下,ldapaddent 从标准输入中读取数据并将其添加到与命令行中指定的数据库关联的 LDAP 容器中。但是,可以使用 -f 选项来指定应当从其中读取数据的输入文件。

由于项存储在基于客户机配置的目录中,因此必须将客户机配置为使用 LDAP 名称服务。

为了获得更好的性能,请按以下顺序装入数据库:

  1. 装入 passwd 数据库后再装入 shadow 数据库

  2. 装入 networks 数据库后再装入 netmasks 数据库

  3. 装入 bootparams 数据库后再装入 ethers 数据库

请注意,在添加自动挂载程序项时,数据库名称的形式为 auto_*(例如 auto_home)。

如果要添加到 LDAP 服务器中的 /etc 文件来自不同的主机,则可以将这些文件全部合并到同一个 /etc 文件中,然后在一台主机上使用 ldapaddent 来添加这些文件;或者在每台主机都已配置为 LDAP 客户机的前提下,在不同的主机上逐个执行 ldapaddent

如果名称服务数据已经位于 NIS 服务器中,并且需要将数据移到 LDAP 服务器上以用于 LDAP 名称服务,请使用 ypcat(或 niscat)命令将 NIS 映射转储到文件中。然后,针对这些文件运行 ldapaddent,将数据添加到 LDAP 服务器中。


注意 –

ldapaddent 只能在 LDAP 客户机上运行。


以下过程假定将要从 yp 客户机提取表。

如何通过 ldapaddent 向服务器填充 host
  1. 确保使用 idsconfig 对 Sun Java System Directory Server 进行了设置。

  2. 在客户机上,成为超级用户或承担等效角色。

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

  3. 使计算机成为 LDAP 客户机。


    # ldapclient init -a profileName=new -a domainName=west.example.com \
    
    192.168.0.1 
    
  4. 使用数据填充服务器。


    # ldapaddent -D “cn=directory manager” -f /etc/hosts hosts
    

    系统将提示您输入口令。

    在本示例中,ldapaddent 将使用已经在配置文件 "new" 中配置的验证方法。选择 "simple" 将导致口令以明文形式发送。有关更多信息,请参阅 ldapaddent(1M) 手册页。

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

本章介绍如何配置 Sun Java System Directory Server(以前称为 Sun ONE Directory Server),使其支持 Solaris LDAP 名称服务客户机网络。本章中的信息特定于 Sun Java System Directory Server。 有关安装和配置目录服务器的信息,请参见 Sun Java Enterprise System 附带的 Sun Java System Directory Server 文档。


注意 –

必须先执行 Sun Java System Directory Server 随附的安装和配置文档中介绍的所有步骤,才能配置 Sun Java System Directory Server,使其与 Solaris LDAP 客户机协作。



注意 –

目录服务器(LDAP 服务器)不能作为其自身的客户机。


本章包含以下主题:

使用 idsconfig 配置 Sun Java System Directory Server

基于服务器安装创建核对表

在服务器的安装过程中,将会完成一些重要变量的定义,在启动 idsconfig 之前,会使用这些变量创建类似如下的核对表。可以使用空白核对表中提供的空白核对表。


注意 –

下面列出的信息将作为与 LDAP 有关的各章中介绍的所有示例的基础。示例域是一个名为 Example, Inc. 的装饰品公司,该公司的商店遍布全美。示例涉及到西海岸分公司,它的域是 west.example.com


表 11–1 定义的服务器变量

变量 

为示例网络定义的变量 

用于安装目录服务器实例的端口号 

389(缺省值) 

服务器名称  

myserver (来自 FQDN myserver.west.example.com 或 192.168.0.1)

副本服务器(IP 号:端口号) 

192.168.0.2 [对于 myreplica.west.example.com]

目录管理器 

cn=Directory Manager(缺省值) 

要为其提供服务的域名  

west.example.com

在超时之前处理客户端请求的最长时间(以秒为单位) 

-1

为每个搜索请求返回的最多项数 

-1


注意 –

如果要使用主机名来定义 defaultServerListpreferredServerList,则必须确保不使用 LDAP 进行主机查找。 这意味着 ldap 不得位于 /etc/nsswitch.conf hosts 行中。


表 11–2 定义的客户机配置文件变量

变量 

为示例网络定义的变量 

配置文件名(缺省名称是 "default")。 

WestUserProfile

服务器列表(缺省值为本地子网) 

192.168.0.1

首选服务器列表(按照对服务器进行查找的顺序列出) 

none

搜索范围(沿着目录树向下查找的层数:"One"(缺省值)或 "Sub")

one(缺省值)

用于获取服务器访问权限的凭证。缺省值为 anonymous

proxy

是否遵循 引用(在主服务器不可用时,指针是否指向另一台服务器)?缺省值为 no

Y

等待服务器返回信息的搜索时间限制(缺省值为 30 秒)。 

default

与服务器进行联系时的绑定时间限制(缺省值为 10 秒)。 

default

验证方法(缺省值为 none)。

simple


注意 –

针对每个域都定义了一个客户机配置文件。必须为给定的域至少定义一个配置文件。


属性索引

idsconfig 为下面列出的 属性编制索引以改善性能。

membernisnetgroup

pres,eq,sub

nisnetgrouptriple

pres,eq,sub

ipHostNumber

pres,eq,sub

uidNumber

pres,eq

gidNumber

pres,eq

ipNetworkNumber

pres,eq

automountkey

pres,eq

oncRpcNumber

pres,eq

架构定义

idsconfig(1M) 会自动添加必要的架构定义。除非您在 LDAP 管理方面经验丰富,否则请不要手动修改服务器架构。有关 LDAP 名称服务所用架构的扩展列表,请参见第 14 章,LDAP 一般参考(参考)

使用浏览索引

使用 Sun Java System Directory Server 的浏览索引 功能(又称为虚拟列表视图 (virtual list view, VLV)),客户机可以从非常长的列表中查看一组或许多选定的项,从而缩短每台客户机的搜索时间。浏览索引提供经过优化的预定义搜索参数,使用这些参数,Solaris LDAP 名称客户机可以更快地从各个服务访问特定信息。请记住,如果您未创建浏览索引,客户机可能无法获得给定类型的全部项,因为在服务器上可能实施了搜索时间或项数限制。

VLV 索引是在目录服务器上配置的,代理用户对这些索引具有读取访问权限。

在 Sun Java System Directory Server 上配置浏览索引之前,请考虑与使用这些索引相关联的性能成本。有关更多信息,请参阅所用 Sun Java System Directory Server 版本的管理指南

idsconfig 会为多个 VLV 索引创建相应的项。可以使用 directoryserver 脚本来停止服务器并创建实际的 VLV 索引。有关更多信息,请参见 idsconfig(1M)directoryserver(1M) 手册页。请参阅 idsconfig 命令的输出以确定由 idsconfig 创建的 VLV 项以及需要运行的相应 directoryserver 命令的语法。请参见 idsconfig 设置示例了解样例 idsconfig 输出。

使用服务搜索描述符来修改客户机对各个服务的访问

服务 搜索描述符 (service search descriptor, SSD) 会将 LDAP 中给定操作的缺省搜索请求更改为您定义的搜索。 例如,如果一直在使用具有自定义容器定义的 LDAP 或其他操作系统,而且现在要转为使用最新的 Solaris 发行版,则 SSD 特别有用。使用 SSD,可以在不必更改现有 LDAP 数据库和数据的情况下配置 Solaris LDAP 名称服务。

使用 idsconfig 设置 SSD

在 Example, Inc. 中,假设前任管理员已经配置了 LDAP,并将用户存储在 ou=Users 容器中。现在要升级到最新的 Solaris 发行版。按照定义,Solaris LDAP 客户机假设用户项存储在 ou=People 容器中。因此,当开始搜索 passwd 服务时,LDAP 客户机将搜索 DIT ou=people 层,因而不会找到正确的值。

对于上述问题,一个比较麻烦的解决方案就是完全覆写 Example, Inc. 现有的 DIT,并重写 Example, Inc. 网络上现有的所有应用程序,以便它们与新的 LDAP 名称服务兼容。另外一种更可取的解决方案就是,使用 SSD 来通知 LDAP 客户机在 ou=Users 容器(而不是缺省的 ou=people 容器)中查找用户信息。

在使用 idsconfig 配置 Sun Java System Directory Server 的过程中将需要定义必要的 SSD。提示行如下所示:


Do you wish to setup Service Search Descriptors (y/n/h? y

  A  Add a Service Search Descriptor

  D  Delete a SSD

  M  Modify a SSD

  P  Display all SSD's

  H  Help

  X  Clear all SSD's



  Q  Exit menu

Enter menu choice: [Quit] a

Enter the service id: passwd

Enter the base: service ou=user,dc=west,dc=example,dc=com

Enter the scope: one[default]

  A  Add a Service Search Descriptor

  D  Delete a SSD

  M  Modify a SSD

  P  Display all SSD's

  H  Help

  X  Clear all SSD's



  Q  Exit menu

Enter menu choice: [Quit] p



Current Service Search Descriptors:

==================================

Passwd:ou=Users,ou=west,ou=example,ou=com?



Hit return to continue.



  A  Add a Service Search Descriptor

  D  Delete a SSD

  M  Modify a SSD

  P  Display all SSD's

  H  Help

  X  Clear all SSD's



  Q  Exit menu

Enter menu choice: [Quit] q

运行 idsconfig


注意 –

运行 idsconfig 无需特殊权限,也不必在 LDAP 命名客户机上运行。请记住按照基于服务器安装创建核对表中的说明创建一个核对表以准备运行 idsconfig。不必从服务器或 LDAP 名称服务客户机运行 idsconfig。可以从网络上的任何 Solaris 计算机运行 idsconfig



注意 – 注意 –

idsconfig 以明文形式发送目录管理器的口令。如果不希望出现这种情况,则必须在目录服务器(而非客户机)上运行 idsconfig


如何使用 idsconfig 来配置 Sun Java System Directory Server
  1. 确保目标 Sun Java System Directory Server 已打开且正在运行。

  2. 运行 idsconfig


    # /usr/lib/ldap/idsconfig
    

    有关使用服务器和客户机核对表中列出的定义运行 idsconfig 的示例,请参阅实例 11–1,这些核对表位于本章开头处的基于服务器安装创建核对表中。

  3. 根据提示回答问题。

    请注意 "no" [n] 是缺省的用户输入。如果需要弄清楚任何给定的问题,请键入


    h
    
    此时将出现一个简短的帮助段落。

    idsconfig 完成了目录的设置之后,您需要在服务器上运行指定的命令,才能完成服务器的设置过程,服务器此时即可为客户机提供服务。

idsconfig 设置示例

本节提供了一个简单的 idsconfig 设置示例,该示例没有对缺省值进行太多修改。修改客户机配置文件最复杂的方法就是创建 SSD。有关详细讨论,请参阅使用服务搜索描述符来修改客户机对各个服务的访问

提示符后面的回车符表示可通过按 Enter 来接受 [缺省值]。


注意 –

对于摘要屏幕上留空的任何参数将不进行设置。


idsconfig 完成了目录的设置之后,您需要在服务器上运行指定的命令,才能完成服务器的设置过程,服务器此时即可为客户机提供服务。


实例 11–1 对于 Example, Inc. 网络运行 idsconfig


# usr/lib/ldap/idsconfig

It is strongly recommended that you BACKUP the directory server

before running idsconfig.



Hit Ctrl-C at any time before the final confirmation to exit.



Do you wish to continue with server setup (y/n/h)? [n] Y

Enter the directory server's hostname to setup: myserver

Enter the Directory Server's port number (h=help): [389]

Enter the directory manager DN: [cn=Directory Manager] 

Enter passwd for cn=Directory Manager : 

Enter the domainname to be served (h=help): [west.example.com] 

Enter LDAP Base DN (h=help): [dc=west,dc=example,dc=com] 

Enter the profile name (h=help): [default] WestUserProfile

Default server list (h=help): [192.168.0.1] 

Preferred server list (h=help): 

Choose desired search scope (one, sub, h=help):  [one] 

The following are the supported credential levels:

  1  anonymous

  2  proxy

  3  proxy anonymous

Choose Credential level [h=help]: [1] 2

The following are the supported Authentication Methods:

  1  none

  2  simple

  3  sasl/DIGEST-MD5

  4  tls:simple

  5  tls:sasl/DIGEST-MD5

Choose Authentication Method (h=help): [1] 2

Current authenticationMethod: simple



Do you want to add another Authentication Method? N

Do you want the clients to follow referrals (y/n/h)? [n] N

Do you want to modify the server timelimit value (y/n/h)? [n] Y

Enter the server time limit (current=3600): [-1]

Do you want to modify the server sizelimit value (y/n/h)? [n] Y

Enter the server size limit (current=2000): [-1]

Do you want to store passwords in "crypt" format (y/n/h)? [n] Y

Do you want to setup a Service Authentication Methods (y/n/h)? [n]

Client search time limit in seconds (h=help): [30] 

Profile Time To Live in seconds (h=help): [43200] 

Bind time limit in seconds (h=help): [10]

Do you wish to setup Service Search Descriptors (y/n/h)? [n] 

 

              Summary of Configuration



  1  Domain to serve               : west.example.com

  2  Base DN to setup              : dc=west,dc=example,dc=com

  3  Profile name to create        : WestUserProfile

  4  Default Server List           : 192.168.0.1

  5  Preferred Server List         : 

  6  Default Search Scope          : one

  7  Credential Level              : proxy

  8  Authentication Method         : simple

  9  Enable Follow Referrals       : FALSE

 10  Server Time Limit             : -1

 11  Server Size Limit             : -1

 12  Enable crypt password storage : TRUE

 13  Service Auth Method pam_ldap  : 

 14  Service Auth Method keyserv   : 

 15  Service Auth Method passwd-cmd: 

 16  Search Time Limit             : 30

 17  Profile Time to Live          : 43200

 18  Bind Limit                    : 10

 19  Service Search Descriptors Menu



Enter config value to change: (1-19 0=commit changes) [0] 

Enter DN for proxy agent:[cn=proxyagent,ou=profile,dc=west,dc=example,dc=com]

Enter passwd for proxyagent: 

Re-enter passwd: 

 

WARNING: About to start committing changes. (y=continue, n=EXIT) Y

1. Changed timelimit to -1 in cn=config.

2. Changed sizelimit to -1 in cn=config.

3. Changed passwordstoragescheme to "crypt" in cn=config.

4. Schema attributes have been updated.

5. Schema objectclass definitions have been added.

6. Created DN component dc=west.

7. NisDomainObject added to dc=west,dc=example,dc=com.

8. Top level "ou" containers complete.

9. automount maps: auto_home auto_direct auto_master auto_shared processed.

10. ACI for dc=west,dc=example,dc=com modified to disable self modify.

11. Add of VLV Access Control Information (ACI).

12. Proxy Agent cn=proxyagent,ou=profile,dc=west,dc=example,dc=com added.

13. Give cn=proxyagent,ou=profile,dc=west,dc=example,dc=com read permission for 

password.

14. Generated client profile and loaded on server.

15. Processing eq,pres indexes:

      uidNumber (eq,pres)   Finished indexing.

      ipNetworkNumber (eq,pres)   Finished indexing.

      gidnumber (eq,pres)   Finished indexing.

      oncrpcnumber (eq,pres)   Finished indexing.

      automountKey (eq,pres)   Finished indexing.

16. Processing eq,pres,sub indexes:

      ipHostNumber (eq,pres,sub)   Finished indexing.

      membernisnetgroup (eq,pres,sub)   Finished indexing.

      nisnetgrouptriple (eq,pres,sub)   Finished indexing.

17. Processing VLV indexes:

      west.example.com.getgrent vlv_index     Entry created

      west.example.com.gethostent vlv_index   Entry created

      west.example.com.getnetent vlv_index    Entry created

      west.example.com.getpwent vlv_index     Entry created

      west.example.com.getrpcent vlv_index    Entry created

      west.example.com.getspent vlv_index     Entry created

      west.example.com.getauhoent vlv_index   Entry created

      west.example.com.getsoluent vlv_index   Entry created

      west.example.com.getauduent vlv_index   Entry created

      west.example.com.getauthent vlv_index   Entry created

      west.example.com.getexecent vlv_index   Entry created

      west.example.com.getprofent vlv_index   Entry created

      west.example.com.getmailent vlv_index   Entry created

      west.example.com.getbootent vlv_index   Entry created

      west.example.com.getethent vlv_index    Entry created

      west.example.com.getngrpent vlv_index   Entry created

      west.example.com.getipnent vlv_index    Entry created

      west.example.com.getmaskent vlv_index   Entry created

      west.example.com.getprent vlv_index     Entry created

      west.example.com.getip4ent vlv_index    Entry created

      west.example.com.getip6ent vlv_index    Entry created



idsconfig: Setup of myserver is complete.



Note: idsconfig has created entries for VLV indexes.  Use the

      directoryserver(1m) script on myserver to stop

      the server and then enter the following vlvindex

      sub-commands to create the actual VLV indexes:



  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getgrent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.gethostent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getnetent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getpwent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getrpcent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getspent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getauhoent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getsoluent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getauduent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getauthent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getexecent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getprofent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getmailent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getbootent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getethent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getngrpent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getipnent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getmaskent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getprent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getip4ent

  directoryserver -s myserver vlvindex -n userRoot -T west.example.com.getip6ent

使用 ldapaddent 填充目录服务器


注意 –

在用数据填充目录服务器之前, 必须配置服务器,使其在您使用 pam_unix 时,以 UNIX Crypt 格式存储口令。如果您使用的是 pam_ldap,则可以用任何格式存储口令。有关以 UNIX crypt 格式设置口令的更多信息,请参见 Sun Java System Directory Server 文档。


ldapaddent 从标准输入(类似于 passwd/etc/filename)读取数据并将其放到与该服务相关联的容器中。客户机的配置确定了数据的缺省写入方式。


注意 –

ldapaddent(1M) 只能在 LDAP 客户机上运行。第 12 章,设置 LDAP 客户机(任务)介绍了如何为 LDAP 名称服务配置客户机。


如何通过 ldapaddent 来向 Sun Java System Directory Server 填充用户口令数据

请参见ldapaddent(1M)。有关 LDAP 安全性和对目录服务器写入访问权限的信息,请参见第 9 章,LDAP 的基本组件和概念(概述)

  1. 可以使用 ldapaddent 命令来向服务器中添加 /etc/passwd 项。


    # ldapaddent -D "cn=directory manager" -f /etc/passwd passwd
    

管理打印机项

添加打印机

要向 LDAP 目录中添加打印机项,请使用 printmgr 配置工具或 lpset -n ldap 命令行实用程序。请参见lpset(1M)。请注意,添加到该目录中的打印机对象仅定义了打印系统客户机所需的打印机连接参数。本地打印服务器配置数据仍保留在文件中。典型的打印机项将如下所示:


printer-uri=myprinter,ou=printers,dc=mkg,dc=example,dc=com

objectclass=top

objectclass=printerService

objectclass=printerAbstract

objectclass=sunPrinter

printer-name=myprinter

sun-printer-bsdaddr=printsvr.example.com,myprinter,Solaris

sun-printer-kvp=description=HP LaserJet (PS)

printer-uri=myprinter

使用 lpget

lpget(1M) 可用于列出 LDAP 客户机的 LDAP 目录已知的所有打印机项。如果 LDAP 客户机的 LDAP 服务器是副本服务器,则列出的打印机可能不同于主 LDAP 服务器中的打印机,具体情况取决于更新复制协议。有关更多信息,请参见lpget(1M)

例如,要列出给定基 DN 的所有打印机,请键入以下内容:


# lpget -n ldap list

myprinter:

	dn=myprinter,ou=printers,dc=mkt,dc=example,dc=com

	bsdaddr=printsvr.example.com,myprinter,Solaris

	description=HP LaserJet (PS)

向目录服务器填充其他配置文件

使用带有 genprofile 选项的 ldapclient,可以基于所指定的属性,针对配置创建 LDIF 表示形式的配置文件。随后可以将所创建的配置文件加载到要用作客户机配置文件的 LDAP 服务器中。客户机可以使用 ldapclient init 来下载客户机配置文件。

有关使用 ldapclient genprofile 的信息,请参阅 ldapclient(1M)

如何通过 ldapclient 来向目录服务器填充其他配置文件
  1. 成为超级用户或承担等效角色。

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

  2. 使用带 genprofileldapclient 命令。


    # ldapclient genprofile \
    
    -a profileName=myprofile \
    
    -a defaultSearchBase=dc=west,dc=example,dc=com \
    
    -a "defaultServerList=192.168.0.1 192.168.0.2:386" \
    

    > myprofile.ldif

  3. 将新配置文件上载到服务器上。


    # ldapadd -h 192.168.0.1 -D “cn=directory manager” -f myprofile.ldif
    

配置目录服务器以启用帐户管理

为了让 pam_ldap 能够正确工作,必须在服务器上正确配置口令和帐户锁定策略。可以使用 Directory Server Console 或 ldapmodify 来为 LDAP 目录配置帐户管理策略。有关配置过程和更多信息,请参见所用 Sun Java System Directory Server 版本的管理指南中的“用户帐户管理”一章。


注意 –

启用 pam_ldap 帐户管理后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh 等工具进行的不基于口令的登录将会失败。


绝不应当允许 proxy 用户的口令过期。 如果代理口令过期,使用 proxy 凭证级别的客户机将无法从服务器检索名称服务信息。为了确保代理用户的口令不过期,请使用以下脚本修改代理帐户:


# ldapmodify -h ldapserver -D administrator DN \

-w  administrator password <<EOF 

dn: proxy user DN

DNchangetype: modify

replace: passwordexpirationtime

passwordexpirationtime: 20380119031407Z

EOF

注意 –

pam_ldap 帐户管理依赖 Sun Java System Directory Server 来为用户维护和提供口令失效和帐户过期信息。目录服务器在验证用户帐户时不解释阴影项中的相应数据。但是,pam_unix 会检查阴影数据以确定帐户是否处于锁定状态或者口令是否已失效。由于 LDAP 名称服务或目录服务器不会使阴影数据保持最新,因此 pam_unix 不应当基于阴影数据授予访问权限。阴影数据是使用 proxy 标识检索的。 因此,请不要允许 proxy 用户对 userPassword 属性具有读取访问权限。拒绝 proxy 用户对 userPassword 的读取访问权限可防止 pam_unix 进行无效的帐户验证。


迁移 Sun Java System Directory Server

在 Sun Java System Directory Server 5.1 发行版(以前称为 Sun ONE Directory Server)和 Sun Java System Directory Server 5.2 发行版之间实现了架构更改。ldapaddent 命令现在向 ethers/bootparams 的项中添加了 objectclass: device。因此,如果您选择使用 LDAP 命令将目录数据从 Sun Java System Directory Server 5.1 迁移到 5.2,则必须使用 ldapaddent -d 导出数据,并使用 ldapaddent 导入数据。否则,如果使用 Sun Java System Directory Server 工具(db2ldifldif2db)来迁移数据,则必须在迁移数据之前向 Sun Java System Directory Server 5.2 应用所有的修补程序,否则数据导入操作将失败。

有关配置 Sun Java System Directory Server 5.2 的信息,请参见 Sun Java Enterprise System 附带的 Sun Java System Directory Server 文档。

第 12 章 设置 LDAP 客户机(任务)

本章介绍如何设置 Solaris LDAP 名称服务客户机。

本章包含以下主题:

LDAP 客户机设置的先决条件

要使 Solaris 客户机将 LDAP 用作名称服务,必须满足以下条件:

ldapclient 实用程序可以执行上述除启动服务器之外的所有步骤,因此对于设置 LDAP 客户机而言非常关键。 本章其余部分将举例说明如何使用 ldapclient 实用程序设置 LDAP 客户机,以及如何使用其他各种 LDAP 实用程序获取有关 LDAP 客户机的信息并检查其状态。

LDAP 和服务管理工具

可以使用服务管理工具来管理 LDAP 客户机服务。有关 SMF 的概述,请参阅System Administration Guide: Basic Administration中的“Managing Services (Overview)”。另请参阅 svcadm(1M)svcs( 1) 手册页以获取更多详细信息。

初始化 LDAP 客户机

ldapclient(1M) 是用于在 Solaris 系统中设置 LDAP 客户机的实用程序。ldapclient 假定已使用适当的客户机配置文件配置了服务器。必须先安装服务器并用适当的配置文件对其进行配置,然后才能设置客户机。


注意 –

Solaris 操作系统不支持 NIS 客户机与本机 LDAP 客户机共存于同一台客户机上的配置。


使用 ldapclient 设置客户机主要有两种方法。


注意 –

尽管可以手动配置客户机,但建议不使用此方法。使用配置文件可以降低管理客户机的复杂性和成本。


使用配置文件初始化客户机

如何使用配置文件初始化客户机
  1. 成为超级用户或承担等效角色。

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

  2. 运行 ldapclient init 命令。


    # ldapclient init \
    
    -a profileName=new \
    
    -a domainName=west.example.com 192.168.0.1
    
    System successfully configured

使用代理凭证

如何使用代理凭证初始化客户机

注意 –

请勿直接编辑任何客户机配置文件。 请使用 ldapclient 创建或修改这些文件的内容。


  1. 成为超级用户或承担等效角色。

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

  2. 运行 ldapclient(定义代理值)。


    # ldapclient init \
    
    -a proxyDN=cn=proxyagent,ou=profile,dc=west,dc=example,dc=com \
    
    -a domainName=west.example.com \
    
    -a profileName=pit1 \
    
    -a proxyPassword=test1234 192.168.0.1
    
    System successfully configured

    如果要为 proxy 设置要使用的配置文件,则 -a proxyDN 和 -a proxyPassword 是必需的。 由于服务器上保存的配置文件中未存储凭证,因此必须在初始化客户机时提供该信息。与原先在服务器上存储代理凭证的方法相比,此方法更安全。

    代理信息用来创建 /var/ldap/ldap_client_cred。其余信息放置在 /var/ldap/ldap_client_file 中。

手动初始化客户机

超级用户或承担等效角色的管理员可以执行手动客户机配置。但是在此过程中会跳过许多检查,因此系统配置相对容易出错。 此外,还必须在每台计算机中更改设置,而不像使用配置文件时那样,只需在一个集中位置进行更改即可。

如何手动初始化客户机
  1. 成为超级用户或承担等效角色。

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

  2. 使用 ldapclient manual 初始化客户机。


    # ldapclient manual \
    
    -a domainName=dc=west.example.com \ 
    
    -a credentialLevel=proxy \
    
    -a defaultSearchBase=dc=west,dc=example,dc=com \ 
    
    -a proxyDN=cn=proxyagent,ou=profile,dc=west,dc=example,dc=com \ 
    
    -a proxyPassword=testtest 192.168.0.1
    
  3. 使用 ldapclient list 进行验证。


    NS_LDAP_FILE_VERSION= 2.0
    
    NS_LDAP_BINDDN= cn=proxyagent,ou=profile,dc=west,dc=example,dc=com
    
    NS_LDAP_BINDPASSWD= {NS1}4a3788e8c053424f
    
    NS_LDAP_SERVERS= 192.168.0.1
    
    NS_LDAP_SEARCH_BASEDN= dc=west,dc=example,dc=com
    
    NS_LDAP_CREDENTIAL_LEVEL= proxy

修改手动客户机配置

如何修改手动配置
  1. 成为超级用户或承担等效角色。

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

  2. 使用 ldapclient mod 命令将身份验证方法更改为 simple


    # ldapclient mod -a authenticationMethod=simple
    
  3. 使用 ldapclient list 验证是否进行了更改。


    # ldapclient list
    
    NS_LDAP_FILE_VERSION= 2.0
    
    NS_LDAP_BINDDN= cn=proxyagent,ou=profile,dc=west,dc=example,dc=com
    
    NS_LDAP_BINDPASSWD= {NS1}4a3788e8c053424f
    
    NS_LDAP_SERVERS= 192.168.0.1
    
    NS_LDAP_SEARCH_BASEDN= dc=west,dc=example,dc=com
    
    NS_LDAP_AUTH= simple
    
    NS_LDAP_CREDENTIAL_LEVEL= proxy

取消客户机初始化

ldapclient uninit 可将客户机名称服务恢复到它在最近的 initmodifymanual 操作之前的状态。换言之,该命令可对采取的上一个步骤执行“撤消”操作。例如,如果对客户机进行配置,使其使用 profile1,然后更改为使用 profile2,则使用 ldapclient uninit 将使客户机恢复使用 profile1

如何取消客户机初始化
  1. 成为超级用户或承担等效角色。

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

  2. 使用 ldapclient uninit


    # ldapclient uninit
    
    System successfully recovered

设置 TLS 安全性


注意 –

安全数据库文件必须可供任何人读取。请勿在 key3.db 中包括任何私钥。


如果使用 TLS,则必须安装必要的安全数据库。需要特别指出的是,需要证书和密钥数据库文件。例如,如果采用 Netscape Communicator 的旧数据库格式,则需要以下两个文件:cert7.dbkey3.db。或者,如果使用 Mozilla 的新数据库格式,则需要以下三个文件:cert8.dbkey3.dbsecmod.dbcert7.dbcert8.db 文件中包含受信任证书。key3.db 文件包含客户机的密钥。即使 LDAP 名称服务客户机不使用客户机密钥,此文件也必须存在。secmod.db 文件包含安全模块,如 PKCS#11 模块。如果使用的是旧格式,则不需要此文件。


注意 –

在运行 ldapclient 之前,应设置并安装本节中介绍的必需的安全数据库文件。


有关如何创建并管理这些文件的信息,请参见针对您使用的 Sun Java System Directory Server 版本的管理员指南中“管理 SSL” 一章中有关配置 LDAP 客户机以使其使用 SSL 一节。配置后,这些文件必须存储在 LDAP 名称服务客户机所期望的位置。属性 certificatePath 用来确定此位置。 此位置缺省为 /var/ldap

例如,在使用 Netscape CommunicatorTM 设置必需的 cert7.dbkey3.db 文件后,请将这些文件复制到缺省位置。


# cp $HOME/.netscape/cert7.db /var/ldap

# cp $HOME/.netscape/key3.db /var/ldap

然后,向所有人授予读访问权限。


# chmod 444 /var/ldap/cert7.db

# chmod 444 /var/ldap/key3.db

注意 –

Netscape 在 $HOME/.netscape 目录中管理 cert7.dbkey3.db 文件,而 Mozilla 将其 cert8.dbkey3.dbsecmod.db 文件放在 $HOME/.mozilla 下的一个子目录中进行管理。如果要将这些安全数据库用于 LDAP 名称服务客户机,则必须将其副本存储在本地文件系统中。


配置 PAM

pam_ldap 是用于 LDAP 的身份验证和帐户管理 PAM 模块。请参见pam_ldap(5) 手册页和附录 A,Solaris 10 软件中对 DNS、NIS 和 LDAP 的更新,以获取更多有关 pam_ldap 当前支持的功能的信息。

配置 PAM,使其使用 UNIX policy

要配置 PAM,使其使用 UNIX policy,请参考pam_ldap 的示例 pam.conf 文件中的样例进行操作。向客户机的 /etc/pam.conf 文件中添加包含 pam_ldap.so.1 的行。有关详细信息,请参见 pam.conf(4) 手册页。

配置 PAM,使其使用 LDAP server_policy

要配置 PAM,使其使用 LDAP server_policy,请遵照为帐户管理配置的 pam_ldap 的示例 pam_conf 文件中的样例。向客户机的 /etc/pam.conf 文件中添加包含 pam_ldap.so.1 的行。此外,如果 pam.conf 文件样例中的任何 PAM 模块指定了 binding 标志和 server_policy 选项,则必须对该客户机的 /etc/pam.conf 文件中的对应模块使用相同的标志和选项。 而且,还要将 server_policy 选项添加到包含服务模块 pam_authtok_store.so.1 的行中。


注意 –

启用 pam_ldap 帐户管理后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh等工具进行的不基于口令的登录将会失败。


检索 LDAP 名称服务信息

使用 ldaplist 实用程序可以检索有关 LDAP 名称服务的信息。此 LDAP 实用程序会以 LDIF 格式列出 LDAP 服务器中的名称信息。该实用程序可用于进行故障排除。 有关详细信息,请参见 ldaplist(1)

列出所有 LDAP 容器

ldaplist 显示输出时以空白行分隔记录,这对显示由多行组成的大量记录很有帮助。


注意 –

ldaplist 的输出取决于客户机配置。例如,如果 ns_ldap_search 的值是 sub 而不是 oneldaplist 将列出当前搜索 baseDN 下的所有项。


下面是 ldaplist 输出的示例。


# ldaplist

dn: ou=people,dc=west,dc=example,dc=com



dn: ou=group,dc=west,dc=example,dc=com



dn: ou=rpc,dc=west,dc=example,dc=com



dn: ou=protocols,dc=west,dc=example,dc=com



dn: ou=networks,dc=west,dc=example,dc=com



dn: ou=netgroup,dc=west,dc=example,dc=com



dn: ou=aliases,dc=west,dc=example,dc=com



dn: ou=hosts,dc=west,dc=example,dc=com



dn: ou=services,dc=west,dc=example,dc=com



dn: ou=ethers,dc=west,dc=example,dc=com



dn: ou=profile,dc=west,dc=example,dc=com



dn: automountmap=auto_home,dc=west,dc=example,dc=com



dn: automountmap=auto_direct,dc=west,dc=example,dc=com



dn: automountmap=auto_master,dc=west,dc=example,dc=com



dn: automountmap=auto_shared,dc=west,dc=example,dc=com

列出所有用户项属性

要列出特定信息(如用户的 passwd 项),请按如下所示使用 getent


# getent passwd user1

user1::30641:10:Joe Q. User:/home/user1:/bin/csh

如果要列出所有属性,请将 ldaplist-l 选项结合使用。


# ldaplist -l passwd user1dn: uid=user1,ou=People,dc=west,dc=example,dc=com

        uid: user1

        cn: user1

        uidNumber: 30641

        gidNumber: 10

        gecos: Joe Q. User

        homeDirectory: /home/user1

        loginShell: /bin/csh

        objectClass: top

        objectClass: shadowAccount

        objectClass: account

        objectClass: posixAccount

        shadowLastChange: 6445

自定义 LDAP 客户机环境

以下各节介绍如何自定义客户机环境。

可以更改任何服务,但一定要小心,因为如果未在服务器上为指定的服务填充数据,则服务会停止工作。而且,在某些情况下,可能不会按缺省情况设置文件。

为 LDAP 修改 nsswitch.conf 文件

可以修改 /etc/nsswitch.conf 文件,以自定义每个服务获取信息的位置。 缺省设置存储在 /etc/nsswitch.ldap 中,在初始化客户机时 ldapclient 使用此文件创建 /etc/nsswitch.conf 文件。

和 LDAP 一起启用 DNS

如果要通过设置 /etc/resolv.conf 文件来启用 DNS,请按如下所示将 DNS 添加到主机行。


hosts:      ldap dns [NOTFOUND=return] files

第 13 章 LDAP 疑难解答(参考)

本章描述了配置问题以及为解决它们而建议的解决方案。


注意 –

LDAP 服务由服务管理工具管理。 可以使用 svcadm 命令对此服务执行启用、禁用或重新启动等管理操作。有关针对 LDAP 使用服务管理工具的更多信息,请参见LDAP 和服务管理工具。有关服务管理工具的概述,请参阅System Administration Guide: Basic Administration中的“管理服务(概述)”。有关更多详细信息,另请参阅 svcadm(1M)svcs(1) 手册页。


监视 LDAP 客户机状态

以下各节介绍了各种可帮助确定 LDAP 客户机环境状态的命令。有关可以使用的选项的其他信息,另请参见相应的手册页。

有关服务管理工具的概述,请参阅System Administration Guide: Basic Administration中的“管理服务(概述)”。有关更多详细信息,另请参阅 svcadm(1M)svcs(1) 手册页。

验证 ldap_cachemgr 是否正在运行

ldap_cachemgr 守护进程必须一直正常运行。否则,系统将无法正常工作。当启动 LDAP 客户机时,客户机会自动启动 ldap_cachemgr 守护进程。因此,如果 ldap_cachemgr 未运行,LDAP 客户机将被禁用。下面是两种用于确定 LDAP 客户机是否联机的方法:

有关 ldap_cachemgr 守护进程的更多信息,请参见 ldap_cachemgr(1M) 手册页。

检查当前的配置文件信息

成为超级用户或承担等效角色,然后运行带 list 选项的 ldapclient


# ldapclient list

NS_LDAP_FILE_VERSION= 2.0

NS_LDAP_BINDDN= cn=proxyagent,ou=profile,dc=west,dc=example,dc=com

NS_LDAP_BINDPASSWD= {NS1}4a3788e8c053424f

NS_LDAP_SERVERS= 192.168.0.1, 192.168.0.10

NS_LDAP_SEARCH_BASEDN= dc=west,dc=example,dc=com

NS_LDAP_AUTH= simple

NS_LDAP_SEARCH_REF= TRUE

NS_LDAP_SEARCH_SCOPE= one

NS_LDAP_SEARCH_TIME= 30

NS_LDAP_SERVER_PREF= 192.168.0.1

NS_LDAP_PROFILE= pit1

NS_LDAP_CREDENTIAL_LEVEL= proxy

NS_LDAP_SERVICE_SEARCH_DESC= passwd:ou=people,?sub

NS_LDAP_SERVICE_SEARCH_DESC= group:ou=group,dc=west,dc=example,dc=com?one

NS_LDAP_BIND_TIME= 5

目前,/var/ldap 文件采用 ASCII 格式。因为文件有时可更改为二进制格式,所以串联文件会产生问题。可以使用 ldapclient list 来访问此信息。有关更多信息,请参见 ldapclient(1M) 手册页。

验证基本的客户机/服务器通信

检查客户机是否正在与 LDAP 服务器通信的最佳方法是使用 ldaplist 命令。 使用不带任何参数的 ldaplist 会转储服务器上的所有容器。 只要这些容器存在且不必填充,此方法就起作用。有关更多信息,请参见 ldaplist(1) 手册页。

如果第一步起作用,则可以尝试使用 ldaplist passwd usernameldaplist hosts hostname,但是如果容器中包含大量数据,您可能需要选取一个填充量较小的服务,或者将它们传输到 headmore

从非客户机检查服务器数据

以上各节中的大多数命令都假设您已经创建了 LDAP 客户机。 如果尚未创建客户机,请使用 ldapsearch 命令来检查服务器上的数据。 以下示例列出了所有容器:


# ldapsearch -h server1 -b "dc=west,dc=example,dc=com" -s one "objectclass=*"

在 Solaris 9 和早期版本中,在缺省情况下,ldapsearch 命令可生成非标准文本表示形式的输出。在以后的 Solaris 发行版中,ldapsearch 的缺省输出是行业标准化的 LDIF 格式,该格式由 RFC-2849 定义。所有版本的 ldapsearch 都可以使用 -L 选项输出 LDIF 格式。

LDAP 配置问题及解决方案

以下各节描述了 LDAP 配置问题以及为解决它们而建议的解决方案。

无法解析主机名

在执行主机查找时, Solaris 平台 LDAP 客户机后端返回完全限定的 主机名,如由 gethostbyname()getaddrinfo() 返回的主机名。 如果存储的名称是限定名称(即至少包含一个点),则客户机将按原样返回该名称。例如,如果存储的名称是 hostB.eng,则返回的名称是 hostB.eng

如果存储在 LDAP 目录中的名称不是限定名称(即不包含点),则客户机后端会在该名称后面附加域名部分。例如,如果存储的名称是 hostA,则返回的名称是 hostA.domainname

无法远程访问 LDAP 域中的系统

如果 DNS 域名 不同于 LDAP 域名, 那么,除非所存储的主机名是完全限定的名称,否则 LDAP 名称服务不能用于为主机名提供服务。

登录功能不起作用

在登录过程中,LDAP 客户机使用 PAM 模块 进行用户验证。在使用标准的 UNIX PAM 模块时,口令是从服务器读取并在客户端上检查的。这可能会由于以下某种原因而失败:

  1. ldap 未由 /etc/nsswitch.conf 文件中的 passwd 服务使用。

  2. 代理无法读取服务器列表中用户的 userPassword 属性。必须至少允许一个代理读取口令,因为该代理可以将口令返回给客户机进行比较。pam_ldap 不需要对口令具有读取访问权限。

  3. 代理可能没有正确的口令。

  4. 该项没有 shadowAccount 对象类。

  5. 没有为该用户定义口令。

    在使用 ldapaddent 时,必须使用 -p 选项来确保已向该用户项中添加了口令。如果使用不带 -p 选项的 ldapaddent,用户的口令将不存储在目录中,除非使用 ldapaddent 另外添加了 /etc/shadow 文件。

  6. 没有可访问的 LDAP 服务器。

    检查服务器的状态。


    # /usr/lib/ldap/ldap_cachemgr -g
    
  7. pam.conf 的配置有误。

  8. 没有在 LDAP 名称空间中定义该用户。

  9. NS_LDAP_CREDENTIAL_LEVEL 对于 pam_unix 设置为 anonymous,而且 userPassword 对于匿名用户不可用。

  10. 口令没有以 crypt 格式存储。

  11. 如果所配置的 pam_ldap 支持帐户管理,则登录失败可能是由以下某种原因引起的:

    • 用户的口令已过期。

    • 用户的帐户由于登录失败尝试的次数过多而被锁定。

    • 用户的帐户已经由管理员停用。

    • 用户尝试通过不使用口令的程序(如 rshrloginsshsftp)进行登录。

查找速度太慢

LDAP 数据库依赖索引 来改进搜索性能。如果索引的配置有误,会大大降低性能。本文档中包括一组应当针对其编制索引的常见属性。您还可以添加自己的索引来改进站点的性能。

ldapclient 无法绑定到服务器

在指定了 profileName 属性时,无法使用带 init 选项的 ldapclient 初始化客户机。失败的原因 包括:

  1. 在命令行上指定的域名有误。

  2. 没有在 DIT 中设置 nisDomain 属性,该属性表示指定客户机域的入口点。

  3. 未在服务器上正确设置访问控制信息,从而不允许在 LDAP 数据库中进行匿名搜索。

  4. ldapclient 命令传递的服务器地址有误。请使用 ldapsearch 检验服务器地址。

  5. ldapclient 命令传递的配置文件名称有误。请使用 ldapsearch 检验 DIT 中的配置文件名称。

  6. 针对客户机网络接口使用 snoop,看传出的是哪种通信并确定哪台服务器正与之通信。

使用 ldap_cachemgr 进行调试

使用带 -g 选项的 ldap_cachemgr 可能是比较有用的调试方法,因为通过它可以查看当前的客户机配置和统计信息。例如,


# ldap_cachemgr -g

将按上面提到的那样,在标准输出中列显当前的配置和统计信息(包括所有 LDAP 服务器的状态)。请注意,不必成为超级用户即可执行此命令。

ldapclient 在设置过程中挂起

如果 ldapclient 命令挂起,则在恢复先前的环境之后按 Ctrl-C 将退出。 如果出现这种情况,请与服务器管理员核对,以确保该服务器正在运行。

还要在配置文件中或从命令行检查服务器列表中的属性,并确保服务器信息正确无误。

第 14 章 LDAP 一般参考(参考)

本章包含以下主题:

  1. 空白核对表

  2. LDAP 升级信息

  3. LDAP 命令

  4. pam_ldap 的示例 pam.conf 文件

  5. 为帐户管理配置的 pam_ldap 的示例 pam_conf 文件

  6. LDAP 的 IETF 架构

  7. 目录用户代理配置文件 (DUAProfile) 架构

  8. Solaris 架构

  9. LDAP 的 Internet 打印协议信息

  10. LDAP 的常规目录服务器要求

  11. LDAP 名称服务使用的缺省过滤器

空白核对表

表 14–1 服务器变量定义

变量 

为 _______ 网络定义的变量 

安装目录服务器实例的端口号 (389) 

 

服务器名称  

 

副本服务器(IP 号:端口号) 

 

目录管理器 [dn: cn=directory manager]

 

要为其提供服务的域名  

 

在超时之前处理客户端请求的最长时间(以秒为单位) 

 

为每个搜索请求返回的最多项数 

 

表 14–2 客户机配置文件变量定义

变量 

为 ________ 网络定义的变量 

配置文件名 

 

服务器列表(缺省值为本地子网) 

 

首选服务器列表(按照对服务器进行查找的顺序列出) 

 

搜索范围(沿着目录树向下查找的层数:"One" 或 "Sub")

 

用于获取服务器访问权限的凭证。缺省值为 anonymous

 

是否遵循引用(主服务器不可用时指向另一台服务器的指针)?缺省值为 no

 

等待服务器返回信息的搜索时间限制(以秒为单位,缺省值为 30)。

 

与服务器进行联系时的绑定时间限制(以秒为单位,缺省值为 30)。

 

验证方法(缺省值为 none)。

 

LDAP 升级信息

本节提供从 Solaris 8 发行版升级到 Solaris 9 或更高发行版时需要考虑的内容。

兼容性

配置了 Solaris 9 或更高 Solaris 软件发行版的客户机与设置为可为 Solaris 8 客户机(仅支持1.0 版的配置文件)提供服务的目录服务器完全兼容。 但是,为了使用 Solaris 9 和更高发行版中的新功能并使用较新的安全模型,必须使用 2.0 版配置文件。

服务器可以同时为旧客户机和新客户机提供服务。只要架构映射未启用,而且未将 2.0 版文件配置为使用具有 serviceSearchDescriptors 属性的特殊过滤器,则不同的客户机就会从服务器得到相同的结果。 显然,如果服务器不使用缺省架构,旧客户机就无法使用该服务器,因为 Solaris 8 客户机不能任意映射非缺省架构。

运行 ldap_cachemgr 守护进程

从 Solaris 9 发行版开始,ldap_cachemgr 守护进程必须一直运行。该守护进程是客户机正常运行所必需的。在使用服务管理工具的 svcadm 命令启动 LDAP 客户机时,会自动调用 ldap_cachemgr 守护进程。有关更多信息,请参见 ldap_cachemgr(1M) 手册页。

新的 automount 架构

从 Solaris 9 发行版开始,在缺省情况下,Solaris 软件对 automount 项使用一个新架构。新架构替代了 Solaris 8 客户机使用的普通 NIS 映射架构。 这意味着,如果用 Solaris 9 或更高版本软件中的工具设置服务器,Solaris 8 客户机将看不到 automount 项。 对于正在设置的服务器将同时为 Solaris 8 客户机和更高软件版本的 Solaris 客户机提供服务的站点,在添加自动挂载程序项之前,可以创建一个配置文件来将新架构映射到旧架构。 这将确保 ldapaddent(1M) 使用旧架构添加项。 但请注意,这还意味着所有基于 Solaris 9 或更高版本软件的客户机都必须使用映射了 automount 架构的配置文件。

只有向配置文件中添加下列映射属性后,该映射才能生效:


attributeMap: 		automount:automountMapName=nisMapName

attributeMap: 		automount:automountKey=cn

attributeMap: 		automount:automountInformation=nisMapEntry

objectclassMap: 	  automount:automountMap=nisMap

objectclassMap: 	  automount:automount=nisObject

pam_ldap 方面的更改

Solaris 10 OS 发行版中对 pam_ldap 引进了几项改动,下面的内容介绍了这些改动。另请参见 pam_ldap(5) 手册页以获得更多信息。

升级到此发行版不会自动更新现有的 pam.conf 文件以反映上述更改。如果现有的 pam.conf 文件中包含 pam_ldap 配置,则在升级之后,系统将通过 CLEANUP 文件通知您。您将需要检查 pam.conf 文件并根据需要修改它。

因为在同一个栈中还使用了其他相关模块,而且还会存在第三方模块,所以不可能为上面列出的更改提供全新的自动更新(主要是口令提示和口令更新)。

有关更多信息,请参见 pam_passwd_auth(5)pam_authtok_get (5)pam_authtok_store(5)pam.conf(4) 手册页。

LDAP 命令

Solaris 系统中存在两组与 LDAP 相关的命令。一组命令是常规 LDAP 工具,它们不要求用 LDAP 名称服务配置客户机。另一组命令使用客户机上的常见 LDAP 配置,因而只有客户机使用 LDAP 作为其名称服务时才使用。

常规 LDAP 工具

LDAP 命令行工具支持一组常见的选项(包括验证和绑定参数)。下列工具支持用常见的文本格式来表示名为 LDAP 数据交换格式 (LDAP Data Interchange Format, LDIF) 的目录信息。可使用这些命令直接处理目录项。

需要 LDAP 名称服务的 LDAP 工具

表 14–3 LDAP 工具

工具 

功能 

ldapaddent(1M)

用于根据相应的 /etc 文件在 LDAP 容器中创建项。此工具允许根据文件填充目录。例如,它读取 /etc/passwd 格式的文件,并填充目录中的 passwd 项。

ldaplist(1)

用于列出目录中各个服务的内容。 

idsconfig(1M)

用于设置 Sun Java System Directory Server,使其为 LDAP 名称服务客户机提供服务。 

pam_ldap 的示例 pam.conf 文件


#

# Authentication management

#

# login service (explicit because of pam_dial_auth)

#

login	auth requisite		pam_authtok_get.so.1

login	auth required		pam_dhkeys.so.1

login	auth required		pam_dial_auth.so.1

login	auth required		pam_unix_cred.so.1

login	auth sufficient		pam_unix_auth.so.1

login	auth required		pam_ldap.so.1

#

# rlogin service (explicit because of pam_rhost_auth)

#

rlogin	auth sufficient		pam_rhosts_auth.so.1

rlogin	auth requisite		pam_authtok_get.so.1

rlogin	auth required		pam_dhkeys.so.1

rlogin	auth required		pam_unix_cred.so.1

rlogin	auth sufficient		pam_unix_auth.so.1

rlogin	auth required		pam_ldap.so.1

#

# rsh service (explicit because of pam_rhost_auth,

# and pam_unix_auth for meaningful pam_setcred)

#

rsh	auth sufficient		pam_rhosts_auth.so.1

rsh	auth required		pam_unix_cred.so.1

#

# PPP service (explicit because of pam_dial_auth)

#

ppp	auth requisite		pam_authtok_get.so.1

ppp	auth required		pam_dhkeys.so.1

ppp	auth required		pam_dial_auth.so.1

ppp	auth sufficient		pam_unix_auth.so.1

ppp	auth required		pam_ldap.so.1

#

# Default definitions for Authentication management

# Used when service name is not explicitly mentioned for authentication

#

other	auth requisite		pam_authtok_get.so.1

other	auth required		pam_dhkeys.so.1

other	auth required		pam_unix_cred.so.1

other	auth sufficient		pam_unix_auth.so.1

other	auth required		pam_ldap.so.1

#

# passwd command (explicit because of a different authentication module)

#

passwd	auth sufficient		pam_passwd_auth.so.1

passwd	auth required		pam_ldap.so.1

#

# cron service (explicit because of non-usage of pam_roles.so.1)

#

cron	account required	pam_unix_account.so.1

#

# Default definition for Account management

# Used when service name is not explicitly mentioned for account management

#

other	account requisite	pam_roles.so.1

other	account required	pam_unix_account.so.1

#

# Default definition for Session management

# Used when service name is not explicitly mentioned for session management

#

other	session required	pam_unix_session.so.1

#

# Default definition for  Password management

# Used when service name is not explicitly mentioned for password management

#

other	password required	pam_dhkeys.so.1

other	password requisite	pam_authtok_get.so.1

other	password requisite	pam_authtok_check.so.1

other	password required	pam_authtok_store.so.1

#

# Support for Kerberos V5 authentication and example configurations can

# be found in the pam_krb5(5) man page under the "EXAMPLES" section.

#

为帐户管理配置的 pam_ldap 的示例 pam_conf 文件


注意 –

启用 pam_ldap 帐户管理后,所有用户在每次登录系统时都必须提供口令。进行验证时必须提供登录口令。因此,使用 rshrloginssh 等工具进行的不基于口令的登录将会失败。



#

# Authentication management

#

# login service (explicit because of pam_dial_auth)

#

login   auth requisite        pam_authtok_get.so.1

login   auth required         pam_dhkeys.so.1

login   auth required         pam_unix_cred.so.1

login   auth required         pam_dial_auth.so.1

login   auth binding          pam_unix_auth.so.1 server_policy

login   auth required         pam_ldap.so.1

#

# rlogin service (explicit because of pam_rhost_auth)

#

rlogin  auth sufficient       pam_rhosts_auth.so.1

rlogin  auth requisite        pam_authtok_get.so.1

rlogin  auth required         pam_dhkeys.so.1

rlogin  auth required         pam_unix_cred.so.1

rlogin  auth binding          pam_unix_auth.so.1 server_policy

rlogin  auth required         pam_ldap.so.1

#

# rsh service (explicit because of pam_rhost_auth,

# and pam_unix_auth for meaningful pam_setcred)

#

rsh     auth sufficient       pam_rhosts_auth.so.1

rsh     auth required         pam_unix_cred.so.1

rsh     auth binding          pam_unix_auth.so.1 server_policy

rsh     auth required         pam_ldap.so.1

#

# PPP service (explicit because of pam_dial_auth)

#

ppp     auth requisite        pam_authtok_get.so.1

ppp     auth required         pam_dhkeys.so.1

ppp     auth required         pam_dial_auth.so.1

ppp     auth binding          pam_unix_auth.so.1 server_policy

ppp     auth required         pam_ldap.so.1

#

# Default definitions for Authentication management

# Used when service name is not explicitly mentioned for authentication

#

other   auth requisite        pam_authtok_get.so.1

other   auth required         pam_dhkeys.so.1

other   auth required         pam_unix_cred.so.1

other   auth binding          pam_unix_auth.so.1 server_policy

other   auth required         pam_ldap.so.1

#

# passwd command (explicit because of a different authentication module)

#

passwd  auth binding          pam_passwd_auth.so.1 server_policy

passwd  auth required         pam_ldap.so.1

#

# cron service (explicit because of non-usage of pam_roles.so.1)

#

cron    account required      pam_unix_account.so.1

#

# Default definition for Account management

# Used when service name is not explicitly mentioned for account management

#

other   account requisite     pam_roles.so.1

other   account binding       pam_unix_account.so.1 server_policy

other   account required      pam_ldap.so.1

#

# Default definition for Session management

# Used when service name is not explicitly mentioned for session management

#

other   session required      pam_unix_session.so.1

#

# Default definition for  Password management

# Used when service name is not explicitly mentioned for password management

#

other   password required     pam_dhkeys.so.1

other   password requisite    pam_authtok_get.so.1

other   password requisite    pam_authtok_check.so.1

other   password required     pam_authtok_store.so.1 server_policy

#

# Support for Kerberos V5 authentication and example configurations can

# be found in the pam_krb5(5) man page under the "EXAMPLES" section.

#

LDAP 的 IETF 架构

架构是一些定义,用于描述哪些类型的信息可作为项存储在服务器的目录中。

为了使目录服务器支持 Solaris LDAP 名称客户机,本章中定义的架构必须在服务器中进行配置,除非该架构是使用客户机的架构映射功能进行映射的。

IETF 定义了三个必需的 LDAP 架构:RFC 2307 网络信息服务架构、LDAP 邮件组 Internet 草案和 LDAP Internet 打印协议 (Internet Print Protocol, IPP) 草案架构。为了支持名称信息服务,必须将这些架构的定义添加到目录服务器中。还可以从 IETF Web 站点 http://www.ietf.org 访问各种 RFC。


注意 –

Internet 草案是草案文档,有效期最长六个月,随时可能会因其他文档而更新或废弃。


RFC 2307 网络信息服务架构

必须对 LDAP 服务器进行配置,使其支持 修订后的 RFC 2307。

nisSchema OID 是 1.3.6.1.1。RFC 2307 属性如下所示:


( nisSchema.1.0 NAME 'uidNumber'

DESC 'An integer uniquely identifying a user in an

		administrative domain'

EQUALITY integerMatch SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.1 NAME 'gidNumber'

DESC 'An integer uniquely identifying a group in an

		administrative domain'

EQUALITY integerMatch SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.2 NAME 'gecos'

DESC 'The GECOS field; the common name'

EQUALITY caseIgnoreIA5Match

SUBSTRINGS caseIgnoreIA5SubstringsMatch

SYNTAX 'IA5String' SINGLE-VALUE )

 

( nisSchema.1.3 NAME 'homeDirectory'

DESC 'The absolute path to the home directory'

EQUALITY caseExactIA5Match

SYNTAX 'IA5String' SINGLE-VALUE )

 

( nisSchema.1.4 NAME 'loginShell'

DESC 'The path to the login shell'

EQUALITY caseExactIA5Match

SYNTAX 'IA5String' SINGLE-VALUE )

 

( nisSchema.1.5 NAME 'shadowLastChange'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.6 NAME 'shadowMin'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.7 NAME 'shadowMax'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.8 NAME 'shadowWarning'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.9 NAME 'shadowInactive'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.10 NAME 'shadowExpire'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.11 NAME 'shadowFlag'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.12 NAME 'memberUid'

EQUALITY caseExactIA5Match

SUBSTRINGS caseExactIA5SubstringsMatch

SYNTAX 'IA5String' )

 

( nisSchema.1.13 NAME 'memberNisNetgroup'

EQUALITY caseExactIA5Match

SUBSTRINGS caseExactIA5SubstringsMatch

SYNTAX 'IA5String' )

 

( nisSchema.1.14 NAME 'nisNetgroupTriple'

DESC 'Netgroup triple'

SYNTAX 'nisNetgroupTripleSyntax' )

 

( nisSchema.1.15 NAME 'ipServicePort'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.16 NAME 'ipServiceProtocol'

SUP name )

 

( nisSchema.1.17 NAME 'ipProtocolNumber'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )

 

( nisSchema.1.18 NAME 'oncRpcNumber'

EQUALITY integerMatch

SYNTAX 'INTEGER' SINGLE-VALUE )



( nisSchema.1.19 NAME 'ipHostNumber'

DESC 'IP address as a dotted decimal, eg. 192.168.1.1

	     omitting leading zeros'

SUP name )

 

( nisSchema.1.20 NAME 'ipNetworkNumber'

DESC 'IP network as a dotted decimal, eg. 192.168,

     	omitting leading zeros'

SUP name SINGLE-VALUE )

 

( nisSchema.1.21 NAME 'ipNetmaskNumber'

DESC 'IP netmask as a dotted decimal, eg. 255.255.255.0,

	      omitting leading zeros'

EQUALITY caseIgnoreIA5Match

SYNTAX 'IA5String{128}' SINGLE-VALUE )

 

( nisSchema.1.22 NAME 'macAddress'

DESC 'MAC address in maximal, colon separated hex

      notation, eg. 00:00:92:90:ee:e2'

EQUALITY caseIgnoreIA5Match

SYNTAX 'IA5String{128}' )

 

( nisSchema.1.23 NAME 'bootParameter'

DESC 'rpc.bootparamd parameter'

SYNTAX 'bootParameterSyntax' )

 

( nisSchema.1.24 NAME 'bootFile'

DESC 'Boot image name'

EQUALITY caseExactIA5Match

SYNTAX 'IA5String' )

 

( nisSchema.1.26 NAME 'nisMapName'

SUP name )

 

( nisSchema.1.27 NAME 'nisMapEntry'

EQUALITY caseExactIA5Match

SUBSTRINGS caseExactIA5SubstringsMatch

SYNTAX 'IA5String{1024}' SINGLE-VALUE )

 

( nisSchema.1.28 NAME 'nisPublicKey'

DESC 'NIS public key'

SYNTAX 'nisPublicKeySyntax' )

 

( nisSchema.1.29 NAME 'nisSecretKey'

DESC 'NIS secret key'

SYNTAX 'nisSecretKeySyntax' )

 

( nisSchema.1.30 NAME 'nisDomain'

DESC 'NIS domain'

SYNTAX 'IA5String' )



( nisSchema.1.31 NAME 'automountMapName'

DESC 'automount Map Name'

EQUALITY caseExactIA5Match

SUBSTR caseExactIA5SubstringsMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )



( nisSchema.1.32 NAME 'automountKey'

DESC 'Automount Key value'

EQUALITY caseExactIA5Match

SUBSTR caseExactIA5SubstringsMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )



( nisSchema.1.33 NAME 'automountInformation'

DESC 'Automount information'

EQUALITY caseExactIA5Match

SUBSTR caseExactIA5SubstringsMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

nisSchema OID 是 1.3.6.1.1。RFC 2307 objectClasses 如下所示:


( nisSchema.2.0 NAME 'posixAccount' SUP top AUXILIARY

  DESC 'Abstraction of an account with POSIX attributes'

  MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )

  MAY ( userPassword $ loginShell $ gecos $ description ) )

 

( nisSchema.2.1 NAME 'shadowAccount' SUP top AUXILIARY

  DESC 'Additional attributes for shadow passwords'

  MUST uid

  MAY ( userPassword $ shadowLastChange $ shadowMin

        shadowMax $ shadowWarning $ shadowInactive $

        shadowExpire $ shadowFlag $ description ) )

 

( nisSchema.2.2 NAME 'posixGroup' SUP top STRUCTURAL

  DESC 'Abstraction of a group of accounts'

  MUST ( cn $ gidNumber )

  MAY ( userPassword $ memberUid $ description ) )

 

( nisSchema.2.3 NAME 'ipService' SUP top STRUCTURAL

  DESC 'Abstraction an Internet Protocol service.

        Maps an IP port and protocol (such as tcp or udp)

        to one or more names; the distinguished value of

        the cn attribute denotes the service's canonical

        name'

  MUST ( cn $ ipServicePort $ ipServiceProtocol )

  MAY ( description ) )

 

( nisSchema.2.4 NAME 'ipProtocol' SUP top STRUCTURAL

  DESC 'Abstraction of an IP protocol. Maps a protocol number

        to one or more names. The distinguished value of the cn

        attribute denotes the protocol's canonical name'

  MUST ( cn $ ipProtocolNumber )

  MAY  description )

 

( nisSchema.2.5 NAME 'oncRpc' SUP top STRUCTURAL

  DESC 'Abstraction of an Open Network Computing (ONC)

        [RFC1057] Remote Procedure Call (RPC) binding.

        This class maps an ONC RPC number to a name.

        The distinguished value of the cn attribute denotes

        the RPC service's canonical name'

  MUST ( cn $ oncRpcNumber $ description )

  MAY  description )

 

( nisSchema.2.6 NAME 'ipHost' SUP top AUXILIARY

  DESC 'Abstraction of a host, an IP device. The distinguished

        value of the cn attribute denotes the host's canonical

        name. Device SHOULD be used as a structural class'

  MUST ( cn $ ipHostNumber )

  MAY ( l $ description $ manager $ userPassword ) )

 

( nisSchema.2.7 NAME 'ipNetwork' SUP top STRUCTURAL

  DESC 'Abstraction of a network. The distinguished value of

        the cn attribute denotes the network's canonical name'

  MUST ipNetworkNumber

  MAY ( cn $ ipNetmaskNumber $ l $ description $ manager ) )

 

( nisSchema.2.8 NAME 'nisNetgroup' SUP top STRUCTURAL

  DESC 'Abstraction of a netgroup. May refer to other netgroups'

  MUST cn

  MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) )



( nisSchema.2.9 NAME 'nisMap' SUP top STRUCTURAL

  DESC 'A generic abstraction of a NIS map'

  MUST nisMapName

  MAY description )

 

( nisSchema.2.10 NAME 'nisObject' SUP top STRUCTURAL

  DESC 'An entry in a NIS map'

  MUST ( cn $ nisMapEntry $ nisMapName )

  MAY description )



( nisSchema.2.11 NAME 'ieee802Device' SUP top AUXILIARY

  DESC 'A device with a MAC address; device SHOULD be

        used as a structural class'

  MAY macAddress )

 

( nisSchema.2.12 NAME 'bootableDevice' SUP top AUXILIARY

  DESC 'A device with boot parameters; device SHOULD be

  used as a structural class'

  MAY ( bootFile $ bootParameter ) )

 

( nisSchema.2.14 NAME 'nisKeyObject' SUP top AUXILIARY

  DESC 'An object with a public and secret key'

  MUST ( cn $ nisPublicKey $ nisSecretKey )

  MAY ( uidNumber $ description ) )

 

( nisSchema.2.15 NAME 'nisDomainObject' SUP top AUXILIARY

  DESC 'Associates a NIS domain with a naming context'

  MUST nisDomain )



( nisSchema.2.16 NAME 'automountMap' SUP top STRUCTURAL

  MUST ( automountMapName )

  MAY description )



( nisSchema.2.17 NAME 'automount' SUP top STRUCTURAL

  DESC 'Automount information'

  MUST ( automountKey $ automountInformation )

  MAY description )

邮件别名架构

邮件别名 信息使用由 LDAP 邮件组 Internet 草案(以前称为 draft-steinback-ldap-mailgroups 草案)定义的架构。Solaris LDAP 客户机将继续对邮件别名信息使用此架构,直到有新的架构可用。

原来的 LDAP 邮件组架构中包含大量属性和对象类。Solaris 客户机仅使用下面列出的两个属性和一个对象类:

邮件别名 属性如下所示:


( 0.9.2342.19200300.100.1.3

  NAME 'mail'

  DESC 'RFC822 email address for this person'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String(256)'

  SINGLE-VALUE )

 

( 2.16.840.1.113730.3.1.30

  NAME 'mgrpRFC822MailMember'

  DESC 'RFC822 mail address of email only member of group'

  EQUALITY CaseIgnoreIA5Match

  SYNTAX 'IA5String(256)' )

邮件别名 objectClass 如下所示:


( 2.16.840.1.113730.3.2.4

  NAME 'mailGroup'

  SUP top

  STRUCTURAL

  MUST mail

  MAY ( cn $ mailAlternateAddress $ mailHost $ mailRequireAuth $

   mgrpAddHeader $ mgrpAllowedBroadcaster $ mgrpAllowedDomain $

   mgrpApprovePassword $ mgrpBroadcasterModeration $ mgrpDeliverTo $

   mgrpErrorsTo $ mgrpModerator $ mgrpMsgMaxSize $

   mgrpMsgRejectAction $ mgrpMsgRejectText $ mgrpNoMatchAddrs $

   mgrpRemoveHeader $ mgrpRFC822MailMember ))

目录用户代理配置文件 (DUAProfile) 架构

DUAConfSchemaOID1.3.6.1.4.1.11.1.3.1


DESC 'Default LDAP server host address used by a DUA'

            EQUALITY caseIgnoreMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.15

            SINGLE-VALUE )



          ( DUAConfSchemaOID.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 )



          ( DUAConfSchemaOID.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 )



          ( DUAConfSchemaOID.1.3 NAME 'searchTimeLimit'

            DESC 'Maximum time in seconds a DUA should allow for a

            search to complete'

            EQUALITY integerMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.27

            SINGLE-VALUE )



          ( DUAConfSchemaOID.1.4 NAME 'bindTimeLimit'

            DESC 'Maximum time in seconds a DUA should allow for the

            bind operation to complete'

            EQUALITY integerMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.27

            SINGLE-VALUE )



          ( DUAConfSchemaOID.1.5 NAME 'followReferrals'

            DESC 'Tells DUA if it should follow referrals

            returned by a DSA search result'

            EQUALITY caseIgnoreIA5Match

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.7

            SINGLE-VALUE )



          ( DUAConfSchemaOID.1.6 NAME 'authenticationMethod'

            DESC 'A keystring which identifies the type of

            authentication method used to contact the DSA'

            EQUALITY caseIgnoreMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.15

            SINGLE-VALUE )



          ( DUAConfSchemaOID.1.7 NAME 'profileTTL'

            DESC 'Time to live, in seconds, before a client DUA

            should re-read this configuration profile' 

				'serviceSearchDescriptor'

            DESC 'LDAP search descriptor list used by a DUA'

            EQUALITY caseExactMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )



          ( DUAConfSchemaOID.1.9 NAME 'attributeMap'

            DESC 'Attribute mappings used by a DUA'

            EQUALITY caseIgnoreIA5Match

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )



          ( DUAConfSchemaOID.1.10 NAME 'credentialLevel'

            DESC 'Identifies type of credentials a DUA should

            use when binding to the LDAP server'

            EQUALITY caseIgnoreIA5Match

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.26

            SINGLE-VALUE )



          ( DUAConfSchemaOID.1.11 NAME 'objectclassMap'

            DESC 'Objectclass mappings used by a DUA'

            EQUALITY caseIgnoreIA5Match

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )



          ( DUAConfSchemaOID.1.12 NAME 'defaultSearchScope' SINGLE-VALUE )



          ( DUAConfSchemaOID.1.13 NAME 'serviceCredentialLevel'

            DESC 'Identifies type of credentials a DUA

            should use when binding to the LDAP server for a

            specific service'

            EQUALITY caseIgnoreIA5Match

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )



          ( DUAConfSchemaOID.1.15 NAME 'serviceAuthenticationMethod'

            DESC 'Authentication Method used by a service of the DUA'

            EQUALITY caseIgnoreMatch

            SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )



			  ( DUAConfSchemaOID.2.4 NAME 'DUAConfigProfile'

			  	 SUP top STRUCTURAL

				 DESC 'Abstraction of a base configuration for a DUA'

				 MUST ( cn )

				 MAY ( defaultServerList $ preferredServerList $

                defaultSearchBase $ defaultSearchScope $

                searchTimeLimit $ bindTimeLimit $

                credentialLevel $ authenticationMethod $

                followReferrals $ serviceSearchDescriptor $

                serviceCredentialLevel $ serviceAuthenticationMethod $

                objectclassMap $ attributeMap $

                profileTTL ) )  	

Solaris 架构

Solaris 平台所需的架构有:

Solaris 项目架构

/etc/project 是与项目相关联的属性的本地源。有关更多信息,请参见 project(4)

项目属性如下所示:


( 1.3.6.1.4.1.42.2.27.5.1.1 NAME 'SolarisProjectID'

  DESC 'Unique ID for a Solaris Project entry'

  EQUALITY integerMatch

  SYNTAX INTEGER SINGLE )



( 1.3.6.1.4.1.42.2.27.5.1.2 NAME 'SolarisProjectName'

  DESC 'Name of a Solaris Project entry'

  EQUALITY caseExactIA5Match

  SYNTAX IA5String SINGLE )



( 1.3.6.1.4.1.42.2.27.5.1.3 NAME 'SolarisProjectAttr'

  DESC 'Attributes of a Solaris Project entry'

  EQUALITY caseExactIA5Match

  SYNTAX IA5String )



( 1.3.6.1.4.1.42.2.27.5.1.30 NAME 'memberGid'

  DESC 'Posix Group Name'

  EQUALITY caseExactIA5Match

  SYNTAX 'IA5String' )

项目objectClass 如下所示:


( 1.3.6.1.4.1.42.2.27.5.2.1 NAME 'SolarisProject'

  SUP top STRUCTURAL

  MUST ( SolarisProjectID $ SolarisProjectName )

  MAY ( memberUid $ memberGid $ description $ SolarisProjectAttr ) )

基于角色的访问控制和执行配置文件架构

/etc/user_attr 是与用户和角色相关联的扩展属性的本地源。有关更多信息,请参见 user_attr(4)

基于角色的访问控制 属性如下所示:


( 1.3.6.1.4.1.42.2.27.5.1.4 NAME 'SolarisAttrKeyValue'

  DESC 'Semi-colon separated key=value pairs of attributes'

  EQUALITY caseIgnoreIA5Match

  SUBSTRINGS caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.7 NAME 'SolarisAttrShortDesc'

  DESC 'Short description about an entry, used by GUIs'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.8 NAME 'SolarisAttrLongDesc'

  DESC 'Detail description about an entry'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.9 NAME 'SolarisKernelSecurityPolicy'

  DESC 'Solaris  kernel security policy'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.10 NAME 'SolarisProfileType'

  DESC 'Type of object defined in profile'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.11 NAME 'SolarisProfileId'

  DESC 'Identifier of object defined in profile'

  EQUALITY caseExactIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.12 NAME 'SolarisUserQualifier'

  DESC 'Per-user login attributes'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.13 NAME 'SolarisReserved1'

  DESC 'Reserved for future use'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

 

( 1.3.6.1.4.1.42.2.27.5.1.14 NAME 'SolarisReserved2'

  DESC 'Reserved for future use'

  EQUALITY caseIgnoreIA5Match

  SYNTAX 'IA5String' SINGLE-VALUE )

基于角色的访问控制 objectClassses 如下所示:


( 1.3.6.1.4.1.42.2.27.5.2.3 NAME 'SolarisUserAttr' SUP top AUXILIARY

  DESC 'User attributes'

  MAY ( SolarisUserQualifier $ SolarisAttrReserved1 $ \

        SolarisAttrReserved2 $ SolarisAttrKeyValue ) )

 

( 1.3.6.1.4.1.42.2.27.5.2.4 NAME 'SolarisAuthAttr' SUP top STRUCTURAL

  DESC 'Authorizations data'

  MUST cn

  MAY ( SolarisAttrReserved1 $ SolarisAttrReserved2 $ \

        SolarisAttrShortDesc $ SolarisAttrLongDesc $ \

        SolarisAttrKeyValue ) )

 

( 1.3.6.1.4.1.42.2.27.5.2.5 NAME 'SolarisProfAttr' SUP top STRUCTURAL

  DESC 'Profiles data'

  MUST cn

  MAY ( SolarisAttrReserved1 $ SolarisAttrReserved2 $ \

        SolarisAttrLongDesc $ SolarisAttrKeyValue ) )

 

( 1.3.6.1.4.1.42.2.27.5.2.6 NAME 'SolarisExecAttr' SUP top AUXILIARY

  DESC 'Profiles execution attributes'

  MAY ( SolarisKernelSecurityPolicy $ SolarisProfileType $ \

        SolarisAttrReserved1 $ SolarisAttrReserved2 $ \

        SolarisProfileId $ SolarisAttrKeyValue ) )

LDAP 的 Internet 打印协议信息

以下各节提供有关 Internet 打印协议和 Sun 打印机的属性和 ObjectClasses 的信息。

Internet 打印协议 (Internet Print Protocol, IPP) 属性


( 1.3.18.0.2.4.1140 

NAME 'printer-uri' 

DESC 'A URI supported by this printer.  

This URI SHOULD be used as a relative distinguished name (RDN).  

If printer-xri-supported is implemented, then this URI value 

MUST be listed in a member value of printer-xri-supported.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

( 1.3.18.0.2.4.1107 

NAME 'printer-xri-supported' 

DESC 'The unordered list of XRI (extended resource identifiers) supported 

by this printer.  

Each member of the list consists of a URI (uniform resource identifier) 

followed by optional authentication and security metaparameters.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

( 1.3.18.0.2.4.1135 

NAME 'printer-name' 

DESC 'The site-specific administrative name of this printer, more end-user 

friendly than a URI.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127}  SINGLE-VALUE )

( 1.3.18.0.2.4.1119 

NAME 'printer-natural-language-configured' 

DESC 'The configured language in which error and status messages will be 

generated (by default) by this printer.  

Also, a possible language for printer string attributes set by operator, 

system administrator, or manufacturer.  

Also, the (declared) language of the "printer-name", "printer-location", 

"printer-info", and "printer-make-and-model" attributes of this printer. 

For example: "en-us" (US English) or "fr-fr" (French in France) Legal values of 

language tags conform to [RFC3066] "Tags for the Identification of Languages".' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127}  SINGLE-VALUE )

( 1.3.18.0.2.4.1136 

NAME 'printer-location' 

DESC 'Identifies the location of the printer. This could include

things like: "in Room 123A", "second floor of building XYZ".' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} SINGLE-VALUE )

( 1.3.18.0.2.4.1139 

NAME 'printer-info' 

DESC 'Identifies the descriptive information about this printer.  

This could include things like: "This printer can be used for 

printing color transparencies for HR presentations", or 

"Out of courtesy for others, please print only small (1-5 page) 

jobs at this printer", or even "This printer is going away on July 1, 1997, 

please find a new printer".' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} 

SINGLE-VALUE )

( 1.3.18.0.2.4.1134 

NAME 'printer-more-info' 

DESC 'A URI used to obtain more information about this specific printer.  

For example, this could be an HTTP type URI referencing an HTML page 

accessible to a Web Browser.  

The information obtained from this URI is intended for end user consumption.' 

EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )

( 1.3.18.0.2.4.1138 

NAME 'printer-make-and-model' 

DESC 'Identifies the make and model of the device.  

The device manufacturer MAY initially populate this attribute.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{127}  SINGLE-VALUE )

( 1.3.18.0.2.4.1133 

NAME 'printer-ipp-versions-supported' 

DESC 'Identifies the IPP protocol version(s) that this printer supports, 

including major and minor versions, 

i.e., the version numbers for which this Printer implementation meets 

the conformance requirements.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1132 

NAME 'printer-multiple-document-jobs-supported' 

DESC 'Indicates whether or not the printer supports more than one 

document per job, i.e., more than one Send-Document or Send-Data 

operation with document data.' 

EQUALITY booleanMatch 

SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )

( 1.3.18.0.2.4.1109 

NAME 'printer-charset-configured' 

DESC 'The configured charset in which error and status messages will be 

generated (by default) by this printer.  

Also, a possible charset for printer string attributes set by operator, 

system administrator, or manufacturer.  

For example: "utf-8" (ISO 10646/Unicode) or "iso-8859-1" (Latin1).  

Legal values are defined by the IANA Registry of Coded Character Sets and 

the "(preferred MIME name)" SHALL be used as the tag.  

For coherence with IPP Model, charset tags in this attribute SHALL be 

lowercase normalized.  

This attribute SHOULD be static (time of registration) and SHOULD NOT be

dynamically refreshed attributetypes: (subsequently).' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{63} SINGLE-VALUE )

( 1.3.18.0.2.4.1131 

NAME 'printer-charset-supported' 

DESC 'Identifies the set of charsets supported for attribute type values of 

type Directory String for this directory entry.  

For example: "utf-8" (ISO 10646/Unicode) or "iso-8859-1" (Latin1).  

Legal values are defined by the IANA Registry of Coded Character Sets and 

the preferred MIME name.' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{63} )

( 1.3.18.0.2.4.1137 

NAME 'printer-generated-natural-language-supported' 

DESC 'Identifies the natural language(s) supported for this directory entry.  

For example: "en-us" (US English) or "fr-fr" (French in France).  

Legal values conform to [RFC3066], Tags for the Identification of Languages.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{63} )

( 1.3.18.0.2.4.1130 

NAME 'printer-document-format-supported' 

DESC 'The possible document formats in which data may be interpreted 

and printed by this printer.  

Legal values are MIME types come from the IANA Registry of Internet Media Types.' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1129 

NAME 'printer-color-supported' 

DESC 'Indicates whether this printer is capable of any type of color printing 

at all, including highlight color.' 

EQUALITY booleanMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.7  SINGLE-VALUE )

( 1.3.18.0.2.4.1128 

NAME 'printer-compression-supported' 

DESC 'Compression algorithms supported by this printer.  

For example: "deflate, gzip".  Legal values include; "none", "deflate" 

attributetypes: (public domain ZIP), "gzip" (GNU ZIP), "compress" (UNIX).' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{255} )

( 1.3.18.0.2.4.1127 

NAME 'printer-pages-per-minute' 

DESC 'The nominal number of pages per minute which may be output by this 

printer (e.g., a simplex or black-and-white printer).  

This attribute is informative, NOT a service guarantee.  

Typically, it is the value used in marketing literature to describe this printer.' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27  SINGLE-VALUE )

( 1.3.18.0.2.4.1126 NAME 'printer-pages-per-minute-color' 

DESC 'The nominal number of color pages per minute which may be output by this 

printer (e.g., a simplex or color printer).  

This attribute is informative, NOT a service guarantee.  

Typically, it is the value used in marketing literature to describe this printer.' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27  SINGLE-VALUE )

( 1.3.18.0.2.4.1125 NAME 'printer-finishings-supported' 

DESC 'The possible finishing operations supported by this printer. 

Legal values include; "none", "staple", "punch", "cover", "bind", "saddle-stitch", 

"edge-stitch", "staple-top-left", "staple-bottom-left", "staple-top-right", 

"staple-bottom-right", "edge-stitch-left", "edge-stitch-top", "edge-stitch-right", 

"edge-stitch-bottom", "staple-dual-left", "staple-dual-top", "staple-dual-right", 

"staple-dual-bottom".' 

EQUALITY caseIgnoreMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{255} )

( 1.3.18.0.2.4.1124 NAME 'printer-number-up-supported' 

DESC 'The possible numbers of print-stream pages to impose upon a single side of 

an instance of a selected medium. Legal values include; 1, 2, and 4.  

Implementations may support other values.' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27 )

( 1.3.18.0.2.4.1123 NAME 'printer-sides-supported' 

DESC 'The number of impression sides (one or two) and the two-sided impression 

rotations supported by this printer.  

Legal values include; "one-sided", "two-sided-long-edge", "two-sided-short-edge".' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1122 NAME 'printer-media-supported' 

DESC 'The standard names/types/sizes (and optional color suffixes) of the media 

supported by this printer.  

For example: "iso-a4",  "envelope", or "na-letter-white".  

Legal values  conform to ISO 10175, Document Printing Application (DPA), and any 

IANA registered extensions.'

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{255} )

( 1.3.18.0.2.4.1117 NAME 'printer-media-local-supported' 

DESC 'Site-specific names of media supported by this printer, in the language in 

"printer-natural-language-configured".  

For example: "purchasing-form" (site-specific name) as opposed to 

(in "printer-media-supported"): "na-letter" (standard keyword from ISO 10175).' 

EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{255} )

( 1.3.18.0.2.4.1121 NAME 'printer-resolution-supported' 

DESC 'List of resolutions supported for printing documents by this printer.  

Each resolution value is a string with 3 fields:  

1) Cross feed direction resolution (positive integer), 2) Feed direction 

resolution (positive integer), 3) Resolution unit.  

Legal values are "dpi" (dots per inch) and "dpcm" (dots per centimeter).  

Each resolution field is delimited by ">".  For example:  "300> 300> dpi>".' 

EQUALITY caseIgnoreMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{255} )

( 1.3.18.0.2.4.1120 NAME 'printer-print-quality-supported' 

DESC 'List of print qualities supported for printing documents on this printer.  

For example: "draft, normal".  Legal values include; "unknown", "draft", "normal", 

"high".' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1110 NAME 'printer-job-priority-supported' 

DESC 'Indicates the number of job priority levels supported.  

An IPP conformant printer which supports job priority must always support a 

full range of priorities from "1" to "100" 

(to ensure consistent behavior), therefore this attribute describes the 

"granularity". 

 Legal values of this attribute are from "1" to "100".' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27  SINGLE-VALUE )

( 1.3.18.0.2.4.1118 

NAME 'printer-copies-supported' 

DESC 'The maximum number of copies of a document that may be printed as a single job.  

A value of "0" indicates no maximum limit.  

A value of "-1" indicates unknown.' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27  SINGLE-VALUE )

( 1.3.18.0.2.4.1111 

NAME 'printer-job-k-octets-supported' 

DESC 'The maximum size in kilobytes (1,024 octets actually) incoming print job that 

this printer will accept.  

A value of "0" indicates no maximum limit.  A value of "-1" indicates unknown.' 

EQUALITY integerMatch 

ORDERING integerOrderingMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.27  SINGLE-VALUE )

( 1.3.18.0.2.4.1113 

NAME 'printer-service-person' 

DESC 'The name of the current human service person responsible for servicing this 

printer.  

It is suggested that this string include information that would enable other humans 

to reach the service person, such as a phone number.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127}  

SINGLE-VALUE )

( 1.3.18.0.2.4.1114 

NAME 'printer-delivery-orientation-supported' 

DESC 'The possible delivery orientations of pages as they are printed and ejected 

from this printer.  

Legal values include; "unknown", "face-up", and "face-down".' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1115 

NAME 'printer-stacking-order-supported' 

DESC 'The possible stacking order of pages as they are printed and ejected from 

this printer. 

Legal values include; "unknown", "first-to-last", "last-to-first".' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1116 

NAME 'printer-output-features-supported' 

DESC 'The possible output features supported by this printer. 

Legal values include; "unknown", "bursting", "decollating", "page-collating", 

"offset-stacking".' 

EQUALITY caseIgnoreMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.18.0.2.4.1108 

NAME 'printer-aliases' 

DESC 'Site-specific administrative names of this printer in addition the printer 

name specified for printer-name.' 

EQUALITY caseIgnoreMatch 

ORDERING caseIgnoreOrderingMatch 

SUBSTR caseIgnoreSubstringsMatch 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15{127} )

( 1.3.6.1.4.1.42.2.27.5.1.63 

NAME 'sun-printer-bsdaddr' 

DESC 'Sets the server, print queue destination name and whether the client generates 

protocol extensions. 

"Solaris" specifies a Solaris print server extension. The value is represented b the 

following value: server "," destination ", Solaris".' 

SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )

( 1.3.6.1.4.1.42.2.27.5.1.64 

NAME 'sun-printer-kvp' 

DESC 'This attribute contains a set of key value pairs which may have meaning to the 

print subsystem or may be user defined. 

Each value is represented by the following: key "=" value.' 

SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )

Internet 打印协议 (Internet Print Protocol, IPP) ObjectClasses


objectclasses: ( 1.3.18.0.2.6.2549 

NAME 'slpService' 

DESC 'DUMMY definition' 

SUP 'top' MUST (objectclass) MAY ())

objectclasses: ( 1.3.18.0.2.6.254 

NAME 'slpServicePrinter' 

DESC 'Service Location Protocol (SLP) information.' 

AUXILIARY SUP 'slpService')

objectclasses: ( 1.3.18.0.2.6.258 

NAME 'printerAbstract' 

DESC 'Printer related information.' 

ABSTRACT SUP 'top' MAY ( printer-name 

$ printer-natural-language-configured 

$ printer-location 

$ printer-info 

$ printer-more-info 

$ printer-make-and-model 

$ printer-multiple-document-jobs-supported 

$ printer-charset-configured 

$ printer-charset-supported 

$ printer-generated-natural-language-supported 

$ printer-document-format-supported 

$ printer-color-supported 

$ printer-compression-supported 

$ printer-pages-per-minute 

$ printer-pages-per-minute-color 

$ printer-finishings-supported 

$ printer-number-up-supported 

$ printer-sides-supported 

$ printer-media-supported 

$ printer-media-local-supported 

$ printer-resolution-supported 

$ printer-print-quality-supported 

$ printer-job-priority-supported 

$ printer-copies-supported 

$ printer-job-k-octets-supported 

$ printer-current-operator 

$ printer-service-person 

$ printer-delivery-orientation-supported 

$ printer-stacking-order-supported $ printer! -output-features-supported ))

objectclasses: ( 1.3.18.0.2.6.255 

NAME 'printerService' 

DESC 'Printer information.' 

STRUCTURAL SUP 'printerAbstract' MAY ( printer-uri 

$ printer-xri-supported ))

objectclasses: ( 1.3.18.0.2.6.257 

NAME 'printerServiceAuxClass' 

DESC 'Printer information.' 

AUXILIARY SUP 'printerAbstract' MAY ( printer-uri $ printer-xri-supported ))

objectclasses: ( 1.3.18.0.2.6.256 

NAME 'printerIPP' 

DESC 'Internet Printing Protocol (IPP) information.' 

AUXILIARY SUP 'top' MAY   ( printer-ipp-versions-supported $ 

printer-multiple-document-jobs-supported ))

objectclasses: ( 1.3.18.0.2.6.253 

NAME 'printerLPR' 

DESC 'LPR information.' 

AUXILIARY SUP 'top' MUST ( printer-name ) MAY ( printer-aliases))

objectclasses: ( 1.3.6.1.4.1.42.2.27.5.2.14 

NAME 'sunPrinter' 

DESC 'Sun printer information' 

SUP 'top' AUXILIARY MUST (objectclass $ printer-name)  MAY 

(sun-printer-bsdaddr $ sun-printer-kvp))

Sun 打印机属性


ATTRIBUTE ( 1.3.6.1.4.1.42.2.27.5.1.63

NAME sun-printer-bsdaddr

DESC 'Sets the server, print queue destination name and whether the 

     client generates protocol extensions. "Solaris" specifies a 

     Solaris print server extension.  The value is represented by 

     the following value: server "," destination ", Solaris".'

EQUALITY caseIgnoreIA5Match

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15   

SINGLE-VALUE

)





ATTRIBUTE ( 1.3.6.1.4.1.42.2.27.5.1.64

NAME sun-printer-kvp

DESC 'This attribute contains a set of key value pairs which may have

      meaning to the print subsystem or may be user defined.  Each

      value is represented by the following: key "=" value.'

EQUALITY caseIgnoreIA5Match 

SYNTAX  1.3.6.1.4.1.1466.115.121.1.15  )

Sun 打印机 ObjectClasses


OBJECTCLASS ( 1.3.6.1.4.1.42.2.27.5.2.14

NAME sunPrinter

DESC 'Sun printer information'

SUP  top

AUXILIARY

MUST ( printer-name )

MAY  ( sun-printer-bsdaddr $ sun-printer-kvp ))

LDAP 的常规目录服务器要求

为了支持基于 Solaris 9 或更高 Solaris 版本的 LDAP 客户机,无论哪个品牌的服务器都必须支持 LDAP 3.0 版协议以及复合命名和辅助对象类。 另外,还必须至少支持下列控制之一:

如果使用 pam_unix,则服务器必须支持以 UNIX crypt 格式存储口令。

如果使用 TLS,则服务器必须支持 SSL 或 TLS。

LDAP 名称服务使用的缺省过滤器

如果没有使用 SSD 为给定的服务手动指定参数,将使用缺省过滤器。要列出给定服务的缺省过滤器,请使用带 -v 选项的 ldaplist

在以下示例中,filter=(&(objectclass=iphost)(cn=abcde) 定义了缺省过滤器:


database=hosts

filter=(&(objectclass=iphost)(cn=abcde)

user data=(&(%s) (cn=abcde))

ldaplist 生成缺省过滤器的以下列表,其中 %s 表示一个字符串,%d 表示一个数字:


hosts

(&(objectclass=iphost)(cn=%s))

--------------

passwd

(&(objectclass=posixaccount)(uid=%s))

--------------

services

(&(objectclass=ipservice)(cn=%s))

--------------

group

(&(objectclass=posixgroup)(cn=%s))

--------------

netgroup

(&(objectclass=nisnetgroup)(cn=%s))

--------------

networks

(&(objectclass=ipnetwork)(ipnetworknumber=%s))

--------------

netmasks

(&(objectclass=ipnetwork)(ipnetworknumber=%s))

--------------

rpc

(&(objectclass=oncrpc)(cn=%s))

--------------

protocols

(&(objectclass=ipprotocol)(cn=%s))

--------------

bootparams

(&(objectclass=bootableDevice)(cn=%s))

--------------

ethers

(&(objectclass=ieee802Device)(cn=%s))

--------------

publickey

(&(objectclass=niskeyobject)(cn=%s))

or

(&(objectclass=niskeyobject)(uidnumber=%d))

--------------

aliases

(&(objectclass=mailGroup)(cn=%s))

--------------

表 14–4 用在 getXbyY 调用中的 LDAP 过滤器

过滤器 

定义 

bootparamByName

(&(objectClass=bootableDevice)(cn=%s))

etherByHost

(&(objectClass=ieee802Device)(cn=%s))

etherByEther

(&(objectClass=ieee802Device)(macAddress=%s))

groupByName

(&(objectClass=posixGroup)(cn=%s))

groupByGID

(&(objectClass=posixGroup)(gidNumber=%ld))

groupByMember

(&(objectClass=posixGroup)(memberUid=%s))

hostsByName

(&(objectClass=ipHost)(cn=%s))

hostsByAddr

(&(objectClass=ipHost)(ipHostNumber=%s))

keyByUID

(&(objectClass=nisKeyObject)(uidNumber=%s))

keyByHost

(&(objectClass=nisKeyObject)(cn=%s))

netByName

(&(objectClass=ipNetwork)(cn=%s))

netByAddr

(&(objectClass=ipNetwork)(ipNetworkNumber=%s))

nisgroupMember

(membernisnetgroup=%s)

maskByNet

(&(objectClass=ipNetwork)(ipNetworkNumber=%s))

printerByName

(& (objectClass=sunPrinter)(|(printer-name=%s)(printer-aliases=%s)))

projectByName

(&(objectClass=SolarisProject)(SolarisProjectName=%s))

projectByID

(&(objectClass=SolarisProject)(SolarisProjectID=%ld))

protoByName

(&(objectClass=ipProtocol)(cn=%s))

protoByNumber

(&(objectClass=ipProtocol)(ipProtocolNumber=%d))

passwordByName

(&(objectClass=posixAccount)(uid=%s))

passwordByNumber

(&(objectClass=posixAccount)(uidNumber=%ld))

rpcByName

(&(objectClass=oncRpc)(cn=%s))

rpcByNumber

(&(objectClass=oncRpc)(oncRpcNumber=%d))

serverByName

(&(objectClass=ipService)(cn=%s))

serverByPort

(&(objectClass=ipService)(ipServicePort=%ld))

serverByNameAndProto

(&(objectClass=ipService)(cn=%s)(ipServiceProtocol=%s))

specialByNameserver

(ipServiceProtocol=%s))

ByPortAndProto

(&(objectClass=shadowAccount)(uid=%s))

netgroupByTriple

(&(objectClass=nisNetGroup)(nisnetgrouptriple=(%s,%s,%s)))

netgroupByMember

(&(objectClass=nisNetGroup)(|(membernisnetgroup=%s)

authName

(&(objectClass=SolarisAuthAttr)(cn=%s))

auditUserByName

(&(objectClass=SolarisAuditUser)(uid=%s))

execByName

(&(objectClass=SolarisExecAttr)(cn=%s) (SolarisKernelSecurityPolicy=%s)(SolarisProfileType=%s))

execByPolicy

(&(objectClass=SolarisExecAttr)(SolarisProfileId=%s) (SolarisKernelSecurityPolicy=%s)(SolarisProfileType=%s))

profileByName

(&(objectClass=SolarisProfAttr)(cn=%s))

userByName

(&(objectClass=SolarisUserAttr)(uid=%s))

下表列出了 getent 属性过滤器。

表 14–5 getent 属性过滤器

过滤器 

定义 

aliases

(objectClass=rfc822MailGroup)

auth_attr

(objectClass=SolarisAuthAttr)

audit_user

(objectClass=SolarisAuditUser)

exec_attr

(objectClass=SolarisExecAttr)

group

(objectClass=posixGroup)

hosts

(objectClass=ipHost)

networks

(objectClass=ipNetwork)

prof_attr

(objectClass=SolarisProfAttr)

protocols

(objectClass=ipProtocol)

passwd

(objectClass=posixAccount)

printers

(objectClass=sunPrinter)

rpc

(objectClass=oncRpc)

services

(objectClass=ipService)

shadow

(objectclass=shadowAccount)

project

(objectClass=SolarisProject)

usr_attr

(objectClass=SolarisUserAttr)

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

本章介绍如何启用对使用存储在 LDAP 目录中名称信息的 NIS 客户机的支持。通过遵照本章中的过程操作,可以从使用 NIS 名称服务转换为使用 LDAP 名称服务。

要了解转换到 LDAP 的益处,请参见LDAP 名称服务与其他名称服务的比较

本章将介绍以下信息:

NIS 到 LDAP 转换服务概述

NIS 到 LDAP 转换服务(N2L 服务)使用 NIS 到 LDAP 转换守护进程来替换 NIS 主服务器上现有的 NIS 守护进程。N2L 服务还在该服务器上创建一个 NIS 到 LDAP 的转换映射文件。该映射文件指定 NIS 映射项和 LDAP 中目录信息树 (Directory Information Tree, DIT) 等效项之间的映射。已经进行这种转换的 NIS 主服务器称为 N2L 服务器。从属服务器上没有 NISLDAPmapping 文件,因此它们继续以通常的方式工作。从属服务器定期从 N2L 服务器更新其数据,就好像 N2L 服务器是常规的 NIS 主服务器一样。

N2L 服务的行为由 ypservNISLDAPmapping 配置文件控制。脚本 inityp2l 可帮助对这些配置文件进行初始设置。一旦建立了 N2L 服务器,就可以通过直接编辑这些配置文件来维护 N2L。

N2L 服务支持以下功能:

在任何名称系统中,仅有一个信息源可以是权威来源。在传统的 NIS 中,NIS 源是权威信息。在使用 N2L 服务时,权威数据源自 LDAP 目录。如第 9 章,LDAP 的基本组件和概念(概述)中所述,该目录是通过使用目录管理工具进行管理的。

NIS 源仅保留用于紧急备份或卸载。在使用 N2L 服务之后,可以逐步淘汰 NIS 客户机。最终,所有的 NIS 客户机都会被 Solaris LDAP 名称服务客户机所取代。

以下各小节中提供了其他概述信息:

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

NIS 和 LDAP 服务由服务管理工具管理。 可以使用 svcadm 命令对这些服务执行启用、禁用或重新启动等管理操作。使用 svcs 命令可以查询服务的状态。有关使用 SMF 对 LDAP 和 NIS 进行管理的更多信息,请参见LDAP 和服务管理工具NIS 和服务管理工具。有关 SMF 的概述,请参阅System Administration Guide: Basic Administration中的“ Managing Services (Overview)”。另请参阅 svcadm(1M)svcs(1) 手册页以了解更多详细信息。

NIS 到 LDAP 转换的目标用户

您需要熟悉 NIS 和 LDAP 概念、术语和 ID 才能执行本章中的过程。有关 NIS 和 LDAP 名称服务的更多信息,请参见本书中的以下两章:

不应使用 NIS 到 LDAP 转换服务的情况

请勿在以下情况下使用 N2L 服务:

NIS 到 LDAP 转换服务对用户造成的影响

仅安装与 N2L 服务相关的文件不会更改 NIS 服务器的缺省行为。在安装时,管理员将会看到 NIS 手册页发生了一些变化,而且服务器上增加了 N2L 帮助脚本 inityp2lypmap2src。但是,只要在 NIS 服务器上没有运行 inityp2l 或没有手动创建 N2L 配置文件,NIS 组件就会继续在传统的 NIS 模式下启动并像通常那样工作。

运行 inityp2l 之后,用户会看到服务器和客户机行为发生了一些变化。以下是 NIS 和 LDAP 用户类型的列表,其中说明了在部署 N2L 服务之后每种类型的用户应当注意到的情况。

用户类型 

N2L 服务的影响 

NIS 主服务器管理员 

NIS 主服务器转换为 N2L 服务器。NISLDAPmappingypserv 配置文件将会安装在 N2L 服务器上。建立 N2L 服务器之后,可以使用 LDAP 命令来管理名称信息。

NIS 从属服务器管理员 

进行 N2L 转换之后,NIS 从属服务器继续以通常的方式运行 NIS。当 ypmake 调用 yppush 时,N2L 服务器会将已更新的 NIS 映射推送到从属服务器。请参见 ypmake(1M) 手册页。

NIS 客户机 

NIS 读取操作与传统的 NIS 没有区别。当 Solaris LDAP 名称服务客户机更改 DIT 中的信息时,这些信息会复制到 NIS 映射中。复制操作是在可配置的超时时间过期之后完成的。这类行为与连接到 NIS 从属服务器的常规 NIS 客户机的行为相似。 

如果 N2L 服务器无法绑定到 LDAP 服务器进行读取,则 N2L 服务器将从其自身的缓存副本中返回信息。或者,N2L 服务器还可能会返回内部服务器错误。可以将 N2L 服务器配置为按照上述任一方式响应。有关更多详细信息,请参见 ypserv(1M) 手册页。

所有用户 

当 NIS 客户机请求更改口令时,所做的更改将立即显示在 N2L 主服务器和本地 LDAP 客户机上。 

如果尝试在 NIS 客户机上更改口令,而且 LDAP 服务器不可用,则更改将被拒绝,N2L 服务器将返回内部服务器错误。此行为可防止将不正确的信息写入高速缓存中。 

NIS 到 LDAP 转换术语

以下是与实现 N2L 服务相关的术语。

表 15–1 与 N2L 转换相关的术语

术语 

说明 

N2L configuration file(N2L 配置文件) 

ypserv 守护进程用来在 N2L 模式下启动主服务器的 /var/yp/NISLDAPmapping 文件和 /var/yp/ypserv 文件。有关详细消息,请参见 NISLDAPmapping(4) 和 ypserv(4) 手册页。

map(映射) 

在 N2L 服务的上下文中,术语“映射”的用法有两种:

  • 指代 NIS 用于存储特定类型信息的数据库文件

  • 描述从 LDAP DIT 映射 NIS 信息或将 NIS 信息映射到 LDAP DIT 的过程

mapping(映射) 

NIS 项与 LDAP DIT 项之间的相互转换过程。 

mapping file(映射文件) 

用来指定如何映射 NIS 文件和 LDAP 文件之间各项的 NISLDAPmapping 文件。

standard map(标准映射) 

无需手动修改映射文件即可由 N2L 服务支持的常用 NIS 映射。支持的标准映射中提供了支持的标准映射的列表。

nonstandard map(非标准映射) 

自定义为使用 NIS 和 LDAP DIT 之间映射(RFC 2307 或其后续版本中标识的映射除外)的标准 NIS 映射。 

custom map(自定义映射) 

不是标准映射的任何映射,从 NIS 转换至 LDAP 时,需要手动修改映射文件。 

LDAP client(LDAP 客户机) 

对任何 LDAP 服务器执行读写操作的任何传统的 LDAP 客户机。传统的 LDAP 客户机是对任何 LDAP 服务器执行读写操作的系统。Solaris LDAP 名称服务客户机可处理部分自定义的名称信息。 

LDAP naming services client(LDAP 名称服务客户机) 

用来处理部分自定义名称信息的 Solaris LDAP 客户机。 

N2L server(N2L 服务器) 

已使用 N2L 服务重新配置为 N2L 服务器的 NIS 主服务器。重新配置过程包括替换 NIS 守护进程和添加新配置文件。 

NIS 到 LDAP 转换命令、文件和映射

共有两个实用程序、两个配置文件和一个映射与 N2L 转换相关联。

表 15–2 N2L 命令、文件和映射的说明

命令/文件/映射 

说明 

/usr/lib/netsvc/yp/inityp2l

帮助创建 NISLDAPmappingypserv 配置文件的实用程序。此实用程序不是用来管理这些文件的通用工具。高级用户可通过使用文本编辑器检查和自定义 inityp2l 输出来维护 N2L 配置文件或创建自定义映射。请参见 inityp2l(1M) 手册页。

/usr/lib/netsvc/yp/ypmap2src

用来将标准 NIS 映射转换为近似等效的 NIS 源文件的实用程序。ypmap2src 主要用于将 N2L 转换服务器转换为传统的 NIS。请参见 ypmap2src(1M) 手册页。

/var/yp/NISLDAPmapping

用来指定 NIS 映射项和 LDAP 中目录信息树 (Directory Information Tree, DIT) 等效项之间映射的配置文件。请参见 NISLDAPmapping(4) 手册页。

/var/yp/ypserv

用来为 NIS 到 LDAP 转换守护进程指定配置信息的文件。请参见 ypserv(4) 手册页。

ageing.byname

yppasswdd 使用的一种映射,在实现 NIS 到 LDAP 转换时,用于在 DIT 中读写口令生命期信息。

支持的标准映射

缺省情况下,N2L 服务支持以下列出的映射与 RFC 2307 或其后续版本中 LDAP 各项之间的映射。这些标准映射不需要手动修改映射文件。系统上任何未列在以下列表中的映射都被视为自定义映射,需要手动进行修改。

N2L 服务还支持对 auto.* 映射进行自动映射。但是,由于大多数 auto.* 文件名和内容都特定于各自的网络配置,因此该列表并未指定这些文件,但作为标准映射支持的 auto.homeauto.master 映射除外。


audit_user

auth_attr

auto.home

auto.master

bootparams

ethers.byaddr ethers.byname

exec_attr

group.bygid group.byname group.adjunct.byname

hosts.byaddr hosts.byname

ipnodes.byaddr ipnodes.byname

mail.byaddr mail.aliases

netgroup netgroup.byprojid netgroup.byuser netgroup.byhost

netid.byname

netmasks.byaddr

networks.byaddr networks.byname

passwd.byname passwd.byuid passwd.adjunct.byname

printers.conf.byname

prof_attr

project.byname project.byprojectid

protocols.byname protocols.bynumber

publickey.byname

rpc.bynumber

services.byname services.byservicename

timezone.byname

user_attr

在 NIS 到 LDAP 转换过程中,yppasswdd 守护进程使用 N2L 特定的映射 ageing.byname 在 DIT 中读写口令生命期信息。如果没有使用口令生命期,则会忽略 ageing.byname 映射。

从 NIS 转换为 LDAP(任务列表)

下表列出了使用标准的和自定义的 NIS 到 LDAP 转换映射来安装和管理 N2L 服务所需的过程。

任务 

说明 

参考 

完成所有先决条件。 

确保已经正确配置了 NIS 服务器和 Sun Java System Directory Server(LDAP 服务器)。  

NIS 到 LDAP 转换的先决条件

设置 N2L 服务。 

在 NIS 主服务器上运行 inityp2l 以设置以下映射之一:

  

  

标准映射 

如何使用标准映射设置 N2L 服务

  

自定义映射或非标准映射 

如何使用自定义映射或非标准映射设置 N2L 服务

自定义映射。 

查看如何为 N2L 转换创建自定义映射的示例。 

自定义映射的示例

使用 N2L 配置 Sun Java System Directory Server。 

将 Sun Java System Directory Server 配置并调整为用于 N2L 转换的 LDAP 服务器。 

使用 Sun Java System Directory Server 进行 NIS 到 LDAP 转换的最佳做法

排除系统故障。 

确定和解决常见的 N2L 问题。 

NIS 到 LDAP 转换疑难解答

恢复为 NIS。 

使用相应的映射恢复为 NIS: 

  

  

基于旧 NIS 源文件的映射 

如何基于旧的源文件恢复为 NIS 映射

  

基于当前 DIT 的映射 

如何基于当前的 DIT 内容恢复为 NIS 映射

NIS 到 LDAP 转换的先决条件

在实现 N2L 服务之前,必须检查或完成以下各项操作:

设置 NIS 到 LDAP 转换服务

可以按照以下两个过程中的说明,使用标准映射或自定义映射来设置 N2L 服务。

在 NIS 到 LDAP 转换过程中,需要运行 inityp2l 命令。必须为该命令运行的交互式脚本提供配置信息。以下列出了需要提供的信息类型。有关这些属性的说明,请参见 ypserv(1M) 手册页。


注意 –

大多数 LDAP 服务器(包括 Sun Java System Directory Server)都支持 sasl/cram-md5 验证。


如何使用标准映射设置 N2L 服务

如果要转换支持的标准映射中所列的映射,请使用此过程。如果要使用自定义映射或非标准映射,请参见如何使用自定义映射或非标准映射设置 N2L 服务

设置 LDAP 服务器之后,请运行 inityp2l 脚本并在出现提示时提供配置信息。inityp2l 可为标准映射和 auto.* 映射设置配置文件和映射文件。

  1. 完成NIS 到 LDAP 转换的先决条件中所列的先决步骤。

  2. 在 NIS 主服务器上,成为超级用户或承担等效角色。

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

  3. 将 NIS 主服务器转换为 N2L 服务器。


    # inityp2l
    

    在 NIS 主服务器上运行 inityp2l 脚本并遵照提示操作。有关需要提供的信息的列表,请参见设置 NIS 到 LDAP 转换服务

    有关更多详细信息,请参见 inityp2l(1M) 手册页。

  4. 确定 LDAP 目录信息树 (Directory Information Tree, DIT) 是否已完全初始化。

    如果 DIT 中已包含填充 NISLDAPmapping 文件中所列的全部映射所需的信息,则表明它已完全初始化。

    • 如果未包含,请继续执行步骤 5并跳过步骤 6。

    • 如果已包含,请跳过步骤 5 并转至步骤 6

  5. 初始化 DIT 以便从 NIS 源文件进行转换。

    仅当 DIT 尚未完全初始化时,才可执行这些步骤。

    1. 确保旧 NIS 映射是最新的版本。


      # cd /var/yp
      
      # make
      

      有关更多信息,请参见 ypmake(1M) 手册页。

    2. 停止 NIS 守护进程。


      # svcadm disable network/nis/server:default
      
    3. 将旧映射复制到 DIT 中,然后针对这些映射初始化 N2L 支持。


      # ypserv -Ir
      

      等待 ypserv 退出。


      提示 –

      最初的 NIS dbm 文件不会被覆写。可以根据需要恢复这些文件。


    4. 启动 NIS 守护进程,确保其使用新映射。


      # svcadm enable network/nis/server:default
      

      这会使用标准映射来完成 N2L 服务的设置。您无需完成步骤 6。

  6. 初始化 NIS 映射。

    仅当 DIT 已完全初始化并且跳过了步骤 5 时,才可执行这些步骤。

    1. 停止 NIS 守护进程。


      # svcadm disable network/nis/server:default
      
    2. 使用 DIT 中的信息初始化 NIS 映射。


      # ypserv -r
      

      等待 ypserv 退出。


      提示 –

      最初的 NIS dbm 文件不会被覆写。可以根据需要恢复这些文件。


    3. 启动 NIS 守护进程,确保其使用新映射。


      # svcadm enable network/nis/server:default
      
如何使用自定义映射或非标准映射设置 N2L 服务

如果符合以下情况,请使用此过程:

  1. 完成NIS 到 LDAP 转换的先决条件中所列的先决步骤。

  2. 在 NIS 主服务器上,成为超级用户或承担等效角色。

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

  3. 将 NIS 主服务器配置为 N2L 服务器。


    # inityp2l
    

    在 NIS 主服务器上运行 inityp2l 脚本并遵照提示操作。有关需要提供的信息的列表,请参见设置 NIS 到 LDAP 转换服务

    有关更多详细信息,请参见 inityp2l(1M) 手册页。

  4. 修改 /var/yp/NISLDAPmapping 文件。

    有关如何修改映射文件的示例,请参见自定义映射的示例

  5. 确定 LDAP 目录信息树 (Directory Information Tree, DIT) 是否已完全初始化。

    如果 DIT 中已包含填充 NISLDAPmapping 文件中所列的全部映射所需的信息,则表明它已完全初始化。

    • 如果未包含,请完成步骤 6、步骤 8 和步骤 9。

    • 如果已包含,请跳过步骤 6 并完成步骤 7、步骤 8 和步骤 9。

  6. 初始化 DIT 以便从 NIS 源文件进行转换。

    1. 确保旧 NIS 映射是最新的版本。


      # cd /var/yp
      
      # make
      

      有关更多信息,请参见 ypmake(1M) 手册页。

    2. 停止 NIS 守护进程。


      # svcadm disable network/nis/server:default
      
    3. 将旧映射复制到 DIT 中,然后针对这些映射初始化 N2L 支持。


      # ypserv -Ir
      

      等待 ypserv 退出。


      提示 –

      最初的 NIS dbm 文件不会被覆写。可以根据需要恢复这些文件。


    4. 启动 NIS 守护进程,确保其使用新映射。


      # svcadm enable network/nis/server:default
      
    5. 跳过步骤 7 并继续执行步骤 8

  7. 初始化 NIS 映射。

    仅当 DIT 已完全初始化时,才可以执行此步骤。

    1. 停止 NIS 守护进程。


      # svcadm disable network/nis/server:default
      
    2. 使用 DIT 中的信息初始化 NIS 映射。


      # ypserv -r
      

      等待 ypserv 退出。


      提示 –

      最初的 NIS dbm 文件不会被覆写。可以根据需要恢复这些文件。


    3. 启动 NIS 守护进程,确保其使用新映射。


      # svcadm enable network/nis/server:default
      
  8. 检验 LDAP 项是否正确。

    如果这些项不正确,则 LDAP 名称服务器客户机将无法找到各项。


    # ldapsearch -h server -s sub -b "ou=servdates, dc=..." \
    
    "objectclass=servDates"
    
  9. 检验 LDAP_ 映射的内容。

    以下样例输出说明如何使用 makedm 来检验 hosts.byaddr 映射的内容。


    # makedbm -u LDAP_servdate.bynumber
    
    plato: 1/3/2001
    
    johnson: 2/4/2003,1/3/2001
    
    yeats: 4/4/2002
    
    poe: 3/3/2002,3/4/2000

    如果内容与预期一致,则表明已成功地从 NIS 转换到 LDAP。

    请注意,最初的 NIS dbm 文件不会被覆写,因此始终可以恢复这些文件。有关更多信息,请参见恢复为 NIS

自定义映射的示例

以下两个示例说明如何自定义映射。请使用首选的文本编辑器,根据需要修改 /var/yp/NISLDAPmapping 文件。有关文件属性和语法的更多信息,请参见 NISLDAPmapping(4) 手册页以及第 9 章,LDAP 的基本组件和概念(概述)中的 LDAP 名称服务信息。

示例 1-移动主机项

本示例说明如何将主机项从缺省位置移到 DIT 中的另一个(非标准)位置。

请将 NISLDAPmapping 文件中的 nisLDAPobjectDN 属性更改为新的基本 LDAP 标识名 (distinguished name, DN)。在本示例中,LDAP 对象的内部结构未更改,因此 objectClass 项也不会更改。

将如下内容:


nisLDAPobjectDN hosts: \

                        ou=hosts,?one?, \

                        objectClass=device, \

                        objectClass=ipHost

更改为:


nisLDAPobjectDN hosts: \

                        ou=newHosts,?one?, \

                        objectClass=device, \

                        objectClass=ipHost

此更改会导致按如下方式映射这些项:

   dn: ou=newHosts, dom=domain1, dc=sun, dc=com

而不是按如下方式映射:

   dn:ou=hosts, dom=domain1, dc=sun, dc=com

示例 2-实现自定义映射

本示例说明如何实现自定义映射。

虚拟映射 servdate.bynumber 中包含有关为系统提供服务的日期的信息。此映射根据计算机的序列号(在本示例中为 123)建立索引。每一项都由计算机属主的姓名、一个冒号和一个用逗号分隔的服务日期列表组成,如 John Smith:1/3/2001,4/5/2003。

旧映射的结构将映射到以下形式的 LDAP 项上:


dn: number=123,ou=servdates,dc=... \

                 number: 123 \

                 userName: John Smith \

                 date: 1/3/2001 \

                 date: 4/5/2003 \

                  .

                  .

                  .

                 objectClass: servDates

通过检查 NISLDAPmapping 文件,可以看到与所需模式最接近的映射是 group。可以根据 group 映射建立自定义映射的模型。由于仅有一个映射,因此不需要 nisLDAPdatabaseIdMapping 属性。以下是要添加到 NISLDAPmapping 中的属性:


nisLDAPentryTtl servdate.bynumber:1800:5400:3600



nisLDAPnameFields servdate.bynumber: \

                        ("%s:%s", uname, dates)



nisLDAPobjectDN servdate.bynumber: \

                        ou=servdates, ?one? \

                        objectClass=servDates:



nisLDAPattributeFromField servdate.bynumber: \

                        dn=("number=%s,", rf_key), \

                        number=rf_key, \

                        userName=uname, \

                        (date)=(dates, ",")



nisLDAPfieldFromAttribute servdate.bynumber: \

                        rf_key=number, \

                        uname=userName, \

                        dates=("%s,", (date), ",")  

使用 Sun Java System Directory Server 进行 NIS 到 LDAP 转换的最佳做法

N2L 服务支持 Sun Microsystems, Inc. 提供的 Sun Java System Directory Server(以前称为 Sun ONE Directory Server)和兼容版本的目录服务器。其他(第三方)LDAP 服务器可能会使用 N2L 服务,但是 Sun 不支持这些服务器。如果使用的是 Sun Java System Directory Server 或兼容 Sun 服务器以外的 LDAP 服务器,则必须手动配置服务器,使其支持 RFC 2307 或其后续版本中的方案。

如果使用的是 Sun Java System Directory Server,则可以增强目录服务器以提高性能。必须对 Sun Java System Directory Server 具有 LDAP 管理员权限才能增强目录服务器。另外,还可能需要重新引导目录服务器,此任务必须与服务器的 LDAP 客户机协调进行。docs.sun.com Web 站点上提供了 Sun Java System Directory Server(以及 Sun ONE 和 iPlanet Directory Server)文档。

使用 Sun Java System Directory Server 创建虚拟列表视图索引

对于大型映射,必须使用 LDAP 虚拟列表视图 (virtual list view, VLV) 索引来确保 LDAP 搜索可返回全部结果。有关在 Sun Java System Directory Server 上设置 VLV 索引的信息,请参见位于 docs.sun.com Web 站点上的 Sun Java System Directory Server 文档。

VLV 搜索结果使用固定的页面大小 50000。如果在 Sun Java System Directory Server 上使用 VLV,则 LDAP 服务器和 N2L 服务器都必须可以传送此大小的页面。如果已知所有的映射都小于此限制,则不必使用 VLV 索引。但是,如果使用的映射大于此大小限制,或者不能确定所有映射的大小,请使用 VLV 索引来避免返回不完整的结果。

如果使用 VLV 索引,请按如下方式设置适当的大小限制。

创建 VLV 索引之后,请立即将其激活,方法是在 Sun Java System Directory Server 上运行带有 vlvindex 选项的 directoryserver。有关更多信息,请参见 directoryserver(1M) 手册页。

标准映射的 VLV

如果符合以下条件,请使用 Sun Java System Directory Server idsconfig 命令设置 VLV:

VLV 特定于域,因此每次运行 idsconfig 时,都会为一个 NIS 域创建相应的 VLV。所以,在 NIS 到 LDAP 的转换过程中,必须针对 NISLDAPmapping 文件中包含的每个 nisLDAPdomainContext 属性都运行一次 idsconfig

自定义映射和非标准映射的 VLV

如果符合以下条件,则必须为映射手动创建新的 Sun Java System Directory Server VLV,或者复制并修改现有的 VLV 索引:

要查看现有的 VLV 索引,请键入以下内容:


# ldapsearch -h hostname -s sub -b "cn=ldbm database,cn=plugins,cn=config" \

"objectClass=vlvSearch"

避免 Sun Java System Directory Server 服务器超时

N2L 服务器在刷新映射时,可能会对 LDAP 目录进行大量访问。如果 Sun Java System Directory Server 的配置不正确,则刷新操作可能会因超时而无法完成。要避免目录服务器超时,请手动或者通过运行 idsconfig 命令来修改以下 Sun Java System Directory Server 属性。

例如,要增加服务器执行搜索请求所需的最短时间(以秒为单位),请修改以下属性:


dn: cn=config

nsslapd-timelimit: -1

为了进行测试,可以使用属性值 -1,这表示没有限制。确定最佳限制值之后,请更改属性值。请勿在生产服务器上保留值为 -1 的任何属性设置。如果没有限制,则服务器可能会容易受到拒绝服务攻击。

有关使用 LDAP 配置 Sun Java System Directory Server 的更多信息,请参见本书的System Administration Guide: Naming and Directory Services (DNS, NIS, and LDAP)中的“使用 LDAP 客户机设置 Sun Java System Directory Server(任务)”

避免 Sun Java System Directory Server 缓冲区溢出

要避免缓冲区溢出,请手动或者通过运行 idsconfig 命令来修改 Sun Java System Directory Server 属性。

  1. 例如,要增加针对客户机搜索查询返回的最大项数,请修改以下属性:


    dn: cn=config
    
    nsslapd-sizelimit: -1
  2. 要增加针对客户机搜索查询检验的最大项数,请修改以下属性:


    dn: cn=config, cn=ldbm database, cn=plugins, cn=config
    
    nsslapd-lookthroughlimit: -1

为了进行测试,可以使用属性值 -1,这表示没有限制。确定最佳限制值之后,请更改属性值。请勿在生产服务器上保留值为 -1 的任何属性设置。如果没有限制,则服务器可能会容易受到拒绝服务攻击。

如果使用 VLV,则应当按照使用 Sun Java System Directory Server 创建虚拟列表视图索引中的定义设置 sizelimit 属性值。如果未使用 VLV,则应当将大小限制设置得足够大,以便可以容纳最大容器。

有关使用 LDAP 配置 Sun Java System Directory Server 的更多信息,请参见第 11 章,为使用 LDAP 客户机设置 Sun Java System Directory Server(任务)

NIS 到 LDAP 转换限制

设置 N2L 服务器之后,就不再使用 NIS 源文件。因此,请勿在 N2L 服务器上运行 ypmake。如果意外运行了 ypmake(如针对现有的 cron 作业运行了该命令),N2L 服务也不会受到影响。但是,会记录一个警告,提示应当明确调用 yppush

NIS 到 LDAP 转换疑难解答

本节包括两个方面的疑难解答:

常见的 LDAP 错误消息

有时,N2L 服务器会记录与内部 LDAP 问题相关的错误,并生成与 LDAP 相关的错误消息。尽管这些错误不是致命的,但是它们指明有问题需要检查。例如,N2L 服务器可能会继续工作,但是会提供过时或不完整的结果。

以下列出了在实现 N2L 服务时可能遇到的一些常见的 LDAP 错误消息,以及错误说明、可能的原因和针对这些错误的解决方案。

超过管理限制

DN 语法无效

对象类违规

无法联系 LDAP 服务器

超时

NIS 到 LDAP 转换问题

运行 N2L 服务器时可能会出现以下问题。此处提供了可能的原因和解决方案。

调试 NISLDAPmapping 文件

映射文件 NISLDAPmapping 非常复杂。许多可能的错误都会导致映射出现意外的行为方式。请使用以下方法来解决这类问题。

运行 ypserv -ir(或 -Ir)时显示控制台消息

NIS 守护进程在启动时退出

NIS 操作产生意外的结果

NIS 映射的处理顺序


注意 –

如果这种映射方式会导致不能从至少一个映射创建某个对象的所有 MUST 属性,则支持以这种方式进行映射。


N2L 服务器超时问题

N2L 锁定文件问题

N2L 死锁问题

恢复为 NIS

已使用 N2L 服务从 NIS 转换到 LDAP 的站点将会逐步使用 Solaris LDAP 名称服务客户机替换所有的 NIS 客户机。对 NIS 客户机的支持最终会成为多余。但是,N2L 服务提供了两种在必要时返回传统 NIS 的方法,如以下两个过程中所述。


提示 –

传统的 NIS 会忽略 N2L 版本的 NIS 映射(如果存在这些映射)。恢复为 NIS 之后,如果在服务器上保留 N2L 版本的映射,则 N2L 映射不会产生问题。因此,如果以后决定重新启用 N2L,则保留 N2L 映射可能会非常有用。但是,这些映射确实会占用磁盘空间。


如何基于旧的源文件恢复为 NIS 映射
  1. 成为超级用户或承担等效角色。

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

  2. 停止 NIS 守护进程。


    # svcadm disable network/nis/server:default
    
  3. 禁用 N2L。

    此命令可备份并移动 N2L 映射文件。


    # mv /var/yp/NISLDAPmapping backup_filename
    
  4. 设置 NOPUSH 环境变量,以便 ypmake 不会推送新映射。


    # NOPUSH=1
    
  5. 创建一组基于旧源的新 NIS 映射。


    # cd /var/yp
    
    # make
    
  6. 可选)删除 N2L 版本的 NIS 映射。


    # rm /var/yp/domainname/LDAP_*
    
  7. 启动 NIS 守护进程。


    # svcadm enable network/nis/server:default
    
如何基于当前的 DIT 内容恢复为 NIS 映射

执行此过程之前请先备份旧的 NIS 源文件。

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见System Administration Guide: Security Services中的“使用基于角色的访问控制(任务)”

  2. 停止 NIS 守护进程。


    # svcadm disable network/nis/server:default
    
  3. 从 DIT 更新映射。


    # ypserv -r
    

    等待 ypserv 退出。

  4. 禁用 N2L。

    此命令可备份并移动 N2L 映射文件。


    # mv /var/yp/NISLDAPmapping backup_filename
    
  5. 重新生成 NIS 源文件。


    # ypmap2src
    
  6. 手动检查重新生成的 NIS 源文件是否具有正确的内容和结构。

  7. 将重新生成的 NIS 源文件移到相应的目录中。

  8. 可选)删除 N2L 版本的映射文件。


    # rm /var/yp/domainname/LDAP_*
    
  9. 启动 NIS 守护进程。


    # svcadm enable network/nis/server:default
    

第 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