Part V LDAP Naming Service Setup and Administration
This part provides an overview of the LDAP naming service.
Additionally, it covers the setup, configuration, administration and troubleshooting
of LDAP naming service in the Solaris operating environment, with a focus on the use of iPlanet
Directory Server 5.1.
Chapter 12 Introduction to the LDAP Naming Service (Overview/Reference)
The LDAP chapters describe how to set up a Solaris naming
client to work with the iPlanet Directory Server 5.1. A brief discussion of
generic directory server requirements is in Chapter 18, General Reference (Reference).
Note –
Though a directory server is not necessarily an LDAP server, in
the context of these chapters, the term, “directory server”, is
considered synonymous with “LDAP server”.
Audience Assumptions
The LDAP Naming Service chapters are written for system administrators
who already have a working knowledge of LDAP. The following is a partial list
of concepts with which you must be very familiar prior to deploying a Solaris-based
LDAP naming service using this guide.
-
LDAP Information Model (entries, object classes, attributes,
type, values)
-
LDAP Naming Model (Directory Information Tree (DIT) structure)
-
LDAP Functional Model (search parameters: base object (DN),
scope, size limit, time limit, filters (Browsing Indexes for the iPlanet Directory
Server), attribute list)
-
LDAP Security Model (authentication methods, access control
models)
-
Overall planning and design of an LDAP directory service,
including how to plan the data, design the DIT, design the topology, design
the replication, and how to design the security.
Suggested Background Reading
If you need to learn more about any of the aforementioned concepts or
would like to study LDAP and the deployment of directory services in general,
the following are useful titles.
-
Understanding and Deploying LDAP Directory Services by Timothy A. Howes, Ph.D and Mark C. Smith
In addition to providing a thorough treatment of LDAP directory services,
this book includes useful case studies on deploying LDAP at a large university,
a large multinational enterprise, and an enterprise with an extranet.
-
iPlanet Directory Server 5.1 Deployment Guide,
which is included in the documentation CD.
This guide provides a foundation for planning your directory, including
directory design, including schema design, the directory tree, topology, replication,
and security. The last chapter provides sample deployment scenarios to help
you plan simple deployments as well as complex deployments designed to support
millions of users distributed worldwide.
-
iPlanet Directory Server 5.1 Administrator's Guide, which is included in the documentation CD.
Additional Prerequisites
If you are transitioning from using NIS+ to using LDAP, refer to the
Appendix entitled, “Transitioning from NIS+ to LDAP” in System Administration Guide:
Naming and Directory Services (FNS and NIS+) and complete
the transition before proceeding with these chapters.
If you need to Install the iPlanet Directory Server 5.1, refer to the iPlanet Directory Server 5.1 Installation Guide.
LDAP Naming Service Versus Other Naming Services
Below is a quick comparison between FNS, DNS, NIS, NIS+ and LDAP naming
services.
|
|
DNS
|
NIS
|
NIS+
|
FNS
|
LDAP
|
|
NAMESPACE
|
Hierarchical
|
Flat
|
Hierarchical
|
Hierarchical
|
Hierarchical
|
|
DATA STORAGE
|
Files/
resource records
|
2 column maps
|
Multi columned tables
|
Maps
|
Directories [varied]
Indexed database
|
|
SERVERS
|
Master/slave
|
Master
/slave
|
Root master/
non-root master; primary/
secondary; cache/stub
|
N/A
|
Master/replica
Multi
master replica
|
|
SECURITY
|
none
|
None (root or nothing)
|
DES
Authentication
|
None (root or nothing)
|
SSL, varied
|
|
TRANSPORT
|
TCP/IP
|
RPC
|
RPC
|
RPC
|
TCP/IP
|
|
SCALE
|
Global
|
LAN
|
LAN
|
Global (with DNS)/LAN
|
Global
|
Using Fully Qualified Domain Names
One significant difference between an LDAP client and a NIS or NIS+
client is that an LDAP client always returns a Fully Qualified Domain Name (FQDN) for a host name, similar to
those returned by DNS. For example, if your domain name is
both gethostbyname() and getipnodebyname() return the FQDN version when looking up the hostname server.
Also if you use interface specific aliases like server-#,
a long list of fully qualified host names is returned. If you are using host
names to share file systems or have other such checks you need to account
for it. This is especially true if you assume non-FQDN for local hosts and
FQDN only for remote DNS resolved hosts. If you setup LDAP with a different
domain name from DNS you might be surprised when the same host has two different
FQDNs, depending on the lookup source.
Advantages of LDAP Naming Service
-
LDAP gives you the ability to consolidate information by replacing
application-specific databases; reduces the number of distinct databases to
be managed
-
LDAP allows for more frequent data synchronization between
masters and replicas
-
LDAP is multi-platform and multi-vendor compatible
Restrictions of LDAP Naming Service
The following are some restrictions associated with the LDAP Naming
Service.
-
There is no support for pre-Solaris 8 clients
-
An LDAP server cannot be its own client
-
Setting up and managing an LDAP naming service is more complex
and requires careful planning
Note –
A directory server (an LDAP server) cannot
be its own client. In other words, you cannot configure the machine that is
running the directory server software to become an LDAP naming service client.
New LDAP Naming Service Features for Solaris 9
-
Simplified configuration of LDAP directory server setup using idsconfig
-
A more robust security model, which supports strong authentication,
TLS encrypted sessions. A client's proxy credentials are NO LONGER stored in a client's profile on the directory server
-
The ldapaddent command allows you to populate
and dump data onto the server
-
Service Search Descriptors and Attribute Mapping
-
New profile schema
Transitioning from NIS+ to LDAP
Note –
NIS+ might not be supported in a future release. Tools to aid
the migration from NIS+ to LDAP are available in the Solaris 9 operating environment.
For more information, visit http://www.sun.com/directory/nisplus/transition.html.
For information on transitioning from NIS+ to LDAP, see Chapter 19, Transitioning From NIS+ to LDAP.
LDAP Naming Service Setup (Task Map)
Table 12–1
Chapter 13 Basic Components and Concepts (Overview)
This chapter covers the following topics.
LDAP Data Interchange Format (LDIF)
LDIF is a text-based format for describing directory service information.
Using LDIF you can move information from one directory to another. The following
are examples of LDIF format for each service. Use ldaplist
with the —l option to display the following information.
% 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 —l netgroup 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
|
Default Directory Information Tree (DIT)
By default, Solaris LDAP clients access the information assuming that the DIT has a
given structure. For each domain supported by the LDAP server, there is an
assumed subtree with an assumed structure. This default structure, however,
can be overridden by specifying Service Search Descriptors (SSDs). For a given
domain, the default DIT will have a base container that holds a number of
subtrees containing entries for a specific information type. See the following
table for the names of these subtrees.
Table 13–1 DIT Default Locations
|
Default Container
|
Information Type
|
|
ou=Ethers
|
bootparams(4), ethers(4)
|
|
ou=Group
|
group(4)
|
|
ou=Hosts
|
hosts(4), ipnodes(4), publickey for hosts
|
|
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 for users
|
|
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_*
|
Default Schema
Schemas are definitions describing what types of information can be
stored as entries in an LDAP directory. To support LDAP naming clients, the
directory server's schema might need to be extended. Detailed information
about IETF and Solaris specific schemas is included in Chapter 18, General Reference (Reference).
The various RFCs can also be accessed on the IETF Web site http://www.ietf.org.
Service Search Descriptors (SSDs) and Schema Mapping
Note –
If you use schema mapping, you must do so in a very careful and
consistent manner.
As previously discussed, LDAP naming services expect, by default, the
DIT to be structured in a certain way. If you want, you can instruct the Solaris
LDAP naming service to search in other locations than the default locations
in the DIT. Additionally, you can specify that different attributes and object
classes be used in place of those specified by the default schema. For a list
of default filters, see Default Filters Used by LDAP Naming Services.
SSDs
The serviceSearchDescriptor attribute defines how and where
an LDAP naming service client should search for information for a particular
service. The serviceSearchDescriptor contains a service
name, followed by one or more semicolon-separated base-scope-filter triples.
These base-scope-filter triples are used to define searches only for the
specific service and are searched in order. If multiple base-scope-filters
are specified for a given service, then when that service looks for a particular
entry, it will search in each base with the specified scope and filter.
Note –
The default location is not searched for a service (database)
with an SSD unless it is included in the SSD. Unpredictable behavior will
result if multiple SSDs are given to a service.
In the following example, the Solaris LDAP naming service client performs
a one-level search in ou=west,dc=example,dc=com followed
by a one-level search in ou=east,dc=example,dc=com for
the passwd service. To look up the passwd
data for a user's username, the default LDAP filter (&(objectClass=posixAccount)(uid=username)) is used for each BaseDN.
serviceSearchDescriptor: passwd:ou=west,dc=example,dc=com;ou=east,
dc=example,dc=com
|
In the following example, the Solaris LDAP naming service client would
perform a subtree search in ou=west,dc=example,dc=com
for the passwd service. To look up the passwd data for user username, the subtree ou=west,dc=example,dc=com would be searched with the LDAP filter (&(fulltimeEmployee=TRUE)(uid=username)).
serviceSearchDescriptor: passwd:ou=west,dc=example,
dc=com?sub?fulltimeEmployee=TRUE
|
It is also possible to associate multiple containers with a particular
service type.
For example, the following service search descriptor specifies that
the three containers, ou=myuser,dc=example,dc=com, ou=newuser,dc=example,dc=com, and ou=extuser,dc=example,dc=com are searched for the password entries. Note that a trailing ','
implies that the defaultSearchBase is appended to the
relative base in the SSD.
defaultSearchBase: dc=example,dc=com
serviceSearchDescriptor: \
passwd:ou=myuser;ou=newuser,ou=extuser,dc=example,dc=com
|
Attribute Map
The Solaris LDAP
naming service allows one or more attribute names to be remapped for any of
its services. (The Solaris LDAP client uses the well-known attributes documented
in Chapter 18, General Reference (Reference).) If you map an attribute, you must be sure
that the attribute has the same meaning and syntax as the original attribute.
Note that mapping the userPassword attribute might cause
problems.
There are a couple of reasons you might want to use schema mappings.
-
You want to map attributes in an existing directory server
-
If you have user names that differ only in case, you must
map the uid attribute, which ignores case, to an attribute
that does not ignore case
The format is service:attribute-name=mapped-attribute-name.
If you want to map more than one attribute for a given service, you
can define multiple attributeMap attributes.
In the following example, the employeeName and home attributes would be used whenever the uid
andhomeDirectory attributes would be used for the passwd service.
attributeMap: passwd:uid=employeeName
attributeMap: passwd:homeDirectory=home
|
There exists one special case where you can map the passwd service's gecos attribute to several attributes.
The following is an example.
attributemap: gecos=cn sn title
|
This maps the gecos values to a space-separated list
of the cn, sn, and title
attribute values.
objectClass Map
The Solaris LDAP
naming service allows object classes to be remapped for any of its services.
If you want to map more than one object class for a given service, you can
define multiple objectclassMap attributes. In the following
example, the myUnixAccount object class is used whenever
the posixAccount object class is used.
objectclassMap: passwd:posixAccount=myUnixAccount
|
Client Profiles
To simplify Solaris client setup, and avoid having to reenter the same
information for each and every client, create a single client profile on the
directory server. This way, a single profile defines the configuration for
all clients configured to use it. Any subsequent change to the profile attributes
is propagated to the clients at a rate defined by the refresh interval.
These client profiles should be stored in a well-known location on the
LDAP server. The root DN for the given domain must have an object class of nisDomainObject and a nisDomain attribute containing
the client's domain. All profiles are located in the ou=profile container relative to this container. These profiles should be
readable anonymously.
Client Profile Attributes
The following lists the Solaris LDAP client's profile attributes, which
can be set automatically when you run idsconfig. See Initializing a Client Manually for information on how to set a client profile manually.
Table 13–2 Client Profile Attributes
|
Attribute
|
Description
|
|
cn
|
The profile name. No default value, must
be specified.
|
|
preferredServerList
|
The host addresses of the preferred servers
is a space separated list of server addresses. (Do not use host names.) The
servers in this list are tried in order BEFORE those in the defaultServerList until a successful connection is made. This has no default value.
At least one server must be specified in either preferredServerList or defaultServerList.
|
|
defaultServerList
|
The host addresses of the default servers
is a space separated list of server addresses. (Do not use host names.) After
the servers in the preferredServerlist are tried, those
default servers on the client's subnet are tried, followed by the remaining
default servers, until a connection is made. At least one server must be specified
in either the preferredServerList or defaultServerList. The servers in this list are tried only after those on the preferred
server list. This attribute has no default value.
|
|
defaultSearchBase
|
The DN relative to which to locate the
well-known containers. There is no default for this value. However, this can
be overridden for a given service by the serviceSearchDescriptor attribute.
|
|
defaultSearchScope
|
Defines the scope of a database search
by a client. It can be overridden by the serviceSearchDescriptor attribute. The possible values are one or sub. The default value
is a one level search.
|
|
authenticationMethod
|
Identifies the method of authentication
used by the client. The default is none (anonymous). See Choosing Authentication Methods
for more information.
|
|
credentialLevel
|
Identifies the type of credentials a client
should use to authenticate. The choices are anonymous or proxy. The default is anonymous.
|
|
serviceSearchDescriptor
|
Defines how and where a client should search
for a naming database, for example, if the client should look in one or more
points in the DIT. By default no SSDs are defined.
|
|
serviceAuthenticationMethod
|
Authentication
method used by a client for the specified service. By default, no service
Authentication Methods are defined. If a service does not have serviceAuthenticationMethod defined, it will default to the value of authenticationMethod.
|
|
attributeMap
|
Attribute mappings used by client. By default
no attributeMap is defined.
|
|
objectclassMap
|
Object class mappings used by client. By
default no objectclassMap is defined.
|
|
searchTimeLimit
|
Maximum time [in seconds] a client should
allow for a search to complete before timing out. This does not affect the
time the LDAP server will allow for a search to complete. Default value is
30 seconds.
|
|
bindTimeLimit
|
Maximum time in seconds a client should
allow to bind with a server before timing out. Default value is 30 seconds.
|
|
followReferrals
|
Specifies whether a client should follow
an LDAP referral. Possible values TRUE or FALSE. The default value is TRUE.
|
|
profileTTL
|
Time between refreshes of the client profile
from the LDAP server by the ldap_cachemgr(1M). Default is 43200 seconds or 12 hours.
If given a value of 0, the profile will never be refreshed.
|
Local Client Attributes
The following table lists the client attributes that can be set locally
using .ldapclient(1M).
Table 13–3 Local Client Attributes
|
Attribute
|
Description
|
|
domainName
|
Specifies the client's domain name (which becomes the default domain for the
client machine). This has no default value and must be specified.
|
|
proxyDN
|
The proxy's distinguished name. If the client machine is configured with credentialLevel of proxy, the proxyDN must be specified.
|
|
proxyPassword
|
The proxy's password. If the client machine is configured with credentialLevel of proxy, the proxyPassword must
be defined.
|
|
certificatePath
|
The directory on the local file system containing the certificate databases.
If a client machine is configured with authenticationMethod
or serviceAuthenticationMethod using TLS, then this attribute
is used. The default value is /var/ldap.
|
Note –
If the BaseDN in an SSD contains
a trailing comma, it is treated as a relative value of the defaultSearchBase. The values of the defaultSearchBase are appended to the BaseDN before a search is
performed.
ldap_cachemgr Daemon
ldap_cachemgr(1M) is a daemon that runs on LDAP client machines. It performs the following
key functions.
-
It gains access to the configuration files, running as
root
-
It refreshes the client configuration information stored in
the profiles on the server and pulls this data from the clients
-
It maintains a sorted list of active LDAP servers to use
-
It improves lookup efficiency by caching some common lookup
requests submitted by various clients
-
It improves the efficiency of host lookups
Note –
The ldap_cachemgr must be running at all times
for LDAP naming services to work.
Refer to ldap_cachemgr(1M) for detailed information.
LDAP Naming Service Security Model
Introduction
The Solaris LDAP naming service uses the LDAP repository as a source
of both a naming service and as an authentication service. This section discusses
the concepts of client identity, authentication methods, pam_ldap and pam_unix modules, and password management.
To access the information stored in the LDAP repository, clients can
first establish identity with the directory server. This identity can be either
anonymous or as an object recognized by the LDAP server. Based on the client's
identity and the server's Access Control Information (ACI), the LDAP server
will allow the client to read or write directory information. For more information
on ACIs, consult the iPlanet Directory Server 5.1 Administrator's Guide.
If the client is connecting as anything other than anonymous for any
given request, the client must prove its identity to the server using an authentication
method supported by both the client and server. Once the client has established
its identity, it can then make the various LDAP requests.
Keep in mind that there is a distinction between how the naming service
and the authentication service (pam_ldap) authenticate
to the directory. The naming service will read various entries and their attributes
from the directory based on predefined identity. The authentication service
(pam_ldap) establishes whether the user has entered the
correct password by using that user's name and password to authenticate to
the LDAP server.
Transport Layer Security (TLS)
TLS can be used to secure communication between an LDAP client and the directory
server, providing both privacy and data integrity. The TLS protocol is a super
set of the Secure Sockets Layer (SSL) protocol. The Solaris LDAP naming service
supports TLS connections. Be aware that using SSL will add load to the directory
server and the client.
You will need to set up your directory server for SSL. See the iPlanet Directory Server 5.1 Administrator's Guide for more information
on setting up the iPlanet Directory Server 5.1 for SSL. You will also need
to set up your LDAP client for SSL.
Note –
In order to use TLS for the Solaris LDAP naming service, the
directory server must use the default ports, 389 and 636, for LDAP and SSL,
respectively. If your directory server does not use these ports, you cannot
use TLS at this time.
See TLS Security Setup for more information.
Assigning Client Credential Levels
LDAP naming service clients authenticate to the LDAP server
according to a credential level. LDAP clients can be assigned three possible
credential levels with which to authenticate to a directory server.
-
anonymous
-
proxy
-
proxy anonymous
Anonymous
If you use anonymous access, you only have access
to data that is available to everyone. Also, you should consider the security
implications. Allowing anonymous access for certain parts
of the directory implies that anyone with access to the directory will be
able to perform those operations. If you are using an anonymous
credential level, you will need to allow read access to all the LDAP naming
entries and attributes.

