Ldap Programming Management And Integration 1st Edition Clayton Donley pdf download
Ldap Programming Management And Integration 1st Edition Clayton Donley pdf download
https://ebookbell.com/product/ldap-programming-management-and-
integration-1st-edition-clayton-donley-975188
https://ebookbell.com/product/ldap-directories-explained-an-
introduction-and-analysis-6th-printing-arkills-21354964
https://ebookbell.com/product/ldap-system-administration-1st-edition-
gerald-carter-1939174
https://ebookbell.com/product/ldap-in-the-solaris-operating-
environment-deploying-secure-directory-services-michael-haines-922834
https://ebookbell.com/product/understanding-ldap-design-and-
implementation-ibm-redbooks-2620322
Practical Spring Ldap Using Enterprise Javabased Ldap In Spring Data
And Spring Framework 6 2nd Edition Varanasi Balaji
https://ebookbell.com/product/practical-spring-ldap-using-enterprise-
javabased-ldap-in-spring-data-and-spring-framework-6-2nd-edition-
varanasi-balaji-54527848
Solaris And Ldap Naming Services Deploying Ldap In The Enterprise Tom
Bialaski Michael Haines
https://ebookbell.com/product/solaris-and-ldap-naming-services-
deploying-ldap-in-the-enterprise-tom-bialaski-michael-haines-4126172
Practical Spring Ldap Enterprise Java Ldap Development Made Easy 1st
Edition Balaji Varanasi
https://ebookbell.com/product/practical-spring-ldap-enterprise-java-
ldap-development-made-easy-1st-edition-balaji-varanasi-4568498
https://ebookbell.com/product/understanding-and-deploying-ldap-
directory-services-2nd-edition-timothy-a-howes-923744
The Abcs Of Ldap How To Install Run And Administer Ldap Services 1st
Edition Reinhard E Voglmaier
https://ebookbell.com/product/the-abcs-of-ldap-how-to-install-run-and-
administer-ldap-services-1st-edition-reinhard-e-voglmaier-983832
LDAP Programming, Management
and Integration
LDAP Programming,
Management and
Integration
CLAYTON DONLEY
MANNING
Greenwich
(74° w. long.)
For online information and ordering of this and other Manning books,
go to www.manning.com. The publisher offers discounts on this book
when ordered in quantity. For more information, please contact:
Special Sales Department
Manning Publications Co.
209 Bruce Park Avenue Fax: (203) 661-9018
Greenwich, CT 06830 email: [email protected]
Many of the designations used by manufacturers and sellers to distinguish their products are
claimed as trademarks. Where those designations appear in the book, and Manning
Publications was aware of a trademark claim, the designations have been printed in initial
caps or all caps.
Recognizing the importance of preserving what has been written, it is Manning’s policy to have the
books we publish printed on acid-free paper, and we exert our best efforts to that end.
ISBN 1-930110-40-5
Printed in the United States of America
1 2 3 4 5 6 7 8 9 10 – VHG – 06 05 04 03
contents
preface xi
acknowledgments xv
about this book xvi
getting started xix
about the cover illustration xxii
v
1.8 Integration and federation via virtual directory technology 30
1.9 Why this book? 31
1.10 Summary 32
4 Search criteria 75
4.1 Performing a search 76
4.2 Where to search: base and scope 76
Search base 76 ✦ Search scope 77
vi CONTENTS
4.3 What to evaluate: search filters 78
Presence filters 79 ✦ Exact equality filters 80 ✦ Substring matching 81
Ordered matching (greater than/less than) 83 ✦ Approximate filters 84
Multiple filters: AND and OR operators 84 ✦ Negative filters: the NOT
operator 86 ✦ Extensible searching and matching rules 86
4.4 What to return: the attribute return list 87
4.5 LDAP search criteria vs. SQL queries 87
Similarities between SQL SELECT and LDAP search criteria 88
Differences between SQL SELECT and LDAP search criteria 88
4.6 Increasing search performance 88
4.7 Summary 89
CONTENTS vii
6.4 Manipulating entries 116
Updating an entry 116 ✦ Adding new entries 117
Deleting an entry 117 ✦ Renaming an entry 117
6.5 Comparing entries 118
6.6 Handling errors 119
6.7 Support for encrypted/SSL connections 119
6.8 Summary 120
viii CONTENTS
8.6 Synchronization 162
Synchronization to LDAP 162 ✦ Synchronization from LDAP 163
Bidirectional synchronization 166
8.7 Summary 167
CONTENTS ix
11.3 JNDI operations: the DirContext class 217
Handling basic exceptions 218 ✦ Closing the connection 218
Binding to the directory 218 ✦ A reusable LDAP connection handler 219
11.4 Searching with JNDI 220
Abstracting the entry 221 ✦ A search class 223
11.5 Adding entries 226
A simple add example 226 ✦ A generalized add example 227
11.6 Manipulating entries 229
Modifying entries 229 ✦ Deleting entries 230 ✦ Renaming entries 231
11.7 Summary 232
x CONTENTS
preface
This book will help you understand and use the most important directory services—
those based on the leading industry standards—without having to read the many eso-
teric standards documents available on the Web. I am tempted to start the book with
a motivating example from my experience to explain why directory services are so
important and why you should read this book from cover to cover, but I will resist.
There is no need to tell a story from my experience, because I can tell a story from
your experience. Every single one of you has had experience with directory services,
whether you know it or not.
Did you log in to a computer today? When the computer checked your password,
it was probably using a directory service.
Do you use a personalized start page, such as Netscape Netcenter? If so, your pref-
erences and login information were found in a directory service and used to customize
your experience.
Have you ever looked up the email addresses of long-lost friends on the Internet,
or located the telephone number of the woman in receiving who can track down your
lost package? Both of these tasks are also common uses for directories.
However, you don’t need to learn how to type someone’s name into a search
engine or enter your password. What you do need to learn, and what this book will
teach you, is how to apply the standards that make directory services accessible over
computer networks ranging from the Internet to your corporate intranet to business
partners’ extranets.
We won’t stop there. The most pressing issue in the area of directory services today
is simply that there are so many of them. Every application written in the last 30 years
seems to have come with its own proprietary directory. Operating systems also have
directories. Most of these directories don’t care about each other or even acknowledge
the others’ existence. This book will help you get these existing directories to work well
with new, important standards-based directory services.
Finally, what good is a data repository without useful applications? If you are an
application developer trying to get your existing applications to work with Light-
weight Directory Access Protocol (LDAP), Directory Services Markup Language
(DSML), and other directory standards, this book not only will help you get a handle
xi
on important application program interfaces (APIs), but also will deliver an under-
standing of the best strategies for using these applications to derive important appli-
cation benefits.
xii PREFACE
wasn’t just a way to look up information; it was a key storage point for identity infor-
mation—the only network-accessible place in the company where a person’s email
address, login ID, department, name, and manager were linked together. I realized that
smart applications could use this information to identify users throughout the com-
pany and authorize them based on criteria, such as their department. Those applica-
tions could also provide customized presentations based on that same information.
I also knew that as good as this idea was, it would be hard to execute given the lim-
itations of WHOIS, unless we customized each application. At this time, I came into
contact with X.500.
Like WHOIS, X.500 is a standard for a kind of directory service. Unlike WHOIS,
X.500 is anything but simple. It is a detailed set of standards definitions that seems
to describe everything within a 10-mile radius of directory services, including client
access, real security, server-to-server communications, and similar areas. Also unlike
WHOIS, X.500 comes from the OSI networking world, which was left in the dust in
the wake of the Internet explosion and the mass adoption of loosely networked systems
built around standards such as TCP/IP.
Nearly every book or article written about LDAP talks about X.500 being perfect
except for that dastardly OSI protocol stack, which makes deployment on desktop-
class hardware difficult. (Although there is truth to this reasoning, the real reason most
X.500 directory projects didn’t take off is that getting the right data into the directory
and keeping it up-to-date was difficult—after all, garbage in, garbage out. Similarly,
few applications were X.500 aware, partly due to its complexity.) This difficulty
spawned LDAP, which was meant to replace X.500’s Directory Access Protocol (DAP)
as a client implementation.
After making the move from X.500 to LDAP for the same published reasons every-
one else did, the lack of integration tools and directory-enabled applications was obvi-
ous. So, I created things like Net::LDAPapi and PerLDAP to glue together information
from different sources into the directory. Not long afterward, I wrote the code that
allowed users to be identified and authorized to many services, such as web, proxy,
and mail.
Today many applications are directory-enabled—so many that these applications
drive most new directory deployments, rather than the other way around. People look-
ing at deploying and accessing directories are faced with many difficult choices in
design and execution. My goal for this book is to help simplify this complex technol-
ogy in a way that accelerates your projects and improves your end results.
PREFACE xiii
• Access is access.
• Configuration is trivial; management is complex.
Although these may seem like insanely simple lessons, let me explain.
Access is access
Certain methods of access may be more efficient or provide more underlying func-
tionality, but at the end of the day, it is only important that the directory service can
share information in a way that clients and applications can use. Today, that standard
for sharing information in directory services is LDAP. Therefore, we use LDAP as the
primary access protocol throughout this book.
However, many of the more advanced techniques described in parts 2 and 3 of this
book will work just as well with another means of access. In fact, part 3 describes the
use of Directory Services Markup Language (DSML), which you can use to represent
directory services information as XML.
Configuration is trivial; management is complex
This is not to say that your mother should be installing and configuring your direc-
tory servers. It is merely an indication of the relative complexity of configuration ver-
sus management.
I cannot stress enough that unless the directory is running in a stand-alone envi-
ronment where it is the only source of data, there will be effort in getting information
into and out of the directory. Unless you understand and make this effort up front,
the data in the directory will either be stale and useless or require yet another manual
administrative process to keep it up to date.
New technology is coming out that removes some of the technical barriers to splic-
ing information into authoritative directories. However, such technology does not
remove the internal political roadblocks and the need for up-front planning that is
required in nearly all meaningful directory service deployments.
xiv PREFACE
acknowledgments
Creating a quality technology book involves a great deal of effort from many talented
and passionate individuals. There is simply no way to thank all of those involved
enough for their efforts in making this book as good as it could possibly be.
I must start by thanking my wife Linda for her support in this endeavor. Without
her patience and strong support, this book certainly would never have been completed.
A few weeks before the book went to press, we received the special delivery of our son
Ethan, who was certainly an inspiration as the book’s development came to a close.
Too many people to name looked at bits and pieces of this book. Some of the peo-
ple who looked through early drafts were Kurt Zeilenga of the OpenLDAP project, La
Monte Yaroll of Motorola, Booker Bense of Stanford, Jay Leiserson and Richard
Goodwin of IBM, Jauder Ho of KPMG, Ranjan Bagchi, Juan Carlos Gomez and Raul
Cuza. Nathan Owen of IBM and Phil Hunt of OctetString also offered some very
helpful feedback on several key sections later in the development cycle.
Extra special thanks go to Booker Bense, who did a detailed final review of the
entire text and made a number of quality suggestions that I feel contributed to the
technical accuracy and readability of the book. Don Bowen of Sun was also especially
helpful in his review of key sections of the book as it neared completion.
Many people at Manning Publications were incredible throughout the process.
Marjan Bace and Mary Piergies were on top of this project with their full attention
and enthusiasm from the start. Lianna Wlasiuk was phenomenal as a development edi-
tor and offered many significant ideas that vastly improved the final content of the
book. Tiffany Taylor did a fantastic job of editing the text and removing all of the
embarrassing errors that I left behind. Dottie Marsico had the Herculean task of mak-
ing sense of a vast number of graphics in a myriad formats, among other things. Syd
Brown came up with the book’s wonderful design, and Leslie Haimes did a great job
putting together a captivating cover. Ted Kennedy did a masterful job of staying on
top of the entire review process.
Finally, a special thanks to everyone I’ve emailed or spoken with over the years
about this technology. These discussions helped shape much of the thinking that went
into this book. So much was learned from sharing information with the users of the
LDAP-related technology I’ve developed. This learning and interaction was truly a
reward for any effort on my part.
xv
about this book
Part 1 of the book has five chapters:
• Chapter 1 introduces core LDAP concepts, with the understanding that you may
have little or no past exposure to the protocol.
• Chapter 2 introduces LDAP’s information model and schema. Information in
an LDAP-enabled directory is presented in a simple and uniform way that you
should understand before proceeding. This chapter covers object classes,
attribute types, and schema standards.
• Chapter 3 offers information about LDAP namespace and naming standards.
Because all entries in LDAP are uniquely named, it’s important for you to
understand the information in this chapter.
• Chapter 4 provides an overview of LDAP search criteria. Because searching is
the most commonly used and most complex LDAP operation from a client per-
spective, we spend considerable time introducing and explaining filters, scope,
and search bases.
• Chapter 5 introduces the LDAP Data Interchange Format (LDIF) and the
Directory Services Markup Language (DSML), an XML standard for represent-
ing directory information, and shows how these standards can be used to easily
store and share directory information.
Part 2 is as follows:
• We begin exploring LDAP management in chapter 6. This chapter introduces the
Net::LDAP module, which lets you use Perl to access and manage an LDAP-
enabled directory.
• In chapter 7, we discuss administrative techniques. Examples include a web-
based tool that you can use to manage individual entries.
• Chapter 8 offers insights into synchronization and migration. No data exists in
a vacuum, so this chapter provides guidance about some of the ways data in
other directories and databases can be leveraged in an LDAP environment.
xvi
• Chapter 9 explains how to monitor and manage information about the LDAP
server. Examples include schema retrieval scripts and tools for generating syn-
thetic transactions that can be used to check server availability.
• Chapter 10 expands on our previous discussion of DSML. Many examples are
provided, in Perl, including ones for generating DSML and transforming it to
HTML using XSLT.
Part 3 comprises the book’s final three chapters:
• In chapter 11, we begin discussing the best methods for directory-enabling your
applications. This chapter offers an introduction to the Java Naming and Direc-
tory Interface (JNDI), an API for accessing directory services based on many stan-
dards, including LDAP.
• In chapter 12, we refocus on DSML in an application context. Examples are
given that relate DSML to other technologies, such as web services and SOAP.
An exploration of DSML version 2 operations is also provided.
• Security ranks with messaging as a critical area for directory integration. For
that reason, we spend chapter 13 going over authentication, authorization, dig-
ital certificate storage, and LDAP security issues in general.
The book ends with two appendixes:
• Appendix A provides a compilation of standard schemas from Request for Com-
ments (RFCs), Internet Drafts, and other sources that you should consider prior
to the creation of new schemas. The LDAP schema is discussed in chapter 2.
• PerLDAP is a popular alternative to the Net::LDAP module discussed in part 2.
Appendix B offers an overview of PerLDAP and translation of many of the
examples in part 2.
AUTHOR ONLINE
When you purchase LDAP Programming, Management and Integration you gain free
access to a private web forum run by Manning Publications where you can make
SOURCE CODE
Source code for all examples presented in LDAP Programming, Management and
Integration is available for download from www.manning.com/donley.
Code conventions
Courier typeface is used for code examples. Bold Courier typeface is used in
some code examples to highlight important or changed sections. Certain references to
code in text, such as functions, properties, and methods, also appear in Courier
typeface. Code annotations accompany some segments of code.
DIRECTORY SERVERS
A directory server supporting LDAP is required to run these examples. The examples
should work with almost any LDAP-enabled directory server, except where noted
prior to the example.
This book is about getting the most from directory services, not installing and con-
figuring all the directories on the market. Following are pointers to some of the more
common directory servers available at the time of publication. Additionally, we
include basic instructions for obtaining a special LDAP server that has been precon-
figured to work with the examples in this book.
Directory server vendors
The LDAPZone (http://www.ldapzone.com) web site is a good place to begin when
you’re looking for answers to many directory issues. It has active community pages
and links to other sites related to LDAP. It also has links to the most popular LDAP
server implementations.
Among the servers currently listed are
• Novell eDirectory
• iPlanet Directory Server
• Oracle Internet Directory
• Critical Path InJoin Directory Server
• Microsoft Active Directory
• IBM SecureWay Directory
• Open Source OpenLDAP Directory
• Data Connection Directory
• OctetString Virtual Directory Engine
xix
Each of these vendors provides a server that is directly LDAP accessible, with solid
documentation for installation and configuration.
Basic configuration parameters
The examples in this book assume the server will be listening on TCP port 389,
which is the standard LDAP port. This is usually easily configurable within the server,
although certain implementations (such as Microsoft Active Directory) cannot be
configured to listen on a different port.
The root of the directory tree used in the examples is dc=manning,dc=com.
This will be acceptable to most implementations, but some older servers may not be
aware of dc-style naming. If that is the case, substituting o=manning,c=us or any
other name for the root in configuration and examples should be acceptable. You can
find more information about naming and directory trees in chapter 3.
Most of the examples in this book use standard schemas related to people and
groups that can be found in virtually all LDAP implementations. If an example pro-
duces an error related to a schema violation, you may need to add the schema being
referenced by that example. Different directories have different files and configuration
options for adding new schemas.
COMMAND-LINE TOOLS
In part 1 of the book, no programming languages are used. Instead, we use com-
monly available LDAP tools to demonstrate key components of LDAP, such as infor-
mation model, entry naming, and search filters. These tools come with many
operating systems, such as Solaris and some Linux variants. They are also distributed
with many directory server products.
You can determine if the tools are available by attempting to run commands such
as ldapmodify and ldapsearch. If these commands exist, they should be suitable
for the examples in this book.
The source code to these tools can be found in at least two places:
• The OpenLDAP project (www.openldap.org)
• The Mozilla Directory project (www.mozilla.org/directory/)
Both of these versions are suitable for use with the examples in this book.
If you prefer to download precompiled versions of these tools, you can most easily
obtain them as part of the iPlanet Directory Software Development Kit (SDK). This
kit is available at http://www.iplanet.com/downloads/developer/.
xx GETTING STARTED
higher is recommended) and the Perl-LDAP module. This is not to be confused with
PerLDAP, which is the module previously released by Netscape and the author of this
book. Although both modules do the same job, Perl-LDAP is becoming more widely
used; and, because it is completely written in Perl, it is portable to any platform where
Perl is available.
The Perl-LDAP module is written and maintained by Graham Barr and can be
found at perl-ldap.sourceforge.net along with detailed installation instructions.
Active State Perl users can use these commands to install the necessary module
automatically:
C:\ >ppm
PPM interactive shell (2.1.6) - type 'help' for available commands.
PPM> install perl-ldap
Users of other versions of Perl can access the module on the Comprehensive Perl
Archive Network (CPAN) (http://www.cpan.org).
JAVA
Java is used extensively throughout part 3 of this book. We use core Java functional-
ity found in J2SE as well as extensions for communicating with LDAP and parsing
XML/DSML.
xxii
P A R T
1
Fundamental
LDAP concepts
The Lightweight Directory Access Protocol (LDAP) has emerged as the standard for
accessing directory services over networks. In this first part of the book, we will look
at everything you need to know about LDAP.
Chapter 1 begins with an exploration of the many uses and benefits of LDAP, as
well as its origin. From there we move on to an overview of current directory man-
agement and interoperability issues. At the end of chapter 1, we glance at the available
and emerging tools that allow for easier integration between different data sources.
Information is exchanged between LDAP clients and servers using containers called
entries. These containers are formed based on a particular information model that we
discuss in chapter 2.
Entries in a directory are given unique, hierarchical names in an LDAP directory.
In chapter 3, we look at how these names are formed, naming issues, and best practices.
Chapter 4 covers LDAP search criteria. The focus here is on simplifying the some-
times complicated combination of search filters, scopes, and bases that make up an
LDAP search request.
You will get your first look at Directory Services Markup Language (DSML), the
latest standard for representing directory information and operations in XML, in chap-
ter 5. Chapter 5 also formally introduces the LDAP Data Interchange Format (LDIF),
which is a commonly used format for sharing and storing directory information.
C H A P T E R 1
Introduction to LDAP
1.1 What LDAP is 4 1.6 Directory management 23
1.2 What LDAP is not 7 1.7 Directory integration 24
1.3 Current applications 10 1.8 Integration and federation via virtual
1.4 Brief history 15 directory technology 30
1.5 LDAP revisions and other 1.9 Why this book? 31
standards 18 1.10 Summary 32
In this chapter, we introduce the Lightweight Directory Access Protocol (LDAP) and
attempt to answer the following questions:
• What is LDAP? Who needs it? How is it used?
• What are directory services? Where do they fit in the grand scheme of things?
Which ones exist? What is their relation to LDAP?
• What are common issues in planning and deploying directory services?
• Where do metadirectories, provisioning tools, and virtual directories fit
with LDAP?
• What standards organizations and industry consortia are responsible for further
development of directory services and LDAP standards?
3
1.1 WHAT LDAP IS
LDAP is a standard that computers and networked devices can use to access common
information over a network. The ability to provide network access to data in itself
does not make LDAP stand out from dozens of other protocols defined for data
access, such as Hypertext Transfer Protocol (HTTP). As you will see in this chapter
and those following, a number of features and vendor efforts make LDAP very well-
suited for access and updates to many types of common information.
For example, information about employees might be stored in a directory so that
people and applications can locate their contact information. Such contact informa-
tion might include email addresses and fax numbers, or even additional data that
unambiguously identifies employees’ attempts to access enterprise applications.
1.1.1 Directory services and directory servers
A directory is simply a collection of information. For example, the telephone book is a
directory used by virtually everyone to find telephone numbers.
Directory services provide access to the information in a directory. A simple direc-
tory service that most people use from time to time is the directory assistance offered
by most telephone companies. By dialing a telephone number, anyone can receive
instant access to information in the telephone directory.
In the computer world, directories exist everywhere. The Unix password file can
be considered a directory of computer accounts. The Domain Name Service (DNS)
acts as a directory service providing information about network hosts.
Computer applications often have their own directories. The Apache web server
can store usernames and passwords in a data file, which is thus a directory of users.
Customer information stored in a database can also be considered directory informa-
tion if it is of a common nature with applications outside a single program or system.
Directory servers are applications that primarily act as directory services, providing
information from a directory to other applications or end users. This functionality is
most applicable in client/server environments, where the service may be located
remotely from the calling application or system. For example, on Unix or Linux com-
puters running the Network Information Service (NIS), the ypserv program can be
considered a directory server.
1.1.2 LDAP and directory services
LDAP provides client-server access to directories over a computer network and is
therefore a directory service. In addition to offering the ability to search and read
information, it defines a way to add, update, and delete information in a directory.
Two general types of directory server software implement the LDAP standards:
• Stand-alone LDAP servers
• LDAP gateway servers
WHAT LDAP IS 5
complexity has made it less popular for access. However, it is still very popular, and
a number of vendors sell servers that support these standards. These vendors tend to
focus on X.500-based protocols for interoperability between servers, while exposing
the data using an LDAP gateway.
WHOIS was an early attempt at a simple protocol for Internet-accessible white
pages. The services supporting this protocol took a simple string and returned free-
form text in response. A WHOIS server could be written on most operating systems in
a short amount of time, but lack of standard data representation made it difficult to do
anything but display the results as they arrived. Unfortunately, this limitation makes
programmatic use of the resulting data in non–white pages applications very difficult.
NIS, originally called Yellow Pages (YP), was Sun’s remote procedure call (RPC)-
based operating system directory. Most Unix-based servers support some variant of
this protocol. With a relatively simple replication model and access protocol, as well
as the ability to discover servers on a local network, its creation was necessary due to
the growth in client-server computing where users might exist on a number of serv-
ers. However, it was not well-suited for wide area networks (WANs) offered little in
the way of security, and was not easily extensible for storing additional information
in existing maps.
PH/QI was very popular at about the time HTTP became widely used. It was a
multipurpose client-server directory service developed by Paul Pomes at the University
of Illinois at Urbana-Champaign (UIUC). It was especially popular at universities in
North America and was used to store not only white pages information, but also infor-
mation that could be used for security, such as logins and credentials. One of the ear-
liest applications to take advantage of the Common Gateway Interface (CGI) that
shipped with the original National Center for Supercomputing Applications (NCSA)
HTTP server was a gateway that presented an HTML interface to a PH server. Some
mail applications, such as Eudora, were also able to perform PH queries for address
books. LDAP’s acceptance in the industry curtailed any serious move to PH/QI; in
addition, the service was somewhat limited. The protocol was relatively simple and
text-based; it was easy to access programmatically but designed to run on a central
server, limiting its scalability and scope.
Banyan was an early leader in MS-DOS/Windows operating system directories,
but it didn’t fare well as Microsoft and Novell became more directory-aware. Banyan
eventually changed its name to ePresence and is currently one of the larger integrators
focused on directory services.
Novell based the proprietary directory service for its Netware Network Operating
System (NOS) on the X.500 standards. Netware’s directory has long been regarded
as one of the more solid operating system directories, and Novell has a long history
of directory integration in its products. As LDAP picked up steam, Novell separated
the NOS from the directory and created eDirectory; it is now a popular LDAP-
enabled directory service with the broadest platform support of any directory services
vendor’s product.
The Network File System (NFS) and similar file-sharing protocols have this
advanced functionality and are well-tested and accepted for use on local intranets.
Web protocols such as the HTTP and File Transfer Protocol (FTP) are more appro-
priate when you’re providing Internet access to data on local file systems.
In a similar vein, LDAP is often only marginally useful to store serialized objects,
large structured documents (such as XML), and similar types of data in the directory.
Because the LDAP server may not know how to parse these blobs of data, it will not
be able to search on attributes within them.
For example, if you store XML documents in the directory, you will not be able
to search for all XML documents in the directory that implement a particular docu-
ment type unless you also store the document’s type in the directory. Such a process
involves duplicating information already stored in the XML document.
Without storing this metadata, the XML document is an opaque object that can
only be stored and retrieved in full. By contrast, a good file-based XML parser has the
ability to seek through parts of the XML document and retrieve or manipulate only
those sections that are pertinent to the current operation. This situation may be chang-
ing as LDAP vendors become increasingly XML savvy and begin supporting such
functionality as XPath searching.
Note that because the LDAP protocol is separate from the data to which it pro-
vides access, it is possible for a particular LDAP server to be extended to handle par-
ticular types of objects more intelligently. For example, the server might include an
XML parser that indexes XML documents for easier search and retrieval with LDAP.
We’ll explore this process briefly in the context of attribute syntax and matching rules
in chapter 2.
Figure 1.3 This screen from the Outlook Express email client is an example of a
white pages application.
Both Netscape and Internet Explorer have built-in support for searching LDAP
directories and presenting the results in the form of an address book. Most email
applications released in the past few years provide this same functionality, although
some still support their own proprietary standards to remain compatible with legacy
workgroup-oriented directories. Figure 1.4 shows how such a client might talk to a
directory to retrieve this information.
A quick chat with most corporate intranet webmasters would reveal that the most
frequently accessed application on an intranet is usually a corporate contact database.
Everyone from the mailroom clerk to the CEO needs to be able to locate their peers;
LDAP
Address Book
Client LDAP Server
therefore, it is the simplest application available to demonstrate the power and sim-
plicity provided by directory access.
Web-based white pages applications are useful for extending LDAP information to
points beyond an intranet environment when firewalls or a lack of installed clients pre-
vent pure LDAP communication. Figure 1.5 shows how a web server might act as a
gateway for white pages requests from an end-user’s web browser.
Data
HTTP LDAP
Browser
LDAP Server
Web Server
Figure 1.5 The same directory shown in figure 1.4, with a web application rather than the
end-user’s client communicating via LDAP
Most people already have an LDAP-enabled browser or email client, or can access
white pages via a web interface. This simplifies deployment and allows for more wide-
spread access.
In fact, creating an application that can search for information in LDAP is not par-
ticularly difficult. The following is a full code listing in Java using the Java Naming
and Directory Interface (JNDIJ) for a program that can search for information in an
LDAP-enabled directory service:
import javax.naming.directory.*;
import javax.naming.*;
import java.util.Vector;
import java.util.Enumeration;
import java.util.Properties;
CURRENT APPLICATIONS 11
Properties env = new Properties();
env.put(DirContext.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(DirContext.PROVIDER_URL,"ldap://localhost:389");
try {
DirContext dc = new InitialDirContext(env);
NamingEnumeration ne = null;
ne = dc.search(base, filter, sc);
while (ne.hasMore()) {
SearchResult sr = (SearchResult) ne.next();
System.out.println(sr.toString()+"\n");
dc.close();
}
The results of this code are not pretty, but they show how easy it is to tie LDAP into
a new or existing application for white pages or other lookup functionality.
Another benefit of using a web-based white pages application is that whereas most
browsers and email clients enable LDAP searches, a web-based application can offer
a point of self-administration for contact information. Information such as phone
numbers and mailing addresses can be managed using a simple interface that is inte-
grated with the search tools. This approach makes it easy for someone to change his
or her information quickly when necessary.
1.3.2 Authentication and authorization
It is virtually impossible to discuss user access and system security today without
LDAP being part of the conversation. Although it isn’t as visible to the casual user,
LDAP is emerging as the de facto way to access the identity information and creden-
tials needed to support authentication. Authentication is the process of validating the
identity of a user (or any other object, such as an application).
This process allows identity information to be managed and distributed much
more easily than via traditional means. Information stored in an LDAP-enabled data
store can be segmented for simpler management while presenting a unified view to
applications and authentication services.
Using LDAP also has the benefit of reusing identity information. This approach
offers a significant advantage over authentication processes that use an operating
system or proprietary mechanism. For example, using LDAP allows both Unix- and
Browser
Bob Smith HTTP
Figure 1.6
Bob Smith uses a browser
LDAP (bind) to access information on a
protected web server. The
SUCCESS! web server first binds to
LDAP-enabled LDAP the LDAP directory to
Web Server Directory authenticate him.
CURRENT APPLICATIONS 13
LDAP has been gaining wide acceptance as a place to store and retrieve personal-
ization information in enterprise applications. For example, most enterprise portals
support LDAP as a means of obtaining the information needed for personalization.
1.3.4 Roaming profiles
Closely related in many respects to personalization, but focused more on operational
preferences than content preferences, is the concept of roaming profiles. Roaming
profiles allow users to authenticate to an application on any machine and get an
identical environment. You do so by storing considerable individual configuration
options in a directory.
In addition to enabling roaming, directory-based security also offers the potential
to lock down certain configuration items or create organizational or group defaults.
In environments with less-sophisticated users, doing so makes it possible to update
user configurations without a system administrator needing to make a trip to each
cubicle or spend time on the phone walking a user through complicated steps within
an application.
Few stand-alone applications provide roaming profiles. Part of the reason is that
most applications vary widely in their configuration. Thus each application may
require additional information in the directory server to enable storage of that appli-
cation’s configuration values.
This requirement showcases a common conflict between application developers,
who often want to change schema to meet their applications’ needs, and system
administrators, who realize that changes in schema require a great deal of administra-
tive effort. The challenge is deciding where to draw the line between generally useful
information that belongs in a directory and application specific information that
belongs elsewhere. We will discuss this conflict further in chapter 2.
1.3.5 Public Key Infrastructure
Traditional authentication and encryption systems use secret keys. Generally speak-
ing, a secret key system requires both ends of a communication to know a secret pass-
word that will be used to hide the communication. The right secret password
produces a legible message, which both protects the message in transit and proves that
the message must have been written by the other party, because they were the only
other ones with knowledge of the secret. This approach works well as long as the
secret isn’t compromised and you communicate with few enough people that you can
remember a shared secret with each one.
Public key technology changes all this and makes the process more scalable. In this
system, two keys are produced. One key, called the private key, is still secret. However,
unlike the secret key in a shared-secret system, the private key is never shared with any-
one. Instead, a second key called the public key is distributed. A public key can be
placed in a digitally signed container called a digital certificate. Such certificates are
commonly used to distribute public keys.
BRIEF HISTORY 15
gone through many revisions; work is still in progress to update it further. As shown
in figure 1.7, a client originally talked to an X.500 server using the DAP protocol.
Designed to be the standard directory service for the Open Systems Interconnec-
tion (OSI) world, X.500’s fortune has risen and fallen over the years, but it still has a
substantial following. Early on, X.500 was accepted by many large information tech-
nology (IT) organizations as the direction for global directory services. Although early
products had their problems, they also showed a great deal of promise. Many large
companies and universities implemented pilot projects, usually involving the hosting
of white pages.
Figure 1.7
P The X.500 client uses
DS X.500 DSA
DAP to communi-
cate with the X.500
X.500 Client DAP Directory System
X.500 DSA Agent (DSA).
One big issue arose very quickly with X.500: the fact that its access protocol required
an OSI protocol stack and complex binary encoding of structures represented in a
language called Abstract Syntax Notation One (ASN.1). Most desktop computers at
the time were ill equipped to deal with DAP.
As Internet Protocol (IP) became the dominant networking standard, DAP’s OSI
origins made it less attractive. Many of the organizations piloting X.500 directories
had already adopted IP and were looking for a protocol with less baggage for client
access. Even worse, X.500’s complexity and the lack of freely available standards doc-
uments or easy-to-use APIs made it difficult to develop clients without paying fees to
the ITU-T.
As we’ve stated since the beginning of this chapter, even the best directory is useless
when applications are not available to take advantage of it. Several white pages appli-
cations were available, but an electronic phone book is often not enough to justify the
expense of collecting and cleansing all the information necessary to make a directory
truly useful.
1.4.2 A new standard is born
In 1991, after a few false starts with other potential standards, LDAP was brought
forth as a lightweight means for accessing the DAP-enabled directories of the X.500
world. The first set of standards, LDAPv2, were eventually defined and accepted by
the Internet Engineering Task Force (IETF), an important standards body responsi-
ble for many important Internet standards, as RFCs 1777 and 1778.
These standards provided basic authentication, search, and compare operations, as
well as additional operations for changing the directory. From the start, LDAP made
Figure 1.8 The X.500 client goes away, replaced by an LDAP client
talking to an LDAP server. Here, the LDAP server acts as a gateway
between LDAP-aware clients and DAP-aware X.500 DSAs.
X.500 more accessible, as intended. Figure 1.8 shows an X.500 server being accessed
by an LDAP gateway service that is forwarding requests from an LDAP client.
Almost as important as the protocol itself was the release of a standard API and the
production of a client development kit. For the first time, it was possible to access
these servers programmatically without wandering knee-deep into an arcane protocol.
1.4.3 LDAP goes solo
As time went by, some people began to wonder what made X.500 so special in the
first place. The University of Michigan, which had developed the reference imple-
mentation of LDAP, released a stand-alone server called Slapd that would allow the
LDAP server to present data from a local data store rather than simply act as a gate-
way to an X.500 server.
Slapd was followed by a second service called Slurpd, which read the changes from
one server and replicated those changes via the LDAP protocol to other Slapd servers.
Figure 1.9 shows a typical stand-alone LDAP environment.
LDAP Replica
AP
LD (Slapd)
P
LDA pd)
l u r
(S
Figure 1.9 An LDAP client talks to a Slapd server. X.500 is no longer involved.
At this point, Netscape hired most of the original developers from the University of
Michigan Slapd server to develop the Netscape Directory Server. Netscape, which was
riding high with an incredible share of the Internet browser market, decided that net-
works would require directories and that LDAP, not X.500, should be the standard.
Nearly 40 other companies announced support at that time, bringing LDAP the focus
and support it needed to become the de facto standard for directory services.
BRIEF HISTORY 17
1.4.4 LDAPv3
LDAP may have gained acceptance as a stand-alone service, but it was far from com-
plete. Due primarily to its reliance on X.500 servers to provide the server-to-server
communications, access control, and other functionality, LDAP was still only a skele-
ton of a full directory service by the mid-1990s.
Many interested parties pushed forward with the development of the next gener-
ation of the LDAP standards. In December 1996, the new version was published as
RFCs 2251 to 2256. These new specifications covered items including the protocol
itself, mandatory and optional schema, and LDAP URLs. A set of standard authenti-
cation mechanisms and a standard for session encryption were added to the list of core
specifications in 2000. Figure 1.10 shows the core specifications that make up the
LDAP standard.
Protocol
(RFC 2251)
Figure 1.11
Open Group
Network Applications Many industry consortia and
Directory Interoperability
Consortium (NAC) standards bodies are
Forum (DIF)
Users Group involved with LDAP and
LDAP2000 Interoperability
related standards, but most
have a narrow focus.
Controls
LDAPbis Workgroup
Figure 1.12
APIs LDAPv3 Protocol IETF workgroups are trying to fill
Revisions in the gaps left after the initial
publication of LDAPv3.
Supplier Consumer
Directory Directory
LD
New AP AP
Entry LD Another
New Entry
LDUP
Multimaster Replication
Master Master
Directory LD Directory
UP
Read-Only
Replica
Figure 1.14 Multimaster replication will allow changes to the same directory
tree in multiple directories.
YES
LDAP-enabled LDAP
Application Directory
Figure 1.15 LDAP access control standards will include a mechanism for determining in
advance whether an operation will be permitted.
The task of creating such a standard fell into the hands of the LDAP extensions
(LDAPEXT) workgroup within the IETF. This workgroup was formed to handle any
extensions needed to the LDAPv3 standards outside of replication. As this book is
being written, most activities of the LDAPEXT workgroup have been moved to indi-
vidual submissions and will likely become an informational RFC rather than a full
standard. Some aspects of access control may be pursued as part of the interoperabil-
ity requirements for replication.
To understand why access control might be bundled with the replication work-
group, think about the fact that any replication of information outside a vendor’s
products will render that data insecure—other vendors will not know the access con-
trol rules of the source data. Any practical solution for replication is dependent on a
standard for access control. We will look at access control further in chapter 13 when
we discuss directory security in more detail.
1.5.2 Directory Enabled Networking
As computer networks evolve to support more variety and depth of services, the com-
plexity of network management increases accordingly. Most network devices, includ-
ing routers and switches, have traditionally been configured using command-line
shells. Although this configuration enables relatively consistent management of a sin-
gle device, it does nothing to simplify the coordination of configurations across large
numbers of devices. Such coordination is critical when you’re enabling guaranteed
quality of service and other offerings that span multiple devices.
Directory Enabled Networking (DEN) provides a way for devices to configure
themselves based on information in a directory. Originally an initiative from
Microsoft and Cisco, DEN is now part of the CIM defined by the DMTF.
CIM is a set of object-oriented, implementation-neutral schemas that represents
logical and physical attributes of hardware and software. The DMTF, rather than
being protocol architects like the IETF, focused primarily on creating common
object definitions that allow two CIM-aware applications to store and use informa-
tion consistently.
Contrary to popular belief, CIM and DEN are not LDAP-specific information
models, but are instead “meta” models that can be specialized for a number of
LDAP Entry
AP
DSML File LD LDAP Server
HTTP/FTP/
SMTP/etc.
DSML-Enabled DSML
Application Service
Figure 1.16 Here a DSML-enabled application talks to a DSML service that acts
as an intermediary between an LDAP server and the DSML-enabled application.
DSML is most useful in applications that are already XML enabled. These include
most modern application servers. DSML is especially useful in cases where direct
access to the directory would normally not be permitted. For example, consider a sit-
uation in which a firewall is blocking all traffic except HTTP. To get around this lim-
itation, a DSML encoding of a directory entry can be transmitted over the HTTP
protocol for interpretation and presentation. Such a situation is shown in figure 1.17.
LDAP Entry
AP
DSML File LD LDAP Server
HTTP/FTP/
SMTP/etc.
DSML-Enabled DSML
Application Service
Figure 1.17 DSML is useful for sharing directory information across fire-
walls that might limit direct access to directories.
Emerging standards like Simple Object Access Protocol (SOAP) make it clear that
LDAP will not be the only standard for sharing directory information in the future.
DIRECTORY MANAGEMENT 23
Directory with Delegated
Administration
Manufacturer
Employees
Supplier
Manufacturer Employees
Supplier
Distributor
Employees
Distributor
if not millions, of users. Trying to manage all these users centrally would be an incred-
ible effort.
By segmenting users by company and other means, you can push administration
of identities to primary contacts within each of the business partners, thereby reducing
administrative overhead. Aside from reducing administration costs, this approach also
ensures better accuracy by pushing identity management closer to the identities being
managed.
Information that is not related to identities and groups can still be difficult to man-
age with off-the-shelf products. This is the case primarily because little attention has
been paid to other advanced uses of directories, such as DEN, which require manage-
ment of more exotic information.
In chapter 7, we will look at managing all types of directory entries, complete
with example applications to reduce manual data entry and allow some degree of user
self-management.
User
Figure 1.19 Data in legacy systems is nearly always more useful than data in poorly
integrated new systems.
Directory Integration
User
Important Okay!
Business Important
Data Business
Data
Figure 1.20 Some level of directory integration is important in increasing the value of
applications using new directory services.
DIRECTORY INTEGRATION 25
Without any directory integration, it is often difficult to get more than a small
group of pioneers to quickly adopt the new applications. A new application may have
substantially better functionality, but without the proper data it will be difficult to
move the masses that use the legacy applications to the new environment. This issue
is demonstrated in figure 1.21.
Figure 1.21 It is difficult to move the masses to new applications based around a standards-
based directory when important information still resides only in a legacy directory.
Bi-Directional
Directory Integration
Interoperability!
Migration Path!
Figure 1.22 Synchronization is often necessary to offer a migration path from legacy to
new applications or interoperability where legacy applications will not be migrated.
Consolidating these two environments can vastly simplify management. For example,
you may find a way for a Unix-based system to use the same directory as your white
pages application to store password information.
However, not every connected data store is a candidate for consolidation. Take,
for example, a human resources application that relies on a set of database tables to
store information. It may not make sense from an application functionality perspec-
tive for that particular application’s data store to be consolidated into an enterprise
directory. Some of the information may fit better in relational databases for the rea-
sons we stated in section 1.2.1, whereas other information may not be a good
DIRECTORY INTEGRATION 27
1
2 Oracle Normalized
Database View
sjones
3
White Pages 1 2
Integration 3 4
Directory 5
sam.jones
4
5 HR Sam Jones
Database
sam jones
Attributes
1 Password 4 Department
2 Telephone 5 Manager
3 Email
Figure 1.23 Multiple data repositories typically store information about a person.
Deciding which attributes come from where and mapping them to a normalized
schema is an important part of any directory integration process. Note that the
word normalized here should not be confused with database normalization rules.
sional scan of a file-based list of changes, or a review of a full export from the connected
data store.
The join process is much more complicated and usually involves several steps. Its
most important job is determining that an object in one data source is the same as an
object in a second data source. This aggregation of information from multiple data
sources is one of the most important features of a metadirectory and the heart of the
join process. Other tasks performed by a metadirectory may include unification or
mapping of schema and object names, filtering unwanted information, and custom
processing and transformation of data. Figure 1.25 shows a relatively logical view of
how a metadirectory might work to provide a linkage between key enterprise infor-
mation repositories.
With careful planning, you can create an environment in which users can be cre-
ated at a single point. Then, the metadirectory service will instantiate a subset of the
ELIZA W. HUGGINS.
The Lord came to his garden, and gathered three fair flowers,
which now bloom in the city of our God. We, who knew their beauty,
come to lay our loving remembrances upon their graves.
Eliza Wilson Huggins was the third child of Alexander G. and
Lydia Huggins. She was born March 7, 1837, and died June 22, 1873.
She early gave herself to Jesus, and her lovely life was like a
strain of sacred music, albeit its years of suffering brought out
chords of minor harmony.
This young girl, in the dawn of womanhood, with gentle step
and loving voice, was a revelation to us who were younger than she.
Huguenot blood ran swiftly in her veins, and grief and joy were keen
realities to her sensitive soul. But she quieted herself as a child
before the Lord, and he gave her the ornament which is without
price. Though she wist not, her face shone, and we, remembering,
know that she had been with Jesus.
Her sister, Mrs. Holtsclaw, writes: “We are of Huguenot descent
on our father’s side. Our great-great-grandfather was born at sea in
the flight from France to England. Two brothers (in that generation
or the one following) came to America, one settling in North
Carolina, the other in New England. Our grandfather left North
Carolina when father was a small boy, because he thought slavery
wrong, and did not wish his children exposed to its influences.
“Grandmother Huggins was a sister of Rev. James Gilliland of
Red Oak, Ohio. She was a very earnest Christian, and often prayed
that her descendants, to the latest generation, might be honest,
humble followers of Jesus.
“Eliza was converted, and united with the church in Felicity,
Ohio, under the pastorate of Rev. Smith Poage. She was, I think,
about twelve years of age.”
She was a most loving daughter, sister, and friend, because she
had given herself unreservedly to Him who yearns to be more than
friend, mother, or brother to us all. When heavy bereavements came
upon the family, Jesus kept their hearts from breaking. The dear
father went the way of all the earth. Then a brother-in-law, who was
a brother indeed; then the elder brother, tried and true, in an instant
of time, speeds home to heaven; and again a younger brother, in his
bright youth; these three were the family’s offering upon the altar of
freedom. A costly offering! A heavy price paid! “Though he slay me,
yet will I trust in him.”
For seven years Miss Huggins taught school as continuously as
her health permitted. Her methods as a teacher were followed by
peculiar success. She loved children, and had a most earnest desire
to help them up to all that is best and wisest in life. Children know
by instinct whose is the firm yet loving hand stretched out to lead
them in the paths of pleasantness and peace. Some of this time she
taught in the mission school. Her sister says:—
“I cannot write of her long sickness, her intense suffering, her
patient waiting to see what the Lord had in store for her; all this is
too painful for me. St. Anthony, where she first came with such
bright hopes of finding health, was the place from which she went to
her long rest. It was the place where she found cure.
“The Dakota text-book, which she and Nannie prepared, was a
labor of much thought and prayer. It was not published until after
she had gone home.”
Mignonette and sweet violets may well be emblem flowers for
this lovely sister. Would that I might strew them on her grave, in the
early summer-time, as a farewell till we meet again.
JULIA LA FRAMBOISE.
“Ding lang, ding lang, ding lang! Hear the bells. The litters
are packed, the good-bys spoken. Thirteen years of work in
sorrow and in joy are over. ‘Good-by. We will pray for you all; do
not forget us.’
“Down the narrow street, past the closely crowded houses
of more crowded inmates, beyond the pale green of the
gardens, on the stony plain, and our long journey is begun.
“Eight hours and the first inn is reached, we having made a
twenty-five-mile stage. Over rocks and river, fertile lake-bed;
desert plain, and through mountain-gorge, we creep our way,
till, on the fifth day, the massive walls of Peking loom up before
us.
“Here there are cordial greetings from warm hearts, and
willing hands stretched out to help. Best of all is the inspiration
of mission meeting, with its glad, good news from Shantung
Province.
“By cart and by canal boat again away. At Tientsin we ride
by starlight, in jinrickshas, to the steamer. How huge the
monster! How broad seems the river, covered here and yonder,
and again yonder, with fleets of boats!
“We ensconce ourselves in the assigned state-rooms, and
little Anna’s foster-mother keeps a vigil by the child so soon to
be hers no more. ‘Farewell, farewell.’
“Gray morning comes, and the ponderous engine begins his
work. We move past boats, ships, steamers, past the fort at
Taku, out on the open sea. No one sings, ‘A Life on the Ocean
Wave,’ or ‘Murmuring Sea,’ for our ‘day of youth went yesterday.’
The enthusiasm of early years is gone. Instead, I read
reverently the 107th Psalm, verses 23, 31. Then with the
strong, glad, spray-laden breeze on one’s face, it is fitting to
read, ‘The Lord on high is mightier than the noise of many
waters, yea, than the mighty waves of the sea.’ ‘Let the sea
roar, and the fullness thereof. Let the floods clap their hands ...
before the Lord.’ ‘The sea is his and he made it.’ ‘The earth is
full of thy riches. So is this great and wide sea. There go the
ships: there is that leviathan, whom thou hast made to play
therein.’
“Five days, and we steam up through the low, flat, fertile
shores of Woo Sung River to Shanghai.
“Ho for the land of the rising sun! Two days we sail over a
silver sea; yonder is Nagasaki, and now a heavy rain reminds us
that this is Japan. On through the Inland Sea. How surpassingly
beautiful are the green hills and mountains on every side.
“At Kobe we receive a delightful welcome from Mr. C. H.
Gulick’s family, and on the morrow we meet our former co-
laborer in the Kalgan work, Rev. J. T. Gulick. Ten days of rest,
and our little Anna is herself again. She is round and fair and
sweet, and every one laughingly says she is more like our
hostess than like me.
“Again away, in a floating palace, fitly named City of Tokio.
We glide out of sight of Japan, with hearts strangely stirred by
God’s work in that land.
“One sail after another disappears, until we are alone on
the great ocean. Water, water, water everywhere.
“Our days are all alike. Constant care of the children and
thoughts of home and beloved ones keep hand and heart busy.
The events of each day are breakfast, tiffin, and dinner, daintily
prepared, and faultlessly served by deft and noiseless waiters.
We think it a pleasant variety when a stiff breeze makes the
waves run high. The table racks are on, yet once and again a
glass of water or a plate of soup goes over. We turn our plates
at the proper angle, when the long roll begins, and
unconcernedly go on.
“One day of waves mountain high, which sweep us on to
our desired haven. On the eighteenth day we see the shore of
beautiful America. How the heart beats! So soon to see father,
brothers, and sisters! Thank God. Aye, thank him too for the
manifold mercies of our journey.
“How strange and yet familiar are the sights and sounds of
San Francisco. The children’s eyes shine as they plan and
execute raids on a toy store.
“There is yet the land journey of thousands of miles. By
night and by day we speed on; across gorge, through tunnel
and snow-shed, over the alkali plains, over fertile fields to
Omaha.
“At last we arrive in Yankton, and a cheery voice makes
weary hearts glad. ‘I am Mr. Ward. Your brother Henry is here.’
Ah, is that Henry! How he has changed from boyhood to
manhood!
“‘Over the hills and far away.’ Here we are! How beautiful
the mission houses look! And the dear familiar faces! Rest and
home at last for a little while. ‘For here have we no continuing
city, but we seek one to come.’”
ebookbell.com