Caution –
Allowing anonymous write to a directory
should never be done, as anyone could change information in the DIT to which
they have write access, including another user's password, or their own identity.
Note –
iPlanet Directory Server 5.1 allows you to restrict access based
on IP addresses, DNS name, authentication method, and time-of-day. You might
want to limit access with further restrictions. See “Managing Access
Control” in the iPlanet Directory Server 5.1 Administrator's
Guide for more information.
Proxy
The client authenticates
or binds to the directory using a proxy account. This proxy account can be
any entry that is allowed to bind to the directory. This proxy account needs
sufficient access to perform the naming service functions on the LDAP server.
You will need to configure the proxyDN and proxyPassword on every client using the proxy credential level.
The encrypted proxyPassword will be stored locally on the
client. You can set up different proxies for different groups of clients.
For example, you can configure a proxy for all the sales clients to access
both the company-wide-accessible and sales directories, while preventing sales
clients from accessing human resource directories with payroll information.
Or, in the most extreme cases, you can either assign different proxies to
each client or assign just one proxy to all clients. A typical LDAP deployment
would probably lie between the two extremes. Consider the choices carefully.
Too few proxy agents might limit your ability to control user access to resources.
However, having too many proxies complicates the setup and maintenance of
the system. You need to grant the appropriate rights to the proxy user. This
will vary depending on your environment. See Credential Storage
for information on how to determine which authentication method makes the
most sense for your configuration.
If the password changes for a proxy user, you need to update it on every
client that uses that proxy user. If you use password aging on LDAP accounts,
be sure to turn it off for proxy users.
Note –
Be aware that the proxy credential level applies to all users
and processes on any given machine. If two users need to use different naming
policies, they must use different machines.
In addition, if clients are using a proxy credential
to authenticate, the proxyDN must have the same proxyPassword on all of the servers.
proxy anonymous
proxy anonymous is a multi-valued entry, in that
more than one credential level is defined. A client assigned the proxy anonymous level will first attempt to authenticate with its
proxy identity. If the client is unable to authenticate as the proxy user
for whatever reason (user lockout, password expired, for example), then the
client will use anonymous access. This might lead to a different level of
service, depending on how the directory is configured.
Credential Storage
If you configure a client to use a proxy identity, the
client saves its proxyDN and proxyPassword
in /var/ldap/ldap_client_cred. For the sake of increased
security, this file is restricted to root access only, and the value of proxyPassword is encrypted. While past LDAP implementations have
stored proxy credentials in a client's profile, the Solaris 9 LDAP Naming
Services do not. Any proxy credentials set using ldapclient
during initialization are stored locally. This results in improved security
surrounding a proxy's DN and password information. See Chapter 16, Client Setup (Task)
for more information on setting up client profiles.
Choosing Authentication Methods
When you assign the proxy or proxy-anonymous credential level to a client, you also need to select a method
by which the proxy authenticates to the directory server. By default, the
authentication method is none, which implies anonymous
access. The authentication method may also have a transport security option
associated with it.
The authentication method, like the credential level, may be
multi-valued. For example, in the client profile you could specify that the
client first tries to bind using the simple method secured
by TLS. If unsuccessful, the client would try to bind with the sasl/digest-MD5 method. The authenticationMethod would then
be tls:simple;sasl/digest-MD5.
The LDAP naming service supports some Simple Authentication and Security
Layer (SASL) mechanisms. These mechanisms allow for a secure password exchange
without requiring TLS. However, these mechanisms do not provide data integrity
or privacy. See RFC 2222 for information on SASL.
The following authentication mechanisms are supported.
-
none
The client does not authenticate to the directory. This is equivalent
to the anonymous credential level.
-
simple
If the client machine uses the simple authentication
method, it binds to the server by sending the user's password in the clear.
The password is thus subject to snooping. The primary advantages of using
the simple authentication method are that all directory
servers support it and that it is easy to set up.
-
sasl/digest-MD5
The client's password is protected during authentication, but the session
is not encrypted. Some directory servers, including iPlanet Directory Server
5.1, also support the sasl/digest-MD5 authentication method.
The primary advantage of digest-MD5 is that the password
does not go over the wire in the clear during authentication and therefore
is more secure than the simple authentication method. See
RFC 2831 for information on digest-MD5. digest-MD5 is considered an improvement over cram-MD5 for
its improved security.
When using sasl/digest-MD5, the authentication is
secure, but the session is not protected.
-
sasl/cram-MD5
In this case, the LDAP session is not encrypted, but the client's password
is protected during authentication, as authentication is performed using sasl/cram-MD5.
See RFC 2195 for information on the cram-MD5 authentication
method, which is supported by some, but not all directory servers. For instance,
iPlanet Directory Server 5.1 does not support cram-MD5.
-
tls:simple
The client binds using the simple method and the
session is encrypted. The password is protected.
-
tls: sasl/cram-MD5
The LDAP session is encrypted and the client authenticates to the directory
server using sasl/cram-MD5.
-
tls:sasl/digest-MD5
The LDAP session is encrypted and the client authenticates to the directory
server using sasl/digest-MD5.

Caution –
iPlanet Directory Server 5.1 requires passwords to be stored
in the clear in order to use digest-MD5. If the authentication
method is set to sasl/digest-MD5 or tls:sasl/digest-MD5, then the passwords for the proxy user will need to be stored in
the clear. Be careful that the userPassword attribute has
the proper ACIs if it is stored in the clear, so that it is not readable.
Authentication and Services
The authentication method can be specified for a given service in the serviceAuthenticationMethod attribute. The following services currently
support this.
-
passwd-cmd
This service is used bypasswd(1) to change the login password and password
attributes.
-
keyserv
This service is used by thechkey(1) and newkey(1M) utilities to create and change a user's
Diffie-Hellman key pair.
-
pam_ldap
This service is used for authenticating users with pam_ldap.
Note –
If the service does not have a serviceAuthenticationMethod set, it will default to the value of the authenticationMethod attribute.
The following example shows a section of a client profile in which
the users will use sasl/digest-MD5 to authenticate to the
directory server, but will use an SSL session to change their password.
serviceAuthenticationMethod=pam_ldap:sasl/digest-MD5
serviceAuthenticationMethod=passwd-cmd:tls:simple
|
Pluggable Authentication Methods
By using the PAM framework, you can choose among several authentication services.
You can use either pam_unix or pam_ldap
in conjunction with LDAP.
Because of its increased flexibility and support of stronger authentication
methods, the use of pam_ldap is recommended.
pam_unix
If you have not changed the pam.conf(4) file, pam_unix is
enabled by default. pam_unix follows the traditional model
of UNIX authentication, which means that
-
The client retrieves the user's encrypted password from the
name service.
-
The user is prompted for his password.
-
The user's password is encrypted.
-
The client compares the two encrypted passwords to determine
if the user should be authenticated or not.
Additionally, there are two restrictions when using
pam_unix.
-
The password must be stored in UNIX crypt
format and not in any other encryption methods, including clear.
-
The userPassword attribute must be readable
by the name service.
For example, if you set the credential level to anonymous,
then anyone must be able to read the userPassword attribute.
Similarly, If you set the credential level to proxy, then
the proxy user must be able to read the userPassword attribute.
Note –
pam_unix is not compatible with sasl authentication method digest-MD5, since the
iPlanet Directory Server 5.1 requires passwords to be stored in the clear
in order to use digest-MD5, but pam_unix requires
the password be stored in crypt format.
pam_ldap
When using pam_ldap, the user binds to the LDAP server.
The authentication method is defined in pam_ldap's serviceAuthenticationMethod parameter if one exists. Otherwise,
the authenticationMethod is used by default.
If pam_ldap is able to bind to the server with the
user's identity and supplied password, it authenticates the user.
pam_ldap does not read the userPassword attribute. Therefore, there is no need to grant access to read
the userPassword attribute unless there are other clients
using pam_unix. pam_ldap does not support
the none authentication method. Thus, you must define the serviceAuthenticationMethod or the authenticationMethod
attributes in order for clients to use pam_ldap.

Caution –
If the simple authentication method is used,
the userPassword attribute can be read on the wire by third
parties.
See Example pam.conf File for pam_ldap.
PAM and Changing Passwords
Use passwd(1)
to change a password. In order to change the password, the userPassword attribute must be writeable by the user. Remember that the serviceAuthenticationMethod for passwd-cmd will
override the authenticationMethod for this operation. Depending
on the authentication used, the current password might be un-encrypted on
the wire.
In the case of pam_unix the new userPassword attribute is encrypted using UNIX crypt and
tagged before being written to LDAP. Therefore, the new password is encrypted
on the wire, regardless of the authentication method used to bind to the server.
For pam_ldap, when a password is changed, the new
password is un-encrypted. Therefore, to insure privacy, you need to use TLS.
If TLS is not used, the new userPassword will be subject
to snooping.
When setting the password with pam_ldap with iPlanet
Directory Server 5.1, the password is encrypted using the serverStrorageScheme (as it is untagged). See “User Account Management”
in the iPlanet Directory Server 5.1 Administrator's Guide
for additional information about the passwordStorageScheme
attribute.
Note –
You need to consider the following when setting the passwordStorageScheme attribute. If a NIS, NIS+, or another client
using pam_unix is using LDAP as a repository, then passwordStorageScheme needs to be crypt. Also,
if using pam_ldap with sasl/digest-MD5
with iPlanet Directory Server 5.1, passwrodStorageScheme
must be set to clear.
Password Management
Solaris LDAP naming services do not currently support the password
management features in iPlanet Directory Server 5.1.
Chapter 14 Planning for the LDAP Naming Service (Tasks)
This chapter discusses the high-level planning you should
do before beginning the server and client setup and installation process.
This chapter covers the following topics.
Overview
The LDAP client profile is a collection of configuration information
an LDAP client uses to access the LDAP naming service information on the supporting
LDAP server to provide LDAP naming services. In this chapter, we will use
this center piece of the LDAP configuration to discuss the planning of the
various aspects of the LDAP naming services. These include the network model,
the Directory Information Tree, the security model, the default values of
the various profile attributes, and finally, the preparation for data population.
Planning the Network Model
For availability and performance considerations, it would be best if
each subnet of the company-wide network has its own LDAP server to service
all the LDAP clients in the subnet. Only one of them needs to be a master
LDAP server. The rest could all be replicas of the master server.
To plan for the network configuration, consider how many servers are
available, how a client would be able to get to the servers, and in what order
the servers should be accessed. If there is one per subnet, we could use
the defaultServerList attribute to list all the servers
and have the LDAP client sort and manipulate the access order. If the servers
need to be accessed in certain order due to speed or data management reasons,
then we should use the preferredServerList attribute to
define the fixed order of accessing the servers. Note that you might not want
to put the master server on either of these lists to reduce the load on the
master server.
In addition, you may find three more attributes worth consideration
when planning for the server and network configuration. The bindTimeLimit attribute can be used to set the time-out value for a TCP connect
request, the searchTimeLimit attribute can be used to set
the time-out value for an LDAP search operation, and the profileTTL attribute can be used to control how often the LDAP client should
download its profile from the servers. For a slow or unstable network, the bindTimeLimit and searchTimeLimit attributes
might need a larger value than the defaults. For early stage testing of the
deployment, you might want to reduce the value of the profileTTL attribute to have the clients pick up the frequent changes made
to the profile stored in the LDAP servers.
Planning the Directory Information Tree (DIT)
As mentioned in the previous chapter, the LDAP naming services has a
default Directory Information Tree (DIT) and the associated default schema.
For example, the ou=people container contains the user
account, password, and shadow information. The ou=hosts
container contains information about systems in the network. Each entry in
the ou=people container would be of objectclass
posixAccount and shadowAccount. The default DIT
is a well designed directory structure and is based on open standards. It
should be sufficient for most of the naming service needs, and is recommended
to be used without changes. If you choose to use the default DIT, the only
thing you need to decide is from which node (base DN) on in the directory
tree the naming service information will be searched for a given domain. This
node is specified with the defaultSearchBase attribute.
Additionally, you might want to set the defaultSearchScope
attribute to tell the clients the scope of search a naming service lookup
should perform. Is it just searching one level under the DN (one), or the
entire subtree under the DN (sub)?
There are times, however, that more flexibility is needed for the LDAP
naming service to either work with an existing DIT or handle a more complicated
DIT with naming service data scattered around the directory tree. For example,
user account entries may exist in different part of the tree. The serviceSearchDescriptor, attributeMap, and objectclassMap attributes in the client profile are designed to
handle these situations.
A service search descriptor can be used to override the default search
base, search scope, and search filter for a particular service. See Service Search Descriptors (SSDs) and Schema Mapping.
The AttributeMap and ObjectclassMap
attributes provide a way for schema mapping. They make it possible for the
LDAP naming services to work with an existing DIT. You can map the posixAccount object class to an existing object class, myAccount, for example, an attributes in the posixAccount objectclass to attributes in the myAccount object
class.
Multiple Directory Servers
Multiple LDAP servers can serve one DIT. For example, some subtrees
of the DIT reside on other LDAP servers. In this case, an LDAP server may
refer the LDAP client to a different server for the naming data it knows about
but is not in its own database. If you plan such a DIT configuration, you
should set the clients' profile attribute followReferrals
to indicate to the LDAP naming service to follow server referrals to continue
naming service lookups. However, it is best to have all naming data for a
given domain reside on a single directory server, if at all possible.
Referrals can be useful if you want to have clients access read-only
replicas most of the time and follow referrals to a read/write master server
only when necessary. In this way, the master server does not get overloaded
with requests that could be handled by replicas.
Data Sharing With Other Applications
To make best use of LDAP, you should have a single LDAP entry for each
logical entry. For example, for a user you can have not only company white-page
information, but also Solaris account information, and possibly application-specific
data. Since posixAccount and shadowAccount
are auxiliary object classes, they can be added to any entry in the directory.
This will require careful planning, setup, and administration.
Choosing the Directory Suffix
See Chapter 11, iPlanet Directory Server 5.1 Configuration for information about how to
choose an appropriate directory suffix.
Replica Servers
There are three different strategies to employ when setting up replica
servers.
Single-master
With single-master replication, only one master server for any given
partition or non-partitioned network holds writable copies of directory entries.
Any replica servers have read-only copies of the directory entries. While
both replicas and masters can perform searches, compares, and bind operations,
only the master server can perform write operations.
The potential disadvantage to the single-master replication strategy
is that the master server is a single point of failure. If the master server
goes down, none of the replicas can process write operations.
Floating-master
The floating-master strategy is similar to the single-master strategy
in that there is only one master server with write capabilities at any given
time for a given partitioned or non-partitioned network. However, when implementing
the floating-master strategy, when the master server goes down, a replica
is automatically transformed into a master server by way of an algorithm.
One potential disadvantage to the floating-master replication strategy
is that if your network becomes partitioned and replicas on either side of
the partition become masters, the process of reconciling the new masters can
be very complicated if the network is rejoined.
Multi-master
With multi-master replication, there are multiple master servers with
their own read-write copies of the directory entry data. While the multi-master
strategy eliminates the problem of having a single point of failure, update
conflicts can occur between servers. In other words, if an entry's attribute
is modified around the same time on two masters, an update conflict resolution
policy, such as “last writer wins,” must be in place.
Refer to the iPlanet Directory Server 5.1 Administrator's
Guide for information on how to set up replica servers.
Planning the Security Model
To plan for the security model, you should first consider what identity
the LDAP client should be using to talk to the LDAP server. For example, you
must decide If you want strong authentication to protect the user password
flow across the wire, and/or if it is needed to encrypt the session between
the LDAP client and the LDAP server to protect the LDAP data transmitted.
The credentialLevel and authenticationMethod attributes in the profile are used for this. There are three possible
credential levels for credentialLevel: anonymous, proxy, and proxy anonymous.
See LDAP Naming Service Security Model for a detailed discussion of LDAP naming
service security concepts.
The main decisions you need to make when planning your security model
are the following.
-
What credential level and authentication methods will LDAP
clients use?
-
Will you use TLS?
-
Do you need to be backward compatible with NIS or NIS+? In
other words, will clients use pam_unix or pam_ldap?
-
What will the servers' passwordStorageScheme
attribute settings be?
-
How will you set up the Access Control Information? For more
information on ACIs, consult the iPlanet Directory Server 5.1 Administrator's
Guide.
Planning Client Profiles and Default Attribute Values
By going through the previous planning steps (network model, DIT, and
security model), you should have some idea of the values for the following
profile attributes.
Of the preceding attributes, only cn, defaultServerList, and defaultSearchBase are
required. They have no default values. The rest are optional, and some have
default values.
See Chapter 16, Client Setup (Task) for more information about setting
up LDAP clients.
Planning the Data Population
To populate the LDAP server with the LDAP naming service data, after
the LDAP server has been configured with the proper DIT and schema, it is
best to use the new ldapaddent tool. This tool will create
entries in LDAP containers from their corresponding /etc
files. It can be used to populate data into the containers for the following
type of data: aliases, auto_*, bootparams, ethers, group, hosts (including IPv6 addresses), netgroup, netmasks, networks, passwd, shadow, protocols, publickey, rpc, and services.
By default, ldapaddent reads from the standard input
and adds this data to the LDAP container associated with the database specified
on the command line. But an input file from which data should be read can
be specified using the -f option.
The entries are stored in the directory based on the client's configuration,
thus the client must be configured to use the LDAP naming service.
For better performance, the recommended order in which the databases
should be loaded is as follows.
-
passwd database followed by shadow database
-
networks database followed by netmasks database
-
bootparams database followed by ethers database
Note that when adding automounter entries, the database name is in the
form of auto_* (for example, auto_home).
If you have /etc files from different hosts to
add to the LDAP server, you can either merge all of them into the same /etc file and then use ldapaddent on one host
to add the files, or perform ldapaddent on the different
hosts one by one, with the expectation that each host is already configured
as a LDAP client.
If your naming service data is already in an NIS server, and you want
to move the data to the LDAP server for LDAP naming services, use the ypcat (or niscat) command to dump the NIS map
into files. Then, run ldapaddent against these files to
add the data to the LDAP server.
Note –
ldapaddent can only be run on an LDAP client.
The following procedure assumes that the tables are to be extracted
from a yp client.
How to Populate a Server With host Entries Using ldapaddent
-
Make sure that iPlanet Directory Server 5.1 was set up using idsconfig.
-
Become superuser on a client machine.
-
Make the machine an LDAP client.
# ldapclient init —a profileName=new —a \domainName=west.example.com 192.168.0.0
-
Populate the server with data.
# ldapaddent —h 192.168.0.0 —D directory_manager —f
/etc/hosts hosts
In this example, the directory_manager password would
be sent in the clear, as currently, ldapaddent binds using
the simple authentication method.
You can also populate your directory server with NIS+ data using the
proper settings in rpc.nisd. See Chapter 19, Transitioning From NIS+ to LDAP.
Chapter 15 iPlanet Directory Server 5.1 Setup (Tasks)
This chapter describes how to configure the iPlanet Directory
Server 5.1 to support a network of Solaris LDAP naming service clients. The
information is specific to the iPlanet Directory Server 5.1.
Note –
You must have already performed all the procedures described in
Chapter 11 before you can configure the iPlanet Directory Server 5.1 to work
with Solaris LDAP clients.
Note –
A directory server (an LDAP server) cannot
be its own client.
This chapter covers the following topics.
Configuring iPlanet Directory Server 5.1 Using idsconfig
Creating a Checklist Based on Your Server Installation
During the server installation process,
you will have defined crucial variables, with which you should create a checklist
similar to the one below before launching idsconfig. You
can use the blank checklist provided in Blank Checklists.
Note –
The information included below will serve as the basis for all
examples that follow in the LDAP related chapters. The example domain is of
an widget company, Example, Inc. with stores nationwide. The examples will
deal with the West Coast Division, with the domain west.example.com
Table 15–1 Server Variables Defined
|
Variable
|
Definition for Example
Network
|
|
Port number at which an instance of the directory server
is installed (DEFAULT=389)
|
default
|
|
Name of server
|
ipdserver (from the FQDN ipdserver.west.example.com or 192.168.0.0)
|
|
Replica server(s) (IPnumber:port number)
|
192.168.0.1 [for ipdrep.west.example.com]
|
|
Directory manager [dn: cn=directory manager]
|
default
|
|
Domain name to be served
|
west.example.com
|
|
Maximum time (in seconds) to process client requests before
timing out
|
—1
|
|
Maximum number of entries returned for each search request
|
—1
|
Note –
If you are using hostnames in defining defaultServerList or preferredServerList, you MUST ensure LDAP
is not used for hosts lookup. This means ldap must not
be in /etc/nsswitch.conf hosts line.
Table 15–2 Client Profile Variables Defined
|
Variable
|
Definition for Example
Network
|
|
Profile name
|
WestUserProfile
|
|
Server list (defaults to the local subnet)
|
west.example.com or 192.168.0.0
|
|
Preferred server list (listed in order of which server to
try first, second, and so on)
|
none
|
|
Search scope (number of levels down through the directory
tree. 'One', the default, or 'Sub')
|
one (default)
|
|
Credential used to gain access to server. Default is anonymous
|
proxy
|
|
Follow Referrals?
( a pointer to another server if the main server is unavailable) Default is no.
|
Y
|
|
Search time limit (default is 30 seconds) for waiting for
server to return information.
|
default
|
|
Bind time limit (default is 10 seconds)
for contacting server. The default is seconds.
|
2
|
|
Authentication method Default is none.
|
simple
|
Note –
Client profiles are defined per domain. At least one profile must
be defined for a given domain.
Attribute Indices
idsconfig indexes the following list of attributes for
improved performance.
|
membernisnetgroup
|
pres,eq,sub
|
|
nisnetgrouptriple
|
pres,eq,sub
|
|
memberuid
|
pres,eq
|
|
uidNumber
|
pres,eq
|
|
gidNumber
|
pres,eq
|
|
ipHostNumber
|
pres,eq
|
|
ipNetworkNumber
|
pres,eq
|
|
ipProtocolNumber
|
pres,eq
|
|
oncRpcNumber
|
pres,eq
|
Schema Definitions
idsconfig(1M)
automatically adds the necessary schema definitions. Unless you are very experienced
in LDAP administration, do not manually modify the server schema. See Chapter 18, General Reference (Reference) for an extended list of schemas used by the LDAP naming
service.
Using Browsing Indices
The browsing
index functionality of the iPlanet Directory Server, otherwise known as the
virtual list view, provides a way in which a client can view a select group
or number of entries from very long list, thus making the search process less
time consuming for each client. Browsing Indexes provide optimized, predefined
search parameters with which the Solaris LDAP naming client can access specific
information from the various services more quickly. Keep in mind that if you
do not create browsing indexes, the clients may not get all the entries of
a given type because the server limits for search time or number of entries
might not be enforced.
Indexes are configured on the directory server and the proxy user has
read access to these indexes.
Refer to the iPlanet Directory Server Administrators Guide 5.1 for information
on configuring indexes on the iPlanet Directory Server as well as the performance
cost associated with using them.
In the following example, note that the -n option
denotes the name of the database with the entries to be indexed and and the -s option denotes the instance of the directory server.
Note –
idsconfig creates all the default VLV indices.
directoryserver -s ipdserver vlvindex -n userRoot -T getgrent
directoryserver -s ipdserver vlvindex -n userRoot -T gethostent
directoryserver -s ipdserver vlvindex -n userRoot -T getnetent
directoryserver -s ipdserver vlvindex -n userRoot -T getpwent
directoryserver -s ipdserver vlvindex -n userRoot -T getrpcent
directoryserver -s ipdserver vlvindex -n userRoot -T getspent
|
Using Service Search Descriptors to Modify Client Access to Various
Services
A service search
descriptor (SSD) changes the default search request for a given operation
in LDAP to a search you define. SSDs are particularly useful if, for example,
you have been using LDAP with customized container definitions or another
operating system and are now transitioning to Solaris 9. Using SSDs, you can
configure Solaris 9 LDAP naming services without having to change your existing
LDAP database and data.
Setting Up SSDs Using idsconfig
Assume your predecessor at Example, Inc. had configured LDAP, storing
users in ou=Users container. You are now upgrading to Solaris
9. By definition, Solaris 9 LDAP assumes that user entries are stored in ou=People container. Thus, when it comes to searching the passwd service, LDAP will search the ou=people
level of the DIT and not find the correct values.
One rather laborious solution to the above problem would be to completely
overwrite Example, Inc.'s existing DIT and to rewrite all the exiting applications
on Example, Inc.'s network so that they are compatible with the new LDAP naming
service. A second, far preferable solution would be to use an SSD that would
tell LDAP to look for user info in an ou=Users container
instead the default ou=people container.
You would define the necessary SSD during the configuration of the iPlanet
Directory Server 5.1 using idsconfig. The prompt line appears
as follows.
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
|
Running idsconfig
Note –
You do not need special rights to run idsconfig,
nor do you need to be an LDAP naming client. Remember to create a checklist
as mentioned in Creating a Checklist Based on Your Server Installation in preparation for running idsconfig. You don not have to run idsconfig
from a server or an LDAP naming service client machine. You can run idsconfig from any Solaris machine on the network.

Caution –
idsconfig sends the Directory Manager's
password in the clear. If you do not want this to happen, you must run idsconfig on the directory server itself, not on a client.
How to Configure the iPlanet Directory Server Using idsconfig
-
Make sure the target iPlanet Directory Server 5.1 is up and running.
-
Run idsconfig.
# /usr/lib/ldap/idsconfig
-
Answer the questions prompted. Note that 'no' [n] is the default user
input. If you need clarification on any given question, type
and
a brief help paragraph will appear.
Refer to the following example run of idsconfig using
the definitions listed in the server and client checklists at the beginning
of this chapter in Creating a Checklist Based on Your Server Installation. It is an example of a
simple setup, without modifying many of the defaults. The most complicated
method of modifying client profiles is by creating SSDs. Refer to Using Service Search Descriptors to Modify Client Access to Various
Services
for a detailed discussion.
A carriage return sign after the prompt means that you are accepting
the [default] by hitting enter.
Example 15–1 Running idsconfig for the Example, Inc. Network
(sysadmin@test) [3:10pm] ns_ldap [31] % sh idsconfig.sh
It is strongly recommended that you BACKUP the directory server
before running idsconfig.sh.
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 iPlanet Directory Server's (iPlanet Directory Server)
hostname to setup: IPDSERVER
|
Enter the port number for iPlanet Directory Server (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]
Default server list (h=help): [192.168.0.0]
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] Y
|
Do you want to modify the server timelimit value (y/n/h)? [n] Y
|
Enter the time limit for iPlanet Directory Server (current=3600): [-1]
|
Do you want to modify the server sizelimit value (y/n/h)? [n] Y
|
Enter the size limit for iPlanet Directory Server (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] 2
|
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 : default
4 Default Server List : 192.168.0.0
5 Preferred Server List :
6 Default Search Scope : one
7 Credential Level : proxy
8 Authentication Method : simple
9 Enable Follow Referrals : TRUE
10 iPlanet Directory Server Time Limit : -1
11 iPlanet Directory 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 : 2
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. Nis 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:
ipHostNumber (eq,pres) Finished indexing.
uidNumber (eq,pres) Finished indexing.
ipNetworkNumber (eq,pres) Finished indexing.
gidnumber (eq,pres) Finished indexing.
oncrpcnumber (eq,pres) Finished indexing.
16. Processing eq,pres,sub indexes:
membernisnetgroup (eq,pres,sub) Finished indexing.
nisnetgrouptriple (eq,pres,sub) Finished indexing.
17. Processing VLV indexes:
getgrent vlv_index Entry created
gethostent vlv_index Entry created
getnetent vlv_index Entry created
getpwent vlv_index Entry created
getrpcent vlv_index Entry created
getspent vlv_index Entry created
idsconfig.sh: Setup of iPlanet Directory Server server ipdserver is complete.
Note: idsconfig has created entries for VLV indexes. Use the
directoryserver(1m) script on ipdserver to stop
the server and then enter the following vlvindex
sub-commands to create the actual VLV indexes:
directoryserver -s ipdserver vlvindex -n userRoot -T getgrent
directoryserver -s ipdserver vlvindex -n userRoot -T gethostent
directoryserver -s ipdserver vlvindex -n userRoot -T getnetent
directoryserver -s ipdserver vlvindex -n userRoot -T getpwent
directoryserver -s ipdserver vlvindex -n userRoot -T getrpcent
directoryserver -s ipdserver vlvindex -n userRoot -T getspent
|
Note –
Any parameters left blank in the summary screen will not be set
up.
After idsconfig has completed the setup of the directory,
you need to run the specified commands on the server before the server setup
is complete and the server is ready to serve clients.
Populating the Directory Server Using ldapaddent
Note –
Before populating the directory server with data, you must configure the server
to store passwords in Unix Crypt format if you are using pam_unix. If you are using pam_ldap, you can
store passwords in any format. For more information on setting the password
in UNIX crypt format, see the iPlanet Directory Server
documents.
Note –
ldapaddent(1M)
can only run on a client which is already configured for the LDAP naming service.
ldapaddent reads from the standard input (that being
an /etc/filename like passwd) and
places this data to the container associated with the service. Client configuration
determines how the data will be written by default.
The following is an example of populating the server with data using ldapaddent.
Example 15–2 How to populate the iPlanet Directory Server 5.1 with user password
data using ldapaddent
-
Use the ldapaddent command to add /etc/passwd entires to the server.
# ldapaddent -D "cn=directory manager" -f /etc/passwd passwd
See ldapaddent(1M).
See Chapter 13, Basic Components and Concepts (Overview) for information regarding LDAP security
and write-access to the Directory Server.
Managing Printer Entries
Adding Printers
To add printer entries into the LDAP directory use either the printmgr configuration tool or the lpset -n ldap
command-line utility See lpset(1M). Note that the printer objects added
to the directory only define the connection parameter, required by print system
clients, of printers. Local print server configuration data is still held
in files. A typical printer entry would look like the following.
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
|
Using lpget
lpget(1M)
can be used to list all printer entries known by the LDAP client's LDAP directory.
If the LDAP client's LDAP server is a replica server, then printers listed
may or may not be the same as that in the master LDAP server depending on
the update replication agreement. See lpget(1M) for more information.
For example, to list all printers for a given base DN you would type
the following.
# 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)
|
Populating the Server with Additional Profiles
Use ldapclient with the genprofile
option to create an LDIF representation of a configuration profiles, based
on the attributes specified. The profile you create can then be loaded into
an LDAP server to be used as the client profile, which can be downloaded
by the client using ldapclient init.
Refer to ldapclient(1M)
for information on using ldapclient genprofile.
The following is an example of how to populate the server with additional
profiles using ldapclient.
Example 15–3 How to populate the server with additional profiles
-
Become superuser,
-
Use ldapclient with the genprofile command.
# ldapclient genprofile -a profileName=myprofile \
-a defaultSearchBase=dc=west,dc=example,dc=com \
-a "defaultServerList=192.168.0.0 192.168.0.1:386" \
> myprofile.ldif
-
Upload the new profile to the server.
# ldapadd –h 192.168.0.0 —D “cn=directory
manager” —f myprofile.ldif
Chapter 16 Client Setup (Task)
This chapter describes how to set up a Solaris LDAP naming
service client.
This chapter covers the following topics.
Prerequisites
In order for a Solaris client to use LDAP as a naming service the following
needs to be in place.
-
The client's domain name must be served by the LDAP server
-
The nsswitch.conf file needs to point
to LDAP for the required services. For information about the nsswitch.conf file, see Chapter 2, The Name Service Switch (Overview)
-
The client needs to be configured with all the given parameters
that define its behavior
-
ldap_cachemgr needs to be running on the
client
-
At least one server for which a client is configured must
be up and running
The ldapclient utility is the key to setting up an
LDAP client, as it performs all of the above steps, except for starting the
server. The rest of this chapter will show examples of how to use the ldapclient utility to setup a LDAP client and use the various other
LDAP utilities to get information about, and check the status of an LDAP client.
Initializing a Client
ldapclient(1M)
is an utility used to setup LDAP clients in a Solaris operating environment. ldapclient assumes the server has already been configured with the
appropriate client profiles. You must install and configure the server with
the appropriate profiles before you can set up any clients.
There are two ways to set up a client using ldapclient.
-
Profile
At a minimum, you need to specify the server address containing the
profile and domain you wish to use. If no profile is specified, then the “default”
profile is assumed. The server will provide the rest of the required information,
except for proxy and certificate database information. If a client's credential
level is proxy or proxy anonymous, you
must supply the proxy bind DN and password. See Assigning Client Credential Levels
for more information.
-
Manual
You configure the profile on the client itself, which means defining
all parameters form the command line. Thus, the profile information is stored
in cache files and is never refreshed by the server.
Note –
Though you can manually configure clients, it is not recommended.
Using the configuration profiles decreases the complexity and cost of managing
clients.
Using Profiles to Initialize a Client
How to Initialize a Client Using Profiles
-
Become superuser.
-
Run ldapclient with init.
# ldapclient init -a profileName=new -a \
domainName=west.example.com 192.168.0.0
System successfully configured
|
Using Proxy Credentials
How to Initialize a Client using Proxy Credentials
-
Become superuser.
-
Run ldapclient (defining proxy values).
# 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.0
System successfully configured
|
The -a proxyDn and -a proxypassword
are required if the profile to be used is setup for proxy. As the credentials are not stored in the profile saved on
the server, you need to supply the information when you initialize the client.
This method is more secure than the older method of storing the proxy credentials
on the server.
The proxy info will be used to create the /var/ldap/ldap_client_cred and the rest of the information will be put in /var/ldap/ldap_client_file.
Note –
DO NOT edit either the client configuration files directly. Use ldapclient to create or modify the content of these files.
Initializing a Client Manually
Superusers can perform manual client configurations. However, many of
the checks are bypassed during the process, so it is relatively easy to mis-configure
your system. In addition, you must change settings on every machine, instead of in one central place, as is done when using profiles.
How to initialize a client manually.
-
Become superuser.
-
Use 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.0
-
Use ldapclient list to verify.
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.0
NS_LDAP_SEARCH_BASEDN= dc=west,dc=example,dc=com
NS_LDAP_CREDENTIAL_LEVEL= proxy
|
Modifying a Manual Client Configuration
How to modify a manual configuration
-
Become superuser
-
Use the ldapclient mod to change the authentication
method to simple.
# ldapclient mod -a authenticationMethod=simple
-
Use ldapclient list to verify the change was made.
# 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.0
NS_LDAP_SEARCH_BASEDN= dc=west,dc=example,dc=com
NS_LDAP_AUTH= simple
NS_LDAP_CREDENTIAL_LEVEL= proxy
|
Un-initializing a Client
How to un-initialize a client
-
Become superuser.
-
Use ldapclient uninit.
# ldapclient uninit
System successfully recovered
|
ldapclient uninit restores the client name service
to what it was prior to the most recent init, modify, or manual operation. In other words,
it performs an “undo” on the last step taken. For example, if
the client was configured to use profile1 and was then
changed to use profile2, using ldapclient uninit would revert the client back to using profile1.
TLS Security Setup

Caution –
The cert7.db and key3.db
files must be readable by everyone. Be sure not to include any private keys
in the key3.db file.
If using TLS, the necessary security databases must be installed. In
particular, the files cert7.db and key3.db
are needed. The cert7.db file contains the database of
trusted certificates. The key3.db file contains the client's
keys. Although the LDAP naming service client does not use client keys, this
file must be present.
Before running ldapclient, you should set up and
install the needed security database files described in this section.
See the section 'Configuring LDAP Clients to Use SSL' in the Managing
SSL chapter of the iPlanet Directory Server 5.1 Administrator's Guide for
information on how to create and manage these files. Once configured, these
files must be stored in the location expected by the LDAP naming service client.
The attribute certificatePath is used to determine this
location. This is by default /var/ldap.
For example, after setting up the necessary cert7.db
and key3.db files using Netscape Communicator, copy them
to the default location.
# cp $HOME/.netscape/cert7.db /var/ldap
# cp $HOME/.netscape/key3.db /var/ldap
Next, give everyone read access.
# chmod 444 /var/ldap/cert7.db
# chmod 444 /var/ldap/key3.db
Note –
Netscape will manage the cert7.db and key3.db in the $HOME/.netscape directory.
Copies of these security databases must be stored on a local file system
if you are using them for the LDAP naming service client.
Configuring PAM
If you are using pam_ldap, follow the sample pam.conf file included in Example pam.conf File for pam_ldap and add the
lines containing pam_ldap.so.1 to the client's /etc/pam.conf file. Not every line containing pam_ldap.so.1 is needed. Only the section for the command, login and password,
for example, which requires pam_ldap, needs to be modified.
For details, see pam.conf(4).
Retrieving Naming Service Information
Using ldaplist
ldaplist is an LDAP utility to list the naming information
from the LDAP servers in LDIF format. It can be useful for troubleshooting.
See ldaplist(1)
for further information.
Listing All LDAP Containers
ldaplist displays its output with a blank line separating
records, which is helpful for big multiline records.
Note –
The output of ldaplist depends upon the client
configuration. For example, if the value of ns_ldap_search
is sub rather than one, ldaplist lists all the entries under the current search baseDN.
The following is and example of ldaplist output.
# 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
|
Listing All User Entry Attributes
To list specific information such as a user's passwd
entry, use getent as follows.
# getent passwd user1
user1::30641:10:Joe Q. User:/home/user1:/bin/csh
|
If you want to list all attributes, use ldaplist
with the -l option.
# ldaplist -l passwd user1
dn: 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
userPassword: {crypt}J6vlYXRU.sW8c
|
Customizing the Client Environment
There are a couple of things you can tune in your client environment
to make things work the way you want.
Modifying the nsswitch.conf File
You can modify your /etc/nsswitch.conf file to
customize where each service gets its information. The default settings are
stored in /etc/nsswitch.ldap and ldapclient uses this file to create your /etc/nsswitch.conf
file when the client is initialized.
If you want to enable DNS by setting up a /etc/resolv.conf file, you will want to add DNS to your hosts lines as shown below.
hosts: ldap dns [NOTFOUND=return] files
|
You can change any of the services, but be careful, because if the data
is not populated on the server for the service specified things will stop
working. In some cases files may not be setup by default as well.
Chapter 17 Troubleshooting
This chapter describes configuration problems and suggested
solutions.
Monitoring Client Status
This section shows various commands that can be used to help determine
the state of the LDAP client environment. For more information see the section
on troubleshooting which will give more information on common problems and
how to solve them. Also see the man pages for additional information on the
options that can be used.
Verifying ldap_cachemgr is running
The ldap_cachemgr daemon must be running and functioning
correctly at all times. Otherwise, nothing works. There are two ways to check
if ldap_cachemgr is running.
-
Use ps -ef.
# ps -ef | grep ldap_cachemgr
-
Pass the -g option to ldap_cachemgr.
This causes it to dump the following status information, which is useful
when you must diagnose a problem.
# /usr/lib/ldap/ldap_cachemgr -g
cachemgr configuration:
server debug level 0
server log file "/var/ldap/cachemgr.log"
number of calls to ldapcachemgr 19
cachemgr cache data statistics:
Configuration refresh information:
Previous refresh time: 2001/11/16 18:33:28
Next refresh time: 2001/11/16 18:43:28
Server information:
Previous refresh time: 2001/11/16 18:33:28
Next refresh time: 2001/11/16 18:36:08
server: 192.168.0.0, status: UP
server: 192.168.0.1, status: ERROR
error message: Can't connect to the LDAP server
Cache data information:
Maximum cache entries: 256
Number of cache entries: 2
|
Checking the Current Profile Information
Become superuser and run ldapclient with the list option.
# 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.0, 192.168.0.1
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.0
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
|
Currently the /var/ldap files are in ASCII format,
but that could change to binary at some time and cating the files would cause
problems. ldapclient list is the supported method for
accessing this information.
Verifying Basic Client/Server Communication
The best way to show that your client is talking to the LDAP server
is with the ldaplist command. The simplest form, ldaplist with no arguments will dump all the containers on the server.
This works as long as the containers exist, and do not have to be populated.
If the first step works, you can try ldaplist passwd username or ldaplist hosts hostname but if they contain lots of data you might
want to pick a less populated service, or pipe them to head or more.
Checking Server Data From a Non-client Machine
Most of the commands above assume you are already an LDAP client. If
you have not created a client and want to check the data on the server, use
the ldapsearch command. The following example lists all
of the containers.
# ldapsearch -h server1 -b "dc=west,dc=example,dc=com" -s
one "objectclass=*"
Configuration Problems and Solutions
The following discussion briefly describes LDAP configuration problems
and suggested solutions to the problems.
Unresolved Hostname
The Solaris operating environment LDAP client backend returns fully
qualified hostnames for host lookups, such as hostnames
returned by gethostbyname(3N) and getipnodebyname(3N). If the name stored is qualified that is contains at least
one dot, the client returns the name as is. For example, if the name stored
is hostB.eng, the returned name is hostB.eng.
If the name stored in the LDAP directory is not qualified (it does not
contain any dot), the client backend appends the domain part to the name.
For example, if the name stored is hostA, the returned
name is hostA.domainname.
Unable to Reach Systems in the LDAP Domain Remotely
If the DNS domain
name is different from the LDAP domain
name, then the LDAP naming service cannot be used to serve host names unless
the host names are stored fully qualified.
Login Does Not Work
LDAP clients use the pam(3) modules for user authentication during the logins. When using the standard UNIXTM PAM module, the password is read from the server and checked on
the client side. This can fail due to one of the following reasons.
-
ldap not used by the passwd
service in the /etc/nsswitch.conf file
-
The user's userPassword attribute on the
server list is not readable by the proxy agent. You need to allow at least
the proxy agent to read the password because the proxy agent returns it to
the client for comparison. pam_ldap does not require read
access to the password
-
Proxy agent might not have correct password
-
The entry does not have the shadowAccount
objectclass
-
There is no password defined for the user
When you use ldapaddent, you must use the -p option to ensure that the password is added to the user entry.
If you used ldapaddent without using the -p
option, the, users's password will not be stored in the directory unless you
also add the /etc/shadow file using ldapaddent.
-
None of the LDAP servers are reachable.
Check the status of the servers.
# /usr/lib/ldap/ldap_cachemgr —g
-
pam_conf is configured incorrectly.
-
The user is not defined in the LDAP namespace.
-
NS_LDAP_CREDENTIAL_LEVEL is set to anonymous for pam_unix and userPassword attribute is not available to anonymous users.
-
Password is not stored in crypt format.
Lookup Too Slow
The LDAP database relies on indexes to improve the
performance. A major performance degradation occurs when indexes are not configured
properly. As part of the documentation, we have provided a common set of attributes
that should be indexed. You can also add your own indexes to improve performance
at your site.
ldapclient Cannot Bind to Server
ldapclient failed to initialize the client when using
the init profile option. There are several possible reasons for this failure.
-
The incorrect domain name was specified on the command line.
-
nisDomain attribute is not set in the DIT
to represent the entry point for the specified client domain.
-
Access control information is not set up properly on the server,
thus disallowing anonymous search in the LDAP database.
-
Incorrect server address passed to the ldapclient command. Use ldapsearch(1) to verify the server
address
-
Incorrect profile name passed to the ldapclient
command. Use ldapsearch(1) to verify the profile name
in the DIT.
-
Use snoop(1M)
on the client's network interface to see what sort of traffic is going out,
and determine to which server it is talking.
Using ldap_cachemgr for Debugging
Usingldap_cachemgr with the —g
option can be a useful way to debug, as you can view the current client configuration
and statistics. For example,
# ldap_cachemgr —g
would print current configuration and statistics to standard output,
including the status of all LDAP servers, as mentioned previously. Note that
you do not need to become superuser to execute this command.
ldapclient Hangs During Setup
If the ldapclient command hangs, hitting Ctrl-C will
exit after restoring the previous environment. If this happens, check with
the server administrator to make sure the server is running.
Also check the server list attributes on either the profile or the command
line and make sure the server information is correct.
Frequently Asked Questions
Can I use LDAP naming services with Older Solaris Releases?
Currently, LDAP is only supported in Solaris 8 and Solaris 9. For differences
between the two see New LDAP Naming Service Features for Solaris 9.
What are the DIT Default Locations in Solaris LDAP Naming Services?
See Default Directory Information Tree (DIT).
Chapter 18 General Reference (Reference)
-
Blank Checklists
-
Upgrade Information
-
LDAP Commands
-
Example pam.conf File for pam_ldap
-
IETF Schemas
-
Directory User Agent Profile (DUAProfile) Schema
-
Solaris Schemas
-
Internet Print Protocol Information
-
Generic Directory Server Requirements
-
Default Filters Used by LDAP Naming Services
Blank Checklists
Table 18–1 Server Variables Defined
|
Variable
|
Definition for _______
Network
|
|
Port number at which an instance of the directory server
is installed (DEFAULT=389)
| |
|
Name of server
| |
|
Replica server(s) (IP number:port number)
| |
|
Directory manager [dn: cn=directory manager]
| |
|
Domain name to be served
| |
|
Maximum time (in seconds) to process client requests before
timing out
| |
|
Maximum number of entries returned for each search request
| |
Table 18–2 Client Profile Variables Defined
|
Variable
|
Definition for ________
Network
|
|
Profile name
| |
|
Server list (defaults to the local subnet)
| |
|
Preferred server list (listed in order of which server to
try first, second, and so on)
| |
|
Search scope (number of levels down through the directory
tree. 'One' or 'Sub')
| |
|
Credential used to gain access to server. Default is anonymous
| |
|
Follow Referrals? ( a pointer to another server if the main
server is unavailable) Default is no.
| |
|
Search time limit (in seconds, default 30) for waiting for
server to return information.
| |
|
Bind time limit (in seconds, default
30) for contacting server. The default is seconds.
| |
|
Authentication method Default is none.
| |
Upgrade Information
Solaris 9 clients are fully compatible with directory servers set up
to serve Solaris 8 clients. ldapclient(1M) can simply download such a profile and
configure the client using version 1 profiles. However to take advantage
of new features built into Solaris 9 and to use the new security model, version
2 profiles must be used.
Servers can serve a mix of both old and new clients so that both clients
see the same results from the server as long as schema mapping is not enabled
and version 2 profiles are not configured to use special filters in serviceSearchDescriptors. Obviously if the server is not using
the default schema, older clients cannot use that server as Solaris 8 clients
cannot arbitrarily map their schema.
One additional change that also should be considered is that in Solaris
8 clients, running ldap_cachemgr() was recommended, but
optional. In Solaris 9, ldap_cachemgr() must be running at all times. The daemon is required
for the client to function properly.
New Automount Schema
By default, Solaris 9 uses a new schema for automount entries instead
of using generic NIS map schema which Solaris 8 clients used. This means
that if you set up a server with Solaris 9 tools, Solaris 8 clients cannot
see the automount entries. For sites where the server being setup is to serve
both Solaris 9 and Solaris 8 clients, a profile can be created to map the
schema to the old one before adding automounter entries. This would ensure
that ldapaddent(1M)
adds the entries using the old schema. However, note that this would also
mean that all Solaris 9 clients must use a profile where the schema for automount
is mapped.
You need to add the following mapping attributes to your profile for
this mapping to take effect.
attributeMap: automount:automountMapName=nisMapName
attributeMap: automount:automountKey=cn
attributeMap: automount:automountInformation=nisMapEntry
objectclassMap: automount:automountMap=nisMap
objectclassMap: automount:automount=nisObject
|
LDAP Commands
There are two sets of LDAP-related commands in Solaris. One set is the
general LDAP tools, which do not require the client to be configured with
the LDAP naming service. The second set uses the common LDAP configuration
on the client and therefore can only be used if the client is configured
to use LDAP as its naming service.
General LDAP Tools
LDAP command-line tools support a common set of options, including authentication
and bind parameters.
These commands can be used to manipulate directory entries directly.
The ldapsearch(1), ldapmodify(1), ldapadd(1),
and ldapdelete(1)
tools support a common text-based format for representing directory
information called the LDAP Data Interchange Format (LDIF).
LDAP Tools Requiring LDAP Naming Services
Table 18–3 Tools (From Section 1 Man Pages)
|
Tool
|
Function
|
|
ldapaddent(1M)
|
Used to create
entries in LDAP containers from the corresponding /etc
files. This tool allows populating the directory from files. For example,
it reads /etc/passwd format file and populates passwd entries in the directory.
|
|
ldaplist(1)
|
Used to list contents of various services from the directory.
|
|
idsconfig(1M)
|
Used to set up iPlanet Directory Server 5.1 to serve LDAP naming service clients.
|
Example pam.conf File for pam_ldap
#
# Authentication management
#
# login service (explicit because of pam_dial_auth)
#
login auth required pam_authtok_get.so.1
login auth required pam_dhkeys.so.1
login auth required pam_dial_auth.so.1
login auth sufficient pam_unix_auth.so.1
login auth required pam_ldap.so.1 try_first_pass
#
# rlogin service (explicit because of pam_rhost_auth)
#
rlogin auth sufficient pam_rhosts_auth.so.1
rlogin auth required pam_authtok_get.so.1
rlogin auth required pam_dhkeys.so.1
rlogin auth sufficient pam_unix_auth.so.1
rlogin auth required pam_ldap.so.1 try_first_pass
#
# rsh service (explicit because of pam_rhost_auth)
#
rsh auth sufficient pam_rhosts_auth.so.1
rsh auth required pam_authtok_get.so.1
rsh auth required pam_dhkeys.so.1
rsh auth sufficient pam_unix_auth.so.1
rsh auth required pam_ldap.so.1 try_first_pass
#
# PPP service (explicit because of pam_dial_auth)
#
ppp auth required 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 try_first_pass
#
# Default definitions for Authentication management
# Used when service name is not explicitly mentioned for authenctication
#
other auth required pam_authtok_get.so.1
other auth required pam_dhkeys.so.1
other auth sufficient pam_unix_auth.so.1
other auth required pam_ldap.so.1 try_first_pass
#
# passwd command (explicit because of a different authentication module)
#
passwd auth sufficient pam_passwd_auth.so.1
passwd auth required pam_ldap.so.1 try_first_pass
#
# cron service (explicit because of non-usage of pam_roles.so.1)
#
cron account required pam_projects.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_projects.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 required pam_authtok_get.so.1
other password required pam_authtok_check.so.1
other password sufficient pam_authtok_store.so.1
other password required pam_ldap.so.1
#
# Support for Kerberos V5 authentication (uncomment to use Kerberos)
#
#rlogin auth optional pam_krb5.so.1 try_first_pass
#login auth optional pam_krb5.so.1 try_first_pass
#other auth optional pam_krb5.so.1 try_first_pass
#cron account optional pam_krb5.so.1
#other account optional pam_krb5.so.1
#other session optional pam_krb5.so.1
#other password optional pam_krb5.so.1 try_first_pass
|
IETF Schemas
Schemas are definitions describing what types of information can be
stored as entries in a server's directory.
In order for a directory server to support Solaris 9 LDAP naming clients,
schemas defined in this chapter must be configured in the server unless schema
is mapped using the schema mapping feature of the clients.
There are four required LDAP schemas defined by IETF: the RFC 2307 Network
Information Service schema, the LDAP mailgroups Internet draft, and the LDAP
Internet Print Protocol (IPP) draft schema (listed under Solaris schemas).
To support the Naming Information Service, the definition of these schemas
must be added to the directory server. The various RFCs can also be accessed
on the IETF Web site. http://www.ietf.org.
Note –
Internet drafts are draft documents valid for a maximum of six
months and might be updated, or rendered obsolete by other documents at any
time.
RFC 2307 Network Information Service Schema
The LDAP servers must be configured to support the revised RFC 2307.
The nisSchema OID is 1.3.6.1.1.
The RFC 2307 Attributes are the following.
( 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 )
|
The nisSchema OID is 1.3.6.1.1.
The RFC 2307 objectClasses are the following.
( 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 )
|
Mail Alias Schema
Mail alias information uses the schema defined by the LDAP
Mailgroups Internet draft, formerly known as the draft-steinback-ldap-mailgroups
draft. Until a new schema becomes available, Solaris LDAP clients will continue
to use this schema for mail alias information.
The original LDAP Mailgroups schema contains a large number of attributes
and object classes. Only two attributes and a single object class are used
by Solaris clients. These are listed below.
The mail alias Attributes are the following.
( 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)' )
|
The mail alias objectClass is the following.
( 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 ))
|
Directory User Agent Profile (DUAProfile) Schema
The DUAConfSchemaOID is 1.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 Schemas
The schemas required for the Solaris operating environment are the following.
Solaris Projects Schema
/etc/project is a local source of attributes associated
with projects. For more information, see project(4).
The Project Attributes are the following.
( 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' )
|
The Project objectClass is the following.
( 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 ) )
|
Role-Based Access Control and Execution Profile Schema
/etc/user_attr is a local source of extended attributes
associated with users and roles. For more information, see user_attr(4).
The role-based access control Attributes are the following.
( 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 )
|
The role based access control objectClassses are the following.
( 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 ) )
|
Internet Print Protocol Information
Internet Print Protocol (IPP) Attributes
( 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 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 Printer Attributes
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 Printer 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 ))
|
Generic Directory Server Requirements
To support Solaris 9 LDAP clients, the server, regardless of what brand,
must support the LDAP v3 protocol and compound naming and auxiliary object
classes. In addition, at least one of the following controls must be supported.
-
Simple paged-mode (RFC 2696)
-
Virtual List View controls
The server must support at least one of the following authentication
methods.
-
anonymous
-
simple
-
sasl/cram-MD5
-
sasl/digest-MD5
If using pam_unix, the server must support storing
passwords in UNIX crypt format.
If using TLS, the server must support SSL or TLS.
Default Filters Used by LDAP Naming Services
If you do not manually specify a parameter for a given service using
an SSD, the default filter is used. To list the default filters for a given
service, use ldaplist with the —v
option.
In the following example, filter=(&(objectclass=iphost)(cn=abcde)defines the default filters.
database=hosts
filter=(&(objectclass=iphost)(cn=abcde)
user data=(&(%s) (cn=abcde))
|
ldaplist generates the following list of default
filters, where %s signifies a string and %d,
a number.
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))
--------------
|
Table 18–4 LDAP Filters Used in
getXbyY Calls
|
Filter
|
Definition
|
|
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))
|
|
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))
|
The following table lists the getent attribute filters.
Table 18–5
getent Attribute Filters
|
Filter
|
Definition
|
|
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)
|
Chapter 19 Transitioning From NIS+ to LDAP
This chapter describes how to make the transition from using
the NIS+ naming service to the LDAP naming service.
Overview
The NIS+ server daemon, rpc.nisd, stores NIS+ data in proprietary-format files
in the /var/nis/data directory. While it is entirely
possible to keep NIS+ data synchronized with LDAP, such synchronization has
previously required an external agent. However, the NIS+ daemon now enables
you to use an LDAP server as a data repository for NIS+ data. Since this makes
it possible for NIS+ and LDAP clients to share the same naming service information,
it is easier to transition from using NIS+ as the main naming service, to
using LDAP for the same role. For more information on using LDAP as a naming
service, see “Introduction to the LDAP Naming Service (Overview/Reference)” in System Administration Guide: Naming and Directory Services (DNS, NIS, and
LDAP).
By default, the rpc.nisd daemon continues to work
as before, relying only on the/var/nis/data NIS+ database.
If desired, the system administrator can choose to use an LDAP server as the
authoritative data repository for any subset of the NIS+ database. In this
case, the /var/nis/data files serve as a cache for the rpc.nisd daemon, reducing LDAP lookup traffic, and enabling the rpc.nisd to continue working if the LDAP server is temporarily unavailable.
In addition to continuous synchronization between NIS+ and LDAP, you can also
perform uploads of NIS+ data to LDAP, or downloads of LDAP data to NIS+.
Mapping of data to and from LDAP is controlled by a flexible configuration
file syntax. (All standard NIS+ tables (except for client_info.org_dir and timezone.org_dir ) are covered by a template
mapping file, /var/nis/NIS+LDAPmapping.template), which
should require little or no change for most NIS+ installations. (See client_info and timezone Tables for information on client_info.org_dir and timezone.org_dir.) In addition to locations
for NIS+ data in the LDAP Directory Information Tree (DIT), the mapping file
also allows establishing time-to-live (TTL) for NIS+ data sourced from LDAP.
While there often is a one-to-one mapping between NIS+ column values and LDAP
attribute values, the mapping file can be used to maintain more complicated
relationships as well.
The new /etc/default/rpc.nisd file is used to select
LDAP server and authentication, and controls some general rpc.nisd behavior. See rpc.nisd(4). The details of the mapping is specified
via the /var/nis/NIS+LDAPmapping file. For more information,
see NIS+LDAPmapping(4).
The name of this file can be changed using the -m command-line
option of rpc.nisd. For more information, see rpc.nisd(1M).
The following terms are used in this chapter.
-
Container
A container is the location in the LDAP DIT where all related entries
are stored. For example, user account information is often stored in the ou=People container, while host address information can be stored
in the ou=Hosts container.
-
Netname
A netname is an entity in secure RPC (user or machine) that can be authenticated.
-
Mapping
Mapping is the relationship between an NIS+ object and an LDAP entry.
For example, data from the name column in the passwd.org_dir NIS+ table (such as the user name of an account)
corresponds to the LDAP uid attribute of the posixAccount object class in the ou=People container.
The configuration can establish a mapping between the name
column and the uid attribute. You can also say that the name column is mapped to the uid attribute (or
vice versa).
-
Principal
A principal is an entity in NIS+ (user or machine) that can be authenticated.
Usually, there is a one-to–one correspondence between netnames and principal
names.
Configuration Files
Two configuration files control rpc.nisd
operation.
-
/etc/default/rpc.nisd
This file contains information regarding the LDAP server and authentication,
the NIS+ base domain, the LDAP default search base, exception processing,
and general rpc.nisd configuration, which applies whether
or not LDAP mapping is in effect.
-
/var/nis/NIS+LDAPmapping
This file contains information on mapping of NIS+ data to and from
LDAP. The template file (/var/nis/NIS+LDAPmapping.template)
covers all standard NIS+ objects, except client_info.org_dir
and timezone.org_dir. See client_info and timezone Tables
and NIS+LDAPmapping(4).
Configuration is done by assigning values to pre-defined attributes.
In addition to the configuration files, the configuration attributes can also
be read from LDAP (see Storing Configuration Information in LDAP) or can be specified
on the rpc.nisd command line by way of the -x option. If the same attribute is specified in more than one place,
the priority order is (from higher to lower) as follows.
-
rpc.nisd -x option
-
Configuration file
-
LDAP
Creating Attributes and Object Classes
Depending on how you configure the NIS+/LDAP mapping, you might need
to create a number of new LDAP attributes and object classes. The examples
show how to do this by specifying LDIF data that can be used as input to the ldapadd command. Create a file containing the LDIF data, and then
invoke ldapadd(1).
# ldapadd -D bind-DN—f ldif
-file
This method works with the iPlanetTM
Directory Server 5.1 , and might work with other LDAP servers as well.
Note –
Except for the defaultSearchBase, preferredServerList, and authenticationMethod
attributes, as well as the SYNTAX specifications, the object identifiers (OIDs)
used in this chapter are intended for illustration only. As no official OIDs
have been assigned, you are free to use any suitable OIDs.
Getting Started
For an introduction to the configuration needed to start using an LDAP
repository for NIS+ data, see NIS+LDAPmapping(4). The remainder of this section
goes into more detail about the organization of the configuration files.
/etc/default/rpc.nisd
All assignments in the /etc/default/rpc.nisd file
are of the attributeName=value type.
General Configuration
The following attributes control general configuration of the rpc.nisd, and are active whether or not LDAP mapping is in effect.
They should generally be left at their default values. See rpc.nisd(4) for more information.
-
nisplusNumberOfServiceThreads
-
nisplusThreadCreationErrorAction
-
nisplusThreadCreationErrorAttempts
-
nisplusThreadCreationErrorTimeout
-
nisplusDumpErrorAction
-
nisplusDumpErrorAttempts
-
nisplusDumpErrorTimeout
-
nisplusResyncService
-
nisplusUpdateBatching
-
nisplusUpdateBatchingTimeout
Configuration Data From LDAP
The following attributes control the reading of other configuration
attributes from LDAP. These attributes cannot themselves reside in LDAP. They
are read only from the command line or the configuration file. See rpc.nisd(4)
for more information.
-
nisplusLDAPconfigDN
-
nisplusLDAPconfigPreferredServerList
-
nisplusLDAPconfigAuthenticationMethod
-
nisplusLDAPconfigTLS
-
nisplusLDAPconfigTLSCertificateDBPath
-
nisplusLDAPconfigProxyUser
-
nisplusLDAPconfigProxyPassword
Server Selection
Authentication and Security
-
authenticationMethod
-
nisplusLDAPproxyUser
-
nisplusLDAPproxyPassword
The authentication method and, if appropriate for the method selected,
the proxy user (bind distinguished name [DN]) and password (key or other shared
secret) to be used between the rpc.nisd daemon and the
LDAP server. See Security and Authentication for more information.
Optionally use SSL, and specify the location of the certificate
file. See
Using SSL for more information.
Default Location in LDAP and NIS+
-
defaultSearchBase
The point in the LDAP DIT where the containers for RFC 2307- style naming
services data live. This is the default used when individual container DNs
do not specify a full search base. See nisplusLDAPobjectDN for
more information.
-
nisplusLDAPbaseDomain
The default NIS+ domain name to use when NIS+ object specifications
(see nisplusLDAPdatabaseIdMapping) are not fully qualified.
Timeout/Size Limits and Referral Action for LDAP Communication
-
nisplusLDAPbindTimeout
-
nisplusLDAPmodifyTimeout
-
nisplusLDAPaddTimeout
-
nisplusLDAPdeleteTimeout
The above parameters are timeouts for the ldap bind, modify, add, and delete operations, respectively. They should generally be left at
their default values.
The above parameters set the timeout for the LDAP search operation,
and request a server-side search time limit, respectively. Since the nisplusLDAPsearchTimeLimit will control how much time the LDAP server
spends on the search request, make sure that nisplusLDAPsearchTimeLimit is not smaller than nisplusLDAPsearchTimeout.
Depending on the performance of the NIS+ server, the LDAP server, and the
connection between them, you might have to increase the search limits from
the default values. Watch for timeout syslog messages from rpc.nisd as a clue to making these values larger.
-
nisplusLDAPsearchSizeLimit
The above parameter requests a limit on the amount of LDAP data returned
for an LDAP search request. The default is to ask for no limitation. This
is a server side limit. The LDAP server might impose restrictions on the maximum,
and these restrictions might be tied to the proxy user (bind DN) used. Make
sure that the LDAP server allows the rpc.nisd to transfer
enough data to account for the largest container (depending on the site, often
the container used for passwd.org_dir, mail_aliases.org_dir, or netgroup.org_dir). Consult your LDAP
server documentation for more information.
-
nisplusLDAPfollowReferral
The above parameter defines the action to be taken when an LDAP operation
results in a referral to another LDAP server. The default is to not follow referrals. Enable follow referrals if you want or need
referrals to be honored. Keep in mind that while referrals are convenient,
they can also slow down operations by making the rpc.nisd
talk to multiple LDAP servers for each request. The rpc.nisd
should generally be pointed directly to an LDAP server that can handle all
LDAP requests that the rpc.nisd might make.
Error Actions
The following parameters define the actions to take when an error occurs
during an LDAP operation. You should generally leave these at their defaults.
See rpc.nisd(4)
for more information.
-
nisplusLDAPinitialUpdateAction
-
nisplusLDAPinitialUpdateOnly
-
nisplusLDAPretrieveErrorAction
-
nisplusLDAPretrieveErrorAttempts
-
nisplusLDAPretrieveErrorTimeout
-
nisplusLDAPstoreErrorAction
-
nisplusLDAPstoreErrorAttempts
-
nisplusLDAPstoreErrorTimeout
-
nisplusLDAPrefreshErrorAction
-
nisplusLDAPrefreshErrorAttempts
-
nisplusLDAPrefreshErrorTimeout
General LDAP Operation Control
-
nisplusLDAPmatchFetchAction
The above parameter determines whether or not LDAP data should be pre-fetched
for NIS+ match operations. In most cases, leave this value at the default.
See rpc.nisd(4)
for more information.
/var/nis/NIS+LDAPmapping
The name of the above configuration can be changed via the -m option of rpc.nisd(1M). The presence of the NIS+LDAPmapping file serves as a master switch for NIS+/LDAP mapping.
If you use a name other than the default for the mapping file, you will
have to edit the /etc/init.d/rpc boot script to specify
the mapping file name on the rpc.nisd startup line.
For each NIS+ object that should be mapped to and/or from LDAP, the NIS+LDAPmapping file specifies two to five attributes, depending
on the object and whether or not the default values are sufficient.
nisplusLDAPdatabaseIdMapping
You must establish an alias to be used in the other mapping attributes.
If the NIS+ object name is not fully qualified (does not end in a dot), the
value of the nisplusLDAPbaseDomain is appended.
For example,
nisplusLDAPdatabaseIdMapping rpc:rpc.org_dir
|
defines the database id rpc as an alias for the NIS+ rpc.org_dir table.
Note that NIS+ table objects might appear twice with two different database
ids, once for the table object itself (if the object should be mapped to LDAP),
and once for the table entries. For example,
nisplusLDAPdatabaseIdMapping rpc_table:rpc.org_dir
nisplusLDAPdatabaseIdMapping rpc:rpc.org_dir
|
defines the database ids rpc_table and rpc as aliases for the rpc.org_dir table. Later
definitions will make it clear that rpc_table is used for
the rpc.org_dir table object, and rpc
for the entries in that table.
nisplusLDAPentryTtl
Since the rpc.nisd daemon's local database (in
memory and on disk) functions as a cache for LDAP data, the nisplusLDAPentryTtl attribute allows you to set the time-to-live (TTL) values of entries
in that cache. There are three TTLs for each database ID. The first two control
the initial TTL when the rpc.nisd first loads the corresponding
NIS+ object data from disk, and the third TTL is assigned to an object when
it is read or refreshed from LDAP.
For example the following results in the rpc.org_dir
table object getting an initial TTL randomly selected in the range 21600 to
43200 seconds.
nisplusLDAPentryTtl rpc_table:21600:43200:43200
|
When that initial TTL expires and the table object is refreshed from
LDAP, the TTL will be set to 43200 seconds.
Similarly the following will assign an initial TTL between 1800 and
3600 seconds to the entries in the rpc.org_dir table when
it is first loaded.
nisplusLDAPentryTtl rpc:1800:3600:3600
|
Each entry gets its own randomly selected TTL in the range specified.
When a table entry expires and is refreshed, the TTL is set to 3600 seconds.
When selecting TTL values, consider the trade-off between performance
and consistency. If the TTLs used for LDAP data cached by the rpc.nisd are very long, performance is the same as if rpc.nisd was not mapping data from LDAP at all. However, if the LDAP data
is changed (by some entity other than rpc.nisd), it can
also take a very long time before that change is visible in NIS+.
Conversely, selecting a very short (or even zero) TTL means that changes
to LDAP data are quickly visible in NIS+, but can also impose a significant
performance penalty. Typically, an NIS+ operation that also reads data from
or writes data to LDAP will take at least two to three times longer (plus
the LDAP lookup overhead) than the same operation without LDAP communication.
Although performance can vary greatly depending on the hardware resources,
scanning a large (tens of thousands or hundreds of thousands of entries) LDAP
container to identify NIS+ entries that should be refreshed can take a long
time. The rpc.nisd daemon performs this scan in the background,
continuing to serve possibly stale data while it is running, but the background
scan still consumes CPU and memory on the NIS+ server.
Carefully consider how critical it is to have NIS+ data in close synchronization
with LDAP, and select the longest TTL that is acceptable for each NIS+ object.
The default (when no nisplusLDAPentryTtl is specified)
is 1 hour. The template mapping file /var/nis/NIS+LDAPmapping.template changes this to 12 hours for objects other than table entries.
However, there is no auto-recognition of non-entry objects, so if you add
mapping for a non-entry object, the TTL will default to 1 hour.
Note –
There are no TTLs for nonexistent objects. Hence, no matter which
TTLs are in effect for LDAP-mapped entries in an NIS+ table, a request for
an entry that does not exist in NIS+ will query LDAP for that entry.
nisplusLDAPobjectDN
For each mapped NIS+ object, nisplusLDAPobjectDN
establishes the location in the LDAP DIT where the object data resides. It
also allows specification of the action to take when an LDAP entry is deleted.
Each nisplusLDAPobjectDN value has three parts. The first
specifies where LDAP data is read from, the second to where it is written,
and the third what should happen when LDAP data is deleted. Refer to the following
example.
nisplusLDAPobjectDN rpc_table:\
cn=rpc,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer:\
cn=rpc,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer,\
objectClass=top
|
The above example shows that the rpc.org_dir table
object should be read from the DN cn=rpc,ou=nisPlus, (since
the value ends in a comma, the value of the defaultSearchBase
attribute is appended), with scope base, and that entries
with a value of nisplusObjectContainer for the ObjectClass attribute are selected.
The table object is written to the same place. The delete specification
is missing, which implies the default action, which is as follows. If the
NIS+ table object is deleted, the entire LDAP entry should also be deleted.
If data should be read from, but not written to LDAP, omit the write
portion (and the colon separating it from the read part).
nisplusLDAPobjectDN rpc_table:\
cn=rpc,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer
|
Note that the nisplusObjectContainer object class
is not part of RFC 2307. In order to use it, you must configure your LDAP
server as detailed in Mapping NIS+ Objects Other Than Table Entries.
For the rpc.org_dir table entries, you could use
the following example.
nisplusLDAPobjectDN rpc:ou=Rpc,?one?objectClass=oncRpc:\
ou=Rpc,?one?objectClass=onRpc,objectClass=top
|
The above shows that the table entries are read from and written to
the base ou=Rpc. Again, the trailing comma appends the defaultSearchBase value. Select entries that have an objectClass attribute value of oncRpc. When creating an
entry in the ou=Rpc container in LDAP, you also must specify top as an objectClass value.
As an example showing a non-default delete specification, consider the
following.
nisplusLDAPobjectDN user_attr:\
ou=People,?one?objectClass=SolarisUserAttr,\
solarisAttrKeyValue=*:\
ou=People,?one?objectClass=SolarisUserAttr:\
dbid=user_attr_del
|
The user_attr.org_dir data resides in the ou=People LDAP container, which it shares with account information
from other sources, such as the passwd.org_dir NIS+ table.
Select entries in that container that have the solarisAttrKeyValue attribute, since only those contain user_attr.org_dir data. The dbid=user_attr_del portion of the nisplusLDAPobjectDN shows that when an entry in the user_attr.org_dir NIS+ table entry is deleted, deletion of the corresponding LDAP
entry (if any) should follow the rules in the rule set identified by the user_attr_del database ID. See nisplusLDAPcolumnFromAttribute
for more information.
nisplusLDAPattributeFromColumn
nisplusLDAPattributeFromColumn specifies the rules
used to map NIS+ data to LDAP. Mapping rules for the other direction is controlled
by nisplusLDAPcolumnFromAttribute.
nisplusLDAPcolumnFromAttribute
nisplusLDAPcolumnFromAttribute specifies the rules
used to map LDAP data to NIS+.
The full entry mapping syntax can be found on NIS+LDAPmapping(4).
However, a few examples should make things clearer.
The NIS+ rpc.org_dir table contains four columns
called cname, name, numbe,
and comment. Therefore, the entries for the NIS+ RPC program
number (100300) with the canonical name nisd and the aliases rpc.nisd and nisplusd could be represented by
the following NIS+ entries in rpc.org_dir.
nisd nisd 100300 NIS+ server
nisd rpc.nisd 100300 NIS+ server
nisd nisplusd 100300 NIS+ server
|
Assuming the defaultSearchBase value is dc=some,dc=domain, the corresponding LDAP entry, as listed by ldapsearch(1),
would be the following.
cn=nisd,ou=Ppc,dc=some,dc=domain
cn=nisd
cn=rpc.nsid
cn=nisplusd
oncrocnumber=100300
description=NIS+ server
objectclass=oncRpc
objectclass=top
|
This makes for a simple one-to-one mapping between NIS+ and LDAP data,
and the corresponding mapping attribute value going from NIS+ to LDAP is the
following.
nisplusLDAPattributeFromColumn \
rpc: dn=("cn=%s,", name), \
cn=cname, \
cn=name, \
oncRpcNumber=number, \
description=comment
|
This constructs the DN for the entry to be cn=%s,
with the value of the cname column substituted for %s.
Since the value ends in a comma, the read base value from the nisplusObjectDN is appended, and you have the following.
cn=nisd,ou=Rpc,dc=some,dc=domain
|
The oncRpcNumber and description
attribute values are just simple assignments of the corresponding NIS+ column
values. The rpc.nisd will collect the multiple NIS+ entries
into one LDAP entry, with multiple cn values to represent
the different name column values.
Similarly, the mapping from LDAP to NIS+ would be as follows.
nisplusLDAPcolumnFromAttribute \
rpc: cname=cn, \
(name)=(cn), \
number=oncRpcNumber, \
comment=description
|
The above assigns the oncRpcNumber and description values to the corresponding NIS+ columns. The multi-valued cn (denoted by (cn) is mapped to multiple name column values (denoted by (name)). Since
the name column cannot be multi-valued, the rpc.nisd creates one NIS+ entry for each cn value.
Finally, the nisplusLDAPattributeFromColumn value
is an example of rule sets used for deletion.
nisplusLDAPattributeFromColumn \
user_attr_del: dn=("uid=%s,", name), \
SolarisUserQualifier=, \
SolarisAttrReserved1=, \
SolarisAttrReserved2=, \
SolarisAttrKeyValue=
|
Again, the user_attr.org_dir data shares the ou=People container with other account information (from the passwd.org_dir and other tables). If an entry in the user_attr.org_dir table is deleted, you probably do not want to delete the entire ou=People entry. Instead, the delete entry above says that when
a user_attr.org_dir entry is deleted, the SolarisUserQualifier, SolarisAttrReserved1, SolarisAttrReserved2, and SolarisAttrKeyValue attributes (if any)
are deleted from the ou=People entry specified by the following
rule.
The rest of the LDAP entry is left unchanged.
NIS+ to LDAP Migration Scenarios
Likely scenarios for a migration from NIS+ to LDAP include the following.
-
Convert all NIS+ clients to LDAP in one operation. You can use the rpc.nisd daemon to upload any
NIS+ data that does not yet exist in LDAP. See How to Convert All NIS+ Data to LDAP in One Operation.
-
Do a gradual migration from NIS+ to LDAP.
Start by converting NIS+ data to LDAP (see How to Convert All NIS+ Data to LDAP in One Operation).
You could have both NIS+ and LDAP clients sharing the same naming service
data, and let the rpc.nisd automatically keep NIS+ and
LDAP data synchronized. Initially, perhaps, NIS+ would be authoritative, and
the LDAP server(s) would maintain a duplicate of the NIS+ data for the benefit
of LDAP clients. At a convenient time, LDAP can become the authoritative naming
service, and NIS+ service gradually phased out, until there are no more NIS+
clients.
-
LDAP is already used as a naming service, so you need to merge
the NIS+ and LDAP data. There are three possible ways to perform this merge.
How to Convert All NIS+ Data to LDAP in One Operation
-
Use the rpc.nisd to upload any NIS+ data that does
not yet exist in LDAP.
Assuming all NIS+/LDAP data mappings have been established in the default
location (/var/nis/NIS+LDAPmapping), use the following
command.
# /usr/sbin/rpc.nisd -D \
—x nisplusLDAPinitialUpdateAction=to_ldap \
-x nisplusLDAPinitialUpdateOnly=yes
The above would make the rpc.nisd upload data to
LDAP, and then exit. The NIS+ data would be unaffected by this operation.
See the nisplusLDAPinitialUpdateAction attribute
on rpc.nisd(4).
How to Convert All LDAP Data to NIS+ in One Operation
-
Use the rpc.nisd to download all LDAP data to NIS+,
overwriting existing NIS+ data.
Assuming all NIS+/LDAP data mappings have been established in the default
location (/var/nis/NIS+LDAPmapping), use the following
command.
# /usr/sbin/rpc.nisd -D \
-x nisplusLDAPinitialUpdateAction=from_ldap \
-x nisplusLDAPinitialUpdateOnly=yes
The above would make the rpc.nisd daemon download
data from LDAP, and then exit. The LDAP data would be unaffected by this operation.
See the nisplusLDAPinitialUpdateAction attribute
on rpc.nisd(4).
Merging NIS+ and LDAP Data
NIS+ to LDAP Migration Scenarios showed how to synchronize NIS+ and
LDAP data when data conflicts between the two should be resolved by letting
either the NIS+ or the LDAP data be authoritative. Merging data requires a
more complicated procedure.
The example procedure in this section assumes the following.
-
You are putting a backup of the NIS+ data in the /nisbackup directory.
-
Valid mapping configuration already exists in /etc/default/rpc.nisd and /var/nis/tmpmap (for tables that should
be merged).
-
Flat file representations of the NIS+ data before the merge
are stored in /before, and after-merge representations
in /after.
-
niscat is used to dump flat file representations
of custom NIS+ tables not supported by nisaddent(1M). You might have your own commands or
scripts for dumping and loading such custom tables from and to NIS+. If so,
those commands/scripts should be used in preference to niscat
since the latter has no convenient counterpart to load data back into NIS+.
If you are forced to dump data using niscat(1), you can use nistbladm(1) to load entries
back into NIS+ one by one.
-
Your command path includes /usr/lib/nis
(which is where nisaddent(1M)
resides).
How to merge NIS+ and LDAP data

Caution –
If the LDAP data should change between the download in Step
4 and the upload in Step 10, the upload might overwrite those changes. For
this reason, you should try to prevent modifications to the LDAP data during
this procedure. Consult your LDAP server documentation for more information.
-
Back up all NIS+ data using the nisbackup command.
# nisbackup -a /nisbackup
-
Identify the NIS+ tables that have data which must be merged with LDAP.
Dump the contents of these tables to flat files. For example, dump the contents
of group.org_dirusing nisaddent as follows.
# nisaddent -d group | sort > /before/group
Piping the nisaddent output to sort
will make for convenient comparison later on.
-
Stop the rpc.nisd daemon.
# pkill rpc.nisd
-
Download LDAP data to NIS+.
# /usr/sbin/rpc.nisd -D -m tmpmap \
-x nisplusLDAPinitialUpdateAction=from_ldap \
-x nisplusLDAPinitialUpdateOnly=yes
-
Start the rpc.nisd daemon.
# /usr/sbin/rpc.nisd
The rpc.nisd daemon will now be serving the data
downloaded from LDAP. If the conflicts to be resolved are such that NIS+ clients
should not be exposed to them, make sure to perform this and the following
steps when there are few (preferably no) active NIS+ clients.
-
Dump the NIS+ data for the affected tables.
The following example uses the group.org_dir table.
# nisaddent -d group | sort > /after/group
-
Use your favorite file merge procedure to produce merged versions of
the tables. If no other tools are available, you can use diff(1) to collect differences between
the /before and /after files, and merge
manually with a text editor.
The following example assumes that the merged results are available
in /after.
-
Load the merged data into NIS+. The following example uses the group table.
# nisaddent -m -f /after/group group
-
Remove LDAP entries that should not exist after the merge.
A. If there are LDAP entries that do not exist in the (now merged) NIS+
data, and that should not exist in LDAP after the upload, you must remove
those LDAP entries.
Your LDAP server might provide a convenient method for removing multiple
entries, such as a way to delete all entries in a container. If this is not
the case, you can use ldapsearch(1) to generate a list of entries for each
container. For example, to generate a list of all entries in the ou=Rpc container, use ldapsearch(1) as follows.
# 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
See Performance and Indexing for an explanation of the meta-arguments
(server-address, bind-DN,
for example).
B. You can now edit the result file (/tmp/delete-dn)
to specify only those entries that should be removed. Alternatively, in order
to remove all entries in the container, use the file as is, and rely on the
NIS+ upload to restore the LDAP data. Either way, you should backup the LDAP
data before performing the ldapdelete operation below.
C. Use ldapdelete to remove LDAP entries, redirecting stdout (which usually is one blank line for each entry removed)
to /dev/null.
# ldapdelete —h server-address —D bind-DN —w password \
/tmp/delete-dn /dev/null
D. Repeat the above procedure for each container that has at least one
entry which must be removed.
-
NIS+ now contains the merged data, which can be uploaded to LDAP. Do
the following.
Stop the rpc.nisd daemon.
# pkill rpc.nisd
Perform the upload.
# /usr/sbin/rpc.nisd -D -m tmpmap \
-x nisplusLDAPinitialUpdateAction=to_ldap \
-x nisplusLDAPinitialUpdateOnly=yes
-
Restart the rpc.nisd daemon.
-
If the rpc.nisd daemon uses the LDAP
repository, specify an appropriate mapping file.
-
If the rpc.nisd daemon provides NIS
(YP) emulation, specify the -Y option.
# /usr/sbin/rpc.nisd -m mappingfile
[ -Y ]
Alternatively, omit -x nisplusLDAPinitialUpdateOnly=yes
from the upload command in Step 10. This will make the rpc.nisd
daemon start serving NIS+ data when the upload is done.
Masters and Replicas
Only NIS+ masters are allowed to write data
to LDAP. NIS+ replicas can obtain updates either from the NIS+ master (which
might or might not have obtained it from LDAP), or they can read data directly
from an LDAP server. A combination of the two is also possible. Therefore,
there are two principal ways to arrange for NIS+ replication.
-
Leave NIS+ replicas unchanged, and let them obtain
their data updates from the NIS+ master.
This arrangement has the advantage of configurational simplicity (only
the NIS+ master need have a connection to an LDAP server), and also maintains
the old replication relationship (master knows about new data first, replicas
later). It is probably the most convenient solution while NIS+ remains authoritative
for naming service data. However, it also lengthens the path between LDAP
and NIS+ replica servers.
-
Let NIS+ replicas obtain their data directly from
LDAP instead of from the NIS+ master.
In this case, replicas could have updated data before or after the
NIS+ master, depending on lookup traffic and TTLs for data derived from LDAP.
This arrangement is more complicated, but can be convenient when LDAP is the
authoritative naming services repository, and few or no updates are made directly
to NIS+ data.
Replication Timestamps
When an NIS+ replica is obtaining data for at least one object in a
particular NIS+ directory from LDAP, the update timestamps printed by nisping(1M)
do not necessarily indicate the degree of data consistency between the NIS+
master and the replica. For example, assume that the NIS+ directory dir1 contains the tables table1 and table2. When the replica is obtaining data for both table1 and table2 from the NIS+ master, you might see
an output like the following.
# 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
|
The above indicates that the master and replica have exactly the same
data. However, if the replica is getting data for either or both of table1 and table2 from LDAP, the output only
shows that the replica has received an NIS_PING from the master, and updated
its resynchronization time stamp for housekeeping purposes. The data in the
table or tables mapped from LDAP might differ from that on the NIS+ master
if either of the following are true.
-
The LDAP data differs from that on the NIS+ master.
-
The replica has data in its cache (its local version of the
NIS+ database) that has not expired, but that is not up to date with LDAP.
If you cannot accept this type of data inconsistency, let all NIS+ replicas
obtain their data from the NIS+ master only. Once you have configured the
NIS+ master to get data from LDAP, you do not need to make modifications to
the replicas.
The Directory Server
The LDAP mapping portion of the rpc.nisd daemon uses LDAP protocol
version 3 to talk to the LDAP server. The default mapping configuration (/var/nis/NIS+LDAPmapping.template) expects that the LDAP server
supports an extended version of RFC 2307. RFCs can be retrieved from http://www.ietf.org/rfc.html. While the mapping between NIS+ and
LDAP data can be modified using NIS+LDAPmapping(4), there is a basic assumption
that the LDAP data is organized along the principles laid out in RFC 2307.
For example, in order to share account information between direct LDAP
clients and NIS+ clients, the LDAP server must support storing account (user)
passwords in the UNIX crypt format. If the LDAP server
cannot be configured to do so, you can still store NIS+ data, including accounts,
in LDAP. However, you will not be able to fully share account information
between NIS+ users and LDAP bindDNs.
Configuring the iPlanet Directory Server 5.1
Refer to the iPlanetTM Directory Server 5.1 Collection
for detailed instructions on the installation, setup and administration of
the iPlanet Directory Server 5.1.
You can use idsconfig(1M) to configure the iPlanet Directory Server
version 5.1 for LDAP clients using LDAP as a naming service. The setup provided
by idsconfig(1M)
is also appropriate when using NIS+ with an LDAP data repository.
Note –
If you are using an LDAP server other than iPlanet Directory
Server 5.1, you must manually configure the server to support the RFC 2307
schemas.
For more information on idsconfig, refer to System Administration Guide:
Naming and Directory Services (DNS, NIS, and LDAP).
Assigning Server Address and Port Number
The /etc/default/rpc.nisd file is set up to use
a local LDAP server at port 389. If this is not correct
in your configuration, establish a new value for the preferredServerList attribute. For example, to use an LDAP server at IP address 192.0.0.1 and port 65535, you specify the following.
preferredServerList=192.0.0.1:65535
|
Security and Authentication
Authentication between NIS+ clients and the NIS+ server is not affected
when the NIS+ server is obtaining data from LDAP. However, in order to maintain
the integrity of the NIS+ data when it is stored in LDAP, consider configuring
authentication between the rpc.nisd daemon and the LDAP
server. Several different types of authentication are available, depending
on the capabilities of the LDAP server.
The LDAP authentication supported by the rpc.nisd
daemon includes the following.
-
none
The none authentication method is the default. While
using none requires no setup, it also provides no security.
It is only suitable for use in environments that have no security requirements
at all.
To use the none authentication, make sure that the authenticationMethod attribute has the following value.
authenticationMethod=none
|
The authentication methods that actually provide at least some security
typically require that you associate a shared secret (a password or key) with
a DN in LDAP. The DN you select for use by the rpc.nisd
daemon can be unique, or can also be used for other purposes. It should have
appropriate capabilities to support the expected LDAP traffic. For example,
if the rpc.nisd daemon should be able to write data to
LDAP, the selected DN must have the right to add/update/delete LDAP data in
the containers used for the NIS+ data. Also, the LDAP server might, by default,
impose limitations on resource usage (such as search time limits or search
result size limitations). If this is the case, the selected DN must have sufficient
capabilities to support enumeration of the NIS+ data containers.
-
simple
The simple authentication method provides authentication
by unencrypted exchange of a password string. Since the password is sent in
the clear between the LDAP client (the rpc.nisd daemon)
and LDAP server, the simple method is suitable only when
information exchange between the NIS+ and LDAP servers is protected by some
other method.
For instance, transport layer encryption of LDAP traffic, or the special
case where the NIS+ and LDAP server is one and the same system, and the NIS+/LDAP
traffic stays in the kernel, protected from the eyes of unauthorized users.
Modify the configuration of the rpc.nisd daemon with
the DN and password to use for the simple authentication.
For example, if the DN is cn=nisplusAdmin,ou=People,dc=some,dc=domain, and the password aword, establish the following.
authenticationMethod=simple
nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain
nisplusLDAPproxyPassword=aword
|
Be sure to protect the place where the password is stored from unauthorized
access. Remember that if the password is specified on the rpc.nisd command line, it might be visible to any user on the system via
commands such as ps(1).
-
sasl/digest-md5
The sasl/digest-md5 authentication method provides
authentication using the digest/md5 algorithm.
Consult your LDAP server documentation for information on how to set
up an authorization identity for use with digest-md5, and
modify the /etc/default/rpc.nisd file to specify this
identity and its associated password.
authenticationMethod=sasl/digest-md5
nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain
nisplusLDAPproxyPassword=aword
|
Be sure to protect the file where the password is stored from unauthorized
access.
-
sasl/cram-md5
Authentication using the cram/md5 algorithm. Probably
only supported by the obsolete SunDS LDAP server.
Consult your LDAP server documentation for information on how to set
up a bind DN for use with cram-md5, and modify the /etc/default/rpc.nisd file to specify this DN and its associated
password.
authenticationMethod=sasl/cram-md5
nisplusLDAPproxyUser=cn=nisplusAdmin,ou=People,dc=some,dc=domain
nisplusLDAPproxyPassword=aword
|
Be sure to protect the file where the password is stored from unauthorized
access.
Using SSL
The rpc.nisd daemon also supports transport layer
encryption of LDAP traffic using SSL. Consult your LDAP server documentation
to generate an SSL certificate for LDAP server authentication. Store the certificate
in a file on the NIS+ server (/var/nis/cert7.db, for
example) and modify /etc/default/rpc.nisd as follows.
nisplusLDAPTLS=ssl
nisplusLDAPTLSCertificateDBPath=/var/nis/cert7.db
|
Be sure to protect the certificate file from unauthorized access. Note
that the above provides session encryption and authentication of the LDAP
server to the rpc.nisd. It does not provide authentication
of the rpc.nisd to the LDAP server, since the certificate
does not contain anything that identifies the LDAP client (rpc.nisd). However, you can combine SSL with another authentication method
(simple, sasl/digest-md5) in order to
achieve mutual authentication.
For more information regarding LDAP security issues, refer to System Administration Guide:
Naming and Directory Services (DNS, NIS, and LDAP).
Performance and Indexing
When the rpc.nisd daemon is asked to enumerate an
NIS+ table (using niscat(1)
for example) that is mapped from LDAP, it will enumerate the corresponding
LDAP container if at least one entry in the table has an expired TTL. Although
this container enumeration is done in the background, so that LDAP performance
is of limited importance, it can nevertheless be beneficial to establish LDAP
indices to speed up container enumeration for large containers.
To obtain an estimate of the amount of time required for enumeration
of a particular container, you can use a command like the following.
% /bin/time ldapsearch -h server-address
-D bind-DN -w password
\
-b container, search-base
'cn=*' /dev/null
where
-
server-address
IP address portion of preferredServerList value from /etc/default/rpc.nisd
-
bind-DN
nisplusLDAPproxyUser value from /etc/default/rpc.nisd
-
password
nisplusLDAPproxyPassword value from /etc/default/rpc.nisd
-
container
One of the RFC 2307 container names (ou=Services, ou=Rpc, and so on.)
-
search-base
defaultSearchBase value from /etc/default/rpc.nisd
The "real" value printed by /bin/time is the elapsed
(wall-clock) time. If this value exceeds a significant fraction (25 percent
or more) of the TTL for the corresponding table entries (see Authentication and Security),
it might be beneficial to index the LDAP container.
The rpc.nisd supports the simple page
and VLV indexing methods. Refer to your LDAP server documentation to find
out which indexing methods it supports, and how to create such indices.
Mapping NIS+ Objects Other Than Table Entries
You can store NIS+ objects other than table entries in LDAP. However,
doing so has no particular value unless you also have NIS+ replicas that obtain
those NIS+ objects from LDAP. The recommended choices are the following.
-
There are no replicas, or the replicas obtain their
data from the NIS+ master only.
Edit the mapping configuration file (see NIS+LDAPmapping(4))
to remove the following attribute values for all non-table-entry objects.
nisplusLDAPdatabaseIdMapping
nisplusLDAPentryTtl
nisplusLDAPobjectDN
|
For example, if you started out from the /var/nis/NIS+LDAPmapping.template file, the sections you need to remove (or disable by commenting)
are as follows.
# Standard NIS+ directories
nisplusLDAPdatabaseIdMapping basedir:
.
.
.
|
nisplusLDAPdatabaseIdMapping user_attr_table:user_attr.org_dir
|
nisplusLDAPdatabaseIdMapping audit_user_table:audit_user.org_dir
# Standard NIS+ directories
nisplusLDAPentryTtl basedir:21600:43200:43200
.
.
.
|
nisplusLDAPentryTtl user_attr_table:21600:43200:43200
nisplusLDAPentryTtl audit_user_table:21600:43200:43200
# Standard NIS+ directories
nisplusLDAPobjectDN basedir:cn=basedir,ou=nisPlus,?base?\
|
objectClass=nisplusObjectContainer:\
cn=basedir,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer,\
objectClass=top
.
.
.
|
nisplusLDAPobjectDN audit_user_table:cn=audit_user,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer:\
cn=audit_user,ou=nisPlus,?base?\
objectClass=nisplusObjectContainer,\
objectClass=top
|
-
NIS+ replicas obtain their data from LDAP server.
Create the nisplusObject attribute and nisplusObjectContainer object class as shown in the following example
(LDIF data is suitable for ldapadd(1). Attribute and object class OIDs are
for illustration only.)
dn: cn=schema
changetype: modify
add: attributetypes
attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.1.0 NAME 'nisplusObject' \
DESC 'An opaque representation of an NIS+ object' \
SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE )
|
dn: cn=schema
changetype: modify
add: objectclasses
|
objectclasses(1.3.6.1.4.1.42.2.27.5.42.42.2.0 NAME'nisplusObjectContainer'\
|
SUP top STRUCTURAL DESC 'Abstraction of an NIS+ object
MUST ( cn $ nisplusObject ) )
|
You also need to create a container for the NIS+ objects. The following
LDIF syntax shows how to create the ou=nisPlus,dc=some,dc=domain container, and can be used as input to ldapadd(1).
dn: ou=nisPlus,dc=some,dc=domain
ou: nisPlus
objectClass: top
objectClass: organizationalUnit
|
NIS+ Entry Owner, Group, Access, and TTL
When NIS+ table entries are created from LDAP data, the default behavior
is to initialize the entry object owner, group, access rights, and TTL using
the corresponding values from the table object in which the entry object lives.
This is normally sufficient, but there might be cases where these NIS+ entry
attributes must be established individually. An example of this would be a
site that did not use the rpc.nispasswdd(1M) daemon. In order to allow
individual users to change their NIS+ passwords (and re-encrypt their Diffie-Hellman
keys stored in the cred.org_dir table), passwd.org_dir and cred.org_dir entries for the user should
be owned by the user, and have modify rights for the entry owner.
If you need to store table entry owner, group, access, or TTL in LDAP
for one or more NIS+ tables, you need to do the following.
How to Store Additional Entry Attributes in LDAP
-
Consult your LDAP server documentation, and create the following new
attributes and object class. (LDIF data is suitable for ldapadd.
Attribute and object class OIDs are for illustration only.)
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 ) )
|
-
Modify the nisplusLDAPobjectDN attribute value for
the relevant table(s) so that the write portion includes the newly created nisplusEntryData object class.
For example, for the passwd.org_dir table, assuming
that you are using a mapping file based on /var/nis/NIS+LDAPmapping.template, edit as follows.
nisplusLDAPobjectDN passwd:ou=People,?one?objectClass=shadowAccount,\
objectClass=posixAccount:\
ou=People,?one?objectClass=shadowAccount,\
objectClass=posixAccount,\
objectClass=account,objectClass=top
|
Edit the attribute value as follows.
nisplusLDAPobjectDN passwd:ou=People,?one?objectClass=shadowAccount,\
objectClass=posixAccount:\
ou=People,?one?objectClass=shadowAccount,\
objectClass=posixAccount,\
objectClass=nisplusEntryData,\
objectClass=account,objectClass=top
|
-
Edit the nisplusLDAPattributeFromColumn and nisplusLDAPcolumnFromAttribute attribute values to specify any desired
subset of owner, group, access, or TTL.
In Step 2, you created the LDAP attributes used to store these values.
For NIS+, there are predefined pseudo-column names called zo_owner, zo_group, zo_access, and zo_ttl, respectively. For example, in order to store owner, group,
and access for passwd.org_dir entries in LDAP, modify the nisplusLDAPattributeFromColumn value from the following.
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, ":")
|
Edit to read as follows.
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
|
Similarly, to set NIS+ entry owner, group, and access from LDAP data
for the passwd.org_dir table, modify the following.
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)
|
Edit to read as follows.
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
|
-
Restart the rpc.nisd daemon in order to make the
mapping change take effect.
First, however, you probably want to upload owner, group, access, and/or
TTL entry data to LDAP. Perform an upload as shown in How to Convert All NIS+ Data to LDAP in One Operation.
Principal Names and Netnames
NIS+ authentication relies on principal
names (a user or host name, qualified by the domain name) and netnames (the
secure RPC equivalent of principal names) to uniquely identify an entity (principal)
that can be authenticated. While RFC 2307 provides for storing the Diffie-Hellman
keys used for NIS+ authentication, there is no specified place for the principal
names or netnames.
The /var/nis/NIS+LDAPmapping.template file works
around this problem by deriving the domain portion of principal and netnames
from the owner name (itself a principal name) of the cred.org_dir table. Hence, if the NIS+ domain is x.y.z.,
and the owner of the cred.org_dir table is aaa.x.y.z., all principal names for NIS+ entries created from LDAP data will
be of the following form.
user or system.x.y.z.
Netnames are of the following form.
unix.uid@x.y.z.
unix.nodename@x.y.z.
While this method of constructing principal and netnames probably is
sufficient for most NIS+ installations, there are also some cases in which
it fails, as shown in the following.
-
The owner name of the cred.org_dir table
belongs to a different domain than the one shared by the principal and netnames
in the cred.org_dir table. This could be the case for a cred.org_dir table in a subdomain, if the owner is a principal from
the parent domain. You can fix this problem in one of the following ways.
-
Change the owner of the cred.org_dir table to match the domain of the entries in the table.
-
Change the mapping rules for the cred.org_dir database IDs to use the owner of some other
NIS+ object (which could be created especially for that purpose, if no suitable
object already exists).
For example, if the cred.org_dir table in the domain sub.dom.ain. is owned by master.dom.ain., but
principal and netnames in cred.org_dir.sub.dom.ain. should
belong to sub.dom.ain, you could create a link object as
follows.
# nisln cred.org_dir.sub.dom.ain. \
credname.sub.dom.ain.
Set the owner of the link object to an appropriate principal in the sub.dom.ain. as follows.
# nischown trusted.sub.dom.ain. credname.sub.dom.ain.
Edit the mapping file. Change
(nis+:zo_owner[]cred.org_dir, "*.%s")), \
|
to
(nis+:zo_owner[]credname.sub.dom.ain., "*.%s")), \
|
Note that the use of a link object called credname
is an example. Any valid object type (except an entry object) and object name
will do. The important point is to set the owner of the object to have the
correct domain name.
-
If you do not want to give ownership even of a special purpose
object to a principal from the domain used for the principal and netnames,
create nisplusPrincipalName and nisplusNetname attributes as detailed below.
-
The cred.org_dir table contains principal and netnames belonging to more than one domain.
Consult the documentation for your LDAP server, and create the nisplusPrincipalName and nisplusNetname attributes,
as well as the nisplusAuthName object class. (The following
is LDIF data for ldapadd. Attribute and object class OIDs
are for illustration only.)
dn: cn=schema
changetype: modify
add: attributetypes
attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.7.0 NAME 'nisplusPrincipalName' \
DESC 'NIS+ principal name' \
SINGLE-VALUE \
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
attributetypes: ( 1.3.6.1.4.1.42.2.27.5.42.42.9.0 NAME 'nisplusNetname' \
DESC 'Secure RPC netname' \
SINGLE-VALUE \
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
dn: cn=schema
changetype: modify
add: objectclasses
objectclasses: ( 1.3.6.1.4.1.42.2.27.5.42.42.10.0 NAME 'nisplusAuthName' \
SUP top AUXILLIARY DESC 'NIS+ authentication identifiers' \
MAY ( nisplusPrincipalName $ nisplusNetname ) )
|
You now need to enable the cred.org_dir mapping
to use the newly created nisplusNetname and nisplusPrincipalName attributes. The template mapping file, /var/nis/NIS+LDAPmapping.template, contains commented-out lines for this purpose. See the nisplusObjectDN and nisplusLDAPattributeFromColumn/
nisplusLDAPcolumnFromAttribute attribute values for the credlocal, creduser, and crednode
database IDs. Once you have edited your mapping file to this effect, restart
the rpc.nisd daemon. Do not forget to add the -m option if your mapping file is not the default, and the -Y option if the rpc.nisd daemon should provide
NIS (YP) emulation.
# pkill rpc.nisd
# /usr/sbin/rpc.nisd -m mapping-file
[-Y]
client_info and timezone Tables
Because RFC 2307 does not provide schemas for the information kept in
the NIS+ client_info.org_dir and timezone.org_dir tables, mapping of these tables is not enabled by default in the
template mapping file (/var/nis/NIS+LDAPmapping.template).
If you want to keep the client_info andtimezone information in LDAP, consult your LDAP server documentation, and
create the new attributes and object classes discussed in the following sections.
client_info Attributes and Object Class
Create attributes and object class as below, and then create the container
for the client_info data. The suggested container name is ou=ClientInfo. LDIF data is for ldapadd(1). The attribute and object class OIDs
used in the following are examples only.
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 ) )
|
To create the container, put the following LDIF data in a file. Substitute
your actual search base for searchBase.
)
dn: ou=ClientInfo, searchBase
objectClass: organizationalUnit
ou: ClientInfo
objectClass: top
Use the above file as input to the ldapadd command
in order to create the ou=ClientInfo container. For example,
if your LDAP administrator DN is cn=directory manager,
and the file with the LDIF data is called cifile, do the
following.
# ldapadd -D cn="directory manager"
-f cifile
Depending on the authentication required, the ldapadd
command might prompt for a password.
The /var/nis/NIS+LDAPmapping.template file contains
commented-out definitions for the client_info.org_dir table.
Copy these to the actual mapping file, enable by removing the comment character
'#', and restart the rpc.nisd daemon. If necessary, synchronize
NIS+ and LDAP data as described in NIS+ to LDAP Migration Scenarios.
timezone Attributes and Object Class
Create attributes and object class as below, and then create the container
for the timezone data. The suggested container name is ou=Timezone. (The LDIF data is suitable for ldapadd(1). Attribute and object class OIDs are
examples only.)
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 ) )
|
To create the ou=Timezone container, put the following
LDIF data in a file. (Substitute your actual search base for searchBase.)
dn: ou=Timezone,searchBase ou: Timezone objectClass: top
objectClass: organizationalUnit
Use the above file as input to ldapadd(1) in order to create the ou=Timezone container. For example, if your LDAP administrator DN is cn=directory manager, and the file with the LDIF data is called tzfile.
# ldapadd -D cn="directory manager"
-f tzfile
Depending on the authentication required, the ldapadd
command might prompt for a password.
The /var/nis/NIS+LDAPmapping.template file contains
commented-out definitions for the timezone.org_dir table.
Copy these to the actual mapping file, enable by removing the comment character
'#', and restart therpc.nisd daemon. If necessary, synchronize
NIS+ and LDAP data as described in NIS+ to LDAP Migration Scenarios.
Adding New Object Mappings
The template mapping file, /var/nis/NIS+LDAPmapping.template, contains mapping information for all standard
NIS+ objects. In order to support mapping of site or application specific
objects, you will need to add new mapping entries. This is a simple task for
non-entry (that is, directory, group, link, or table) objects, but can become
complex for entry objects, if the LDAP organization of the corresponding entry
data differs greatly from that used by NIS+. The following example shows the
simple case.
How to Map Non-Entry Objects
-
Find the fully qualified name of the object to be mapped.
If this name resides under the domain name specified by the nisplusLDAPbaseDomain attribute, you can omit the portion that equals
the nisplusLDAPbaseDomain value.
For example, if nisplusLDAPbaseDomain has the value some.domain., and the object to be mapped is a table called nodeinfo.some.domain., the object name can be shortened to nodeinfo.
-
Invent a database id to identify the object.
The database id must be unique for the mapping configuration used, but
is not otherwise interpreted. It does not show up in the LDAP data. In order
to reduce confusion with entry object mappings, create a database id identifying
the table object proper (not the table entries) using an explanatory string
like _table at the end.
For this example, use the database id nodeinfo_table,
and establish the connection between the database id and the object in the
standard mapping file location (/var/nis/NIS+LDAPmapping)
by adding the following.
nisplusLDAPdatabaseIdMapping nodeinfo_table:nodeinfo.some.domain.
|
Assuming that nisplusLDAPbaseDomain is some.domain., the following would also work.
nisplusLDAPdatabaseIdMapping nodeinfo_table:nodeinfo
|
-
Decide on a TTL for the object.
This is the time during which the rpc.nisd daemon
regards its local copy of the object as valid. When the TTL expires, the next
reference to the object will initiate an LDAP lookup to refresh the object.
There are two different TTL values. The first is set when the rpc.nisd daemon first loads the object from disk (after a reboot
or restart), and the second pertains to all refreshes from LDAP. The first
TTL is selected randomly from a configured range. For example, if nodeinfo_table should be valid for a period of between one and three
hours following initial load, and for twelve hours thereafter, specify the
following.
nisplusLDAPentryTtl nodeinfo_table:3600:10800:43200
|
-
Decide where the object data should be stored in LDAP.
The template mapping file suggests putting non-entry object data in
the ou=nisPlus container.
If you use this scheme, and have not yet created the appropriate attribute,
object class, and container, see Mapping NIS+ Objects Other Than Table Entries.
For example, assume you want to store the nodeinfo
object in the ou=nisPlus,dc=some,dc=domain container, and
that the LDAP entry should have the cn nodeinfo. Create
the following 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
|
Since NIS+ replicas do not write data to LDAP, you can use the nisplusLDAPobjectDN above for both master and replicas.
-
(Skip this step if the NIS+ object to be mapped has not yet been created
in NIS+.) Store the object data in LDAP. You could use the rpc.nisd daemon for this purpose, but it is easier to use the nisldapmaptest(1M) utility, as you can leave the rpc.nisd daemon running.
# nisldapmaptest -m /var/nis/NIS+LDAPmapping -o -t nodeinfo
-r
The —o option specifies the table object itself,
not the table entries.
-
Verify that the object data is stored in LDAP. (This example assumes
the LDAP server is running on the local machine at port 389.)
# ldapsearch -b ou=nisPlus,dc=some,dc=domain cn=nodeinfo
The output would appear similar to the following.
cn=nodeinfo,ou=nisPlus,dc=some,dc=domain
nisplusobject=NOT ASCII
objectclass=nisplusObjectContainer
objectclass=top
cn=nodeinfo
|
-
Restart the rpc.nisd daemon so that it will start
using the new mapping information. Do not forget the -m
option if the mapping file has a name other than the default one. Append the -Y option if the rpc.nisd daemon is providing
NIS (YP) service.
# pkill rpc.nisd
# /usr/sbin/rpc.nisd -m mappingfile
[-Y]
Adding Entry Objects
NIS+LDAPmapping(4)
specifies the syntax and semantics of table entry mapping in detail, and also
provides examples that show how to use each syntactic element. However, the
simplest and least error-prone approach is usually to identify an already
existing mapping that is similar to what you want to do, and then copy and
modify that existing mapping.
For example, assume that you have an NIS+ table called nodeinfo, which is used to store inventory and owner information for nodes.
Assume that the NIS+ table was created by the following command.
# nistbladm -c -D access=og=rmcd,nw=r -s : nodeinfo_tbl \
cname=S inventory=S owner= nodeinfo.`domainname`.
The cname column is expected to contain the canonical
name of the node. In other words, the same value as that of the cname column in the hosts.org_dir table for the
node.
Also assume that the corresponding information is kept in the ou=Hosts container in LDAP, and that the nodeInfo
object class (which is an invention for this example, and is not defined in
any RFC) has cn as a MUST attribute, and that nodeInventory and nodeOwner are MAY attributes.
In order to upload existing nodeinfo data to LDAP,
it will be convenient to create the new mapping attributes in a separate file.
You could, for example, use /var/nis/tmpmapping.
-
Create a database id that identifies the NIS+ table to be
mapped.
nisplusLDAPdatabaseIdMapping nodeinfo:nodeinfo
|
-
Set the TTL for entries in the nodeinfo
table. Since the information is expected to change only rarely, use a twelve
hour TTL. When the rpc.nisd daemon first loads the nodeinfo table from disk, the TTLs for entries in the table are
randomly selected to be between six and twelve hours.
nisplusLDAPentryTtl nodeinfo:21600:43200:43200
|
-
Identify an existing mapping that has similar properties to
the one you want to create. In this example, mapping the attribute values
is trivial (straight assignment). Instead, the complication is that you store
the LDAP data in an existing container, so that you have to be careful during
removal of the nodeinfo data. You do not want to remove
the entire ou=Hosts entry, just the nodeInventory and nodeOwner attributes. You will need a special
deletion rule set for this purpose.
To summarize, you are looking for a mapping that shares a container,
and has a delete rule set. One possible candidate is the netmasks mapping, which shares the ou=Networks container,
and does have a delete rule set.
-
The template netmasks mapping has the default
mapping (from /var/nis/NIS+LDAPmapping.template) as follows.
nisplusLDAPobjectDN netmasks:ou=Networks,?one?objectClass=ipNetwork,\
ipNetMaskNumber=*:\
ou=Networks,?one?objectClass=ipNetwork:
dbid=netmasks_del
|
Transferred to the new mapping for nodeinfo, the
database id should be nodeinfo, the container ou=Hosts, and the object class nodeInfo. Thus,
the first line of the nodeinfo mapping becomes the following.
nisplusLDAPobjectDN nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\
|
The second line in the netmasks mapping is the part
of the search filter that selects only those ou=Networks
entries that contain the ipNetMaskNumber attribute. In
this example, select the ou=Hosts entries that have the
following nodeInventory attribute.
The third and fourth lines are the write portion of the nisplusLDAPobjectDN, and they specify where in LDAP nodeinfo data
is written, as well as the rule set that is used when nodeinfo
data is deleted. In this case, create a delete rule set identified by the
database id nodeinfo_del. Because you are always writing
to an existing entry in ou=Hosts, you only need to specify
the object class for the nodeinfo data proper as follows.
ou=Hosts,?one?objectClass=nodeInfo:\
dbid=nodeinfo_del
|
Putting it all together, our nisplusLDAPobjectDN
is the following.
nisplusLDAPobjectDN nodeinfo:ou=Hosts,?one?objectClass=nodeInfo,\
nodeInventory=*:\
ou=Hosts,?one?objectClass=nodeInfo:\
dbid=nodeinfo_del
|
-
Create the rule set that maps nodeinfo
data from NIS+ to LDAP. The template (from netmasks) is
the following.
nisplusLDAPattributeFromColumn \
netmasks: dn=("ipNetworkNumber=%s,", addr), \
ipNetworkNumber=addr, \
ipNetmaskNumber=mask, \
description=comment
|
The ou=Hosts container has an additional complication
in this case, as RFC 2307 specifies the dn should contain
the IP address. However, the IP address is not stored in the nodeinfo table, so you must obtain it in another manner. Fortunately, the crednode mapping in the template file shows how to obtain the IP
address.
nisplusLDAPattributeFromColumn \
crednode: dn=("cn=%s+ipHostNumber=%s,", \
(cname, "%s.*"), \
ldap:ipHostNumber:?one?("cn=%s", (cname, "%s.*"))), \
|
Thus, you can copy that portion of the crednode mapping.
In this case, however, the cname column value
is the actual host name (not the principal name), so you do not need to extract
just a portion of the cname. Making the obvious substitutions
of attribute and column names, the nodeinfo mapping becomes
the following.
nisplusLDAPattributeFromColumn \
nodeinfo: dn=("cn=%s+ipHostNumber=%s,", cname, \
ldap:ipHostNumber:?one?("cn=%s", cname)), \
nodeInventory=inventory, \
nodeOwner=owner
|
-
When mapping data from LDAP to NIS+, the template netmasks entry is as follows.
nisplusLDAPcolumnFromAttribute \
netmasks: addr=ipNetworkNumber, \
mask=ipNetmaskNumber, \
comment=description
|
After substituting attribute and column names, this result is the following.
nisplusLDAPcolumnFromAttribute \
nodeinfo: cname=cn, \
inventory=nodeInventory, \
owner=nodeOwner
|
-
The delete rule set for netmasks is as
follows.
nisplusLDAPattributeFromColumn \
netmasks_del: dn=("ipNetworkNumber=%s,", addr), \
ipNetmaskNumber=
|
The above specifies that when a netmasks entry is
deleted in NIS+, the ipNetmaskNumber attribute in the corresponding ou=Networks LDAP entry is deleted. In this case, delete the nodeInventory and nodeOwner attributes. Therefore,
using the dn specification from item (5) above, results
in the following.
nisplusLDAPattributeFromColumn \
nodeinfo_del: dn=("cn=%s+ipHostNumber=%s,", cname, \
ldap:ipHostNumber:?one?("cn=%s", cname)), \
nodeInventory=, \
nodeOwner=
|
-
The mapping information is complete. In order to begin using
it, stop and later start the rpc.nisd daemon.
# pkill rpc.nisd
-
If there already is data in the NIS+ nodeinfo
table, upload that data to LDAP. Put the new nodeinfo mapping
information into a separate file, /var/nis/tmpmapping.
# /usr/sbin/rpc.nisd -D -m /var/nis/tmpmapping \
-x nisplusLDAPinitialUpdateAction=to_ldap \
-x nisplusLDAPinitialUpdateOnly=yes
-
Add the mapping information from the temporary file, /var/nis/tmpmapping, to the actual mapping file. Use an editor
to do this, or append the data (assuming the actual mapping file is /var/nis/NIS+LDAPmapping) as follows.
# cp -p /var/nis/NIS+LDAPmapping \
/var/nis/NIS+LDAPmapping.backup
# cat /var/nis/tmpmapping >> /var/nis/NIS+LDAPmapping
Note –
Note the double arrow redirection, ">>". A single arrow, ">",
would overwrite the target file.
-
Restart the rpc.nisd daemon. Add the -Y option if the rpc.nisd daemon also serves
NIS (YP) data as follows.
# /usr/sbin/rpc.nisd -m /var/nis/NIS+LDAPmapping
Storing Configuration Information in LDAP
In addition to keeping NIS+/LDAP configuration information in the configuration
files and on the command line, configuration attributes can also be stored
in LDAP. This is useful if the configuration information is shared by many
NIS+ servers, and is expected to change on a regular basis.
To enable storing of configuration attributes in LDAP, consult your
LDAP server documentation and create the following new attributes and object
class. The configuration information is expected to reside at the location
specified by the nisplusLDAPconfigDN value (from the rpc.nisd command line, or from /etc/default/rpc.nisd), with a cn equal to the nisplusLDAPbaseDomain value (as it is known to the rpc.nisd daemon
before reading any configuration information from LDAP).
LDIF data is suitable for ldapadd(1) (attribute and object class OIDs are
examples only).
The defaultSearchBase, preferredServerList, and authenticationMethod attributes derive
from a draft “DUA config” schema, which is intended to become
an IETF standard. In any case, the following definitions are sufficient for
the purposes of 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 configuration attributes are as follows.
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 $ nisplusLDAPTLSCertificateDBPath
$ 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 ) )
|
Create a file containing the following LDIF data (substitute your actual
search base for searchBase,
and the fully qualified domain name for domain.)
dn: cn=domain,searchBase
cn: domain
objectClass: top objectClass: nisplusLDAPconfig
Use the above file as input to ldapadd(1) to create the NIS+/LDAP configuration
entry. Initially, the entry is empty. Use ldapmodify(1) to add configuration attributes. For
example, to set the nisplusNumberOfServiceThreads attribute
to "32", create the following file (for input to ldapmodify(1)).
dn: cn=domain, searchBasenisplusNumberOfServiceThreads: 32