Centralized
User Management with Kerberos and LDAP
Travis Crawford
Many computing environments are designed to make network resources
available to users from any location, such as personal workstations,
public workstations, and the Web. User management is an important
part of this type of distributed computing environment because it
provides the consistent authentication and authorization service
necessary for universal access. Kerberos and LDAP are two protocols
that have been designed to solve the distributed authentication
and authorization problem.
Centralized management of user accounts solves a major problem
in distributed computing environments. Without centralization in
an environment with X users, Y computers, and Z services, we have
(X*Y)+(X*Z) accounts to manage. With centralization, we have X+Y+Z
accounts to manage.
In this article, I will provide an overview of user account management
with Kerberos and LDAP. I will describe the protocols and how they
work as well as their implementation. Finally, I will discuss how
to manage accounts using this new system.
Login Overview
The login process for a Linux system must first be understood
before it can be extended. The process begins with a user entering
credentials such as username and password into the login program
(step 1). Login uses the PAM abstraction layer to authenticate the
user (step 2). Typically, the pam_unix module (step 2.1)
is used to compare the password entered by the user to the hash
stored in the shadow file (2.2). If no entry exists in the
shadow file, the normal login process will fail. However,
this environment has Kerberos configured, and the pam_krb5
PAM module (2.3) authenticates the user by obtaining a ticket-granting-ticket
from the Kerberos server (2.4).
Authentication is only part of the login process. At this point,
login has verified that a user is who they claim to be. The authorization
phase determines whether the user is allowed to use this resource.
Login uses the name service switch (step 3) to look up user information,
such as uid number, shell, and home directory. Typically, the nss_files
module (3.1) looks up this information in the passwd file
(3.2). If the user information is not found locally, this environment
uses the nss_ldap module (3.3) to look up the user information
from the LDAP server (3.4). The success or failure of this login
attempt is reported to the system logger (4), and finally, if steps
2 and 3 are completed successfully, the user is granted access (5)
(see Figure 1).
Kerberos
The Kerberos protocol is designed to securely authenticate users
over an insecure network and to enable single sign-on. A trusted
third party and strong cryptography are used to meet these goals.
Passwords are never sent over the network while using Kerberos.
Additionally, mutual authentication verifies the identity of both
parties involved in any communication. Finally, single sign-on securely
authenticates users automatically after they have logged into the
realm.
Kerberos tickets are analogous to a weekend pass at a ski resort.
Upon arrival, one obtains a passcard that is valid for a limited
period of time. At each mountain, the passcard can be used to obtain
a lift ticket. At the end of the weekend, the passcard expires as
well as all lift tickets. Kerberos calls its weekend passcard a
Ticket Granting Ticket (TGT), which is by default valid for the
length of a typical work day. TGTs are used to obtain service tickets
that grant access to a specific service, such as LDAP. Additional
service tickets must be obtained for additional services.
While this method was first implemented at MIT, Roger Needham
and Michael Schroeder designed much of the original protocol at
the Xerox Palo Alto Research Center. Their research included both
public and private key cryptography and compared the strengths and
weaknesses of each method. They concluded that private key cryptography
was superior for a network authentication system because it required
fewer protocol operations per transaction while remaining equally
secure.
Kerberos was first released to the public as Kerberos-4, with
the first three releases used internally at MIT; the current release
is Kerberos-5. Because of the export controls on strong encryption
technologies, an independent Kerberos implementation called Heimdal
has been developed at the Center for Parallel Computers in Sweden.
Both implementations are well supported and are functionally the
same.
Kerberos is an Internet standards track protocol defined in RFC
1510: The Kerberos Network Authentication Service (V5).
Protocol
The Kerberos protocol is designed to securely authenticate users
over an insecure network and to enable single sign-on. With these
goals in mind, we define two major modes of operation. Initial sign-on
(ISO) describes the mode in which a user authenticates as a principal
in a Kerberos realm, a concept similar to logging in as a user to
a Windows domain. Successful completion of ISO provides the user
with a ticket-granting ticket, an electronic ID card that verifies
the identity of its owner. Single sign-on (SSO) describes the mode
in which a user authenticates to an application in the Kerberos
realm; this authentication is automatically performed for the user
by the Kerberos client. SSO enables users to enter their username
and password just once per computing session.
Initial Sign-On
Initial sign-on describes the following Kerberos Authentication
Service protocol exchange:
1. Client to Kerberos: Authentication service request (KRB_AS_REQ)
2. Kerberos to Client: Authentication service reply (KRB_AS_REP)
or Error (KRB_ERROR)
The KRB_AS_REQ request message is constructed by a Kerberos
client and sent to a Kerberos server. This plain-text message contains
the client identity assertion, local time, authentication server
principal name, and requested lifetime. The client identity assertion
is described as such because a user may attempt to acquire the credentials
of a different user; this type of brute force attack is preventable
with pre-authentication and will be discussed later. The client's
local time is used to ensure reasonably synchronized clocks; although
the request message does not rely on synchronized clocks, future
protocol operations do, and this helps prevent errors later on.
The authentication server principal name is usually krbtgt/INSTANCE@REALM.
The requested lifetime is used to request a non-default ticket lifetime.
Pre-authentication is used to prevent the construction of request
messages with arbitrary principal names. In response to KRB_AS_REQ
request messages for a principal that requires pre-authentication,
the Kerberos server returns an encrypted challenge value inside
a KRB_ERROR error message. The client must decrypt the challenge
value with the user's password and resend the KRB_AS_REQ
request message with the appended challenge value. If the server
accepts the challenge response, a KRB_AS_REP reply message
is constructed and sent to the client. Note that the user has been
authenticated without sending his or her password over the network,
even in encrypted form.
The KRB_AS_REP reply message is constructed by a Kerberos
server and sent to clients in response to KRB_AS_REQ request
messages. This message, encrypted with the user's password, contains
the user's copy of the unique session key, authentication server
principal name, ticket lifetime, and TGT encrypted with the authentication
server's password. The encrypted TGT contains the authentication
server's copy of the unique session key, client principal name,
ticket lifetime, timestamp, and client IP address.
Subsequent communication is encrypted with the session key known
only to client and server that is valid for a limited time, for
a specific user, from a specific host. These checks ensure that,
in the event a KRB_AS_REP reply message is captured and decrypted,
the TGT is invalid because either the IP address is incorrect or
the ticket lifetime has been exceeded.
The session key contained in a KRB_AS_REP reply message
is a private encryption key known only to client and server and
is valid only for the current session. Encrypting client to Kerberos
server and client to application server communication with unique
session keys increases security in several ways. First, every two
principals in a Kerberos realm that wish to communicate have a unique
session key, thus providing mutual authentication. Second, breaking
the encryption on a single session is time sensitive because tickets
expire after a period of time.
While confusing at first, the ISO process becomes clear with some
inspection. Clients construct a clear-text request message for a
TGT that is sent to the server. If pre-authentication is enabled,
the server returns an error message that includes a challenge value
encrypted with the user's password. The client decrypts the challenge
value and appends it to a second TGT request message. The server
has now verified the user's identity and sends the client a reply
message containing a TGT encrypted with the user's password. The
client decrypts the TGT and is authenticated.
Single Sign-On
Single sign-on describes the following Kerberos Authentication
Service protocol exchange:
1. Client to Kerberos: Authentication service request (KRB_AS_REQ).
2. Kerberos to Client: Authentication service reply (KRB_AS_REP)
or Error (KRB_ERROR).
3. Client to Application server: Application request (KRB_AP_REQ)
4. [Optional] Application server to Client: Application Reply
(KRB_AP_REP) or Error (KRB_ERROR).
The KRB_AS_REQ authentication service request message is
constructed by a Kerberos client and sent to a server, similar to
ISO, except that the authentication server principal name is replaced
with the application server principal name. The KRB_AS_REP
authentication server reply message contains the user's copy of
a unique session key and a service ticket encrypted with the application's
password.
After acquiring a service ticket, the client constructs a KRB_AP_REQ
application request message and sends it to the application. This
message contains the service ticket and authenticator encrypted
with the session key; the authenticator contains a timestamp and
client principal name. The application decrypts the service key
with its password and decrypts the authenticator with the session
key. Mutual authentication is achieved because only the appropriate
application can decrypt the service ticket, and only the appropriate
client has knowledge of the session key to encrypt the authenticator.
Installation and Configuration
Before configuring Kerberos, it is important to decide which implementation
to use. Two major Kerberos implementations are freely available
for Linux: MIT Kerberos and Heimdal. Both implementations are stable,
well supported, and have an active user base. The major difference
is that Heimdal is developed outside the United States and therefore
is not subject to export control restrictions; many free operating
systems use Heimdal for that reason.
The following installation and configuration description is based
on MIT Kerberos on Fedora. Begin by downloading the source code
from the MIT Web site or installing the krb5-servers and
krb5-workstation packages. The default installation path
for the source distribution is /usr/local and the packages
install to /usr/kerberos.
A new Kerberos server configuration comprises the following steps:
1. The Kerberos configuration file krb5.conf sets defaults
used during the configuration process.
2. [libdefaults]
3. default_realm = EXAMPLE.EDU
4.
5. [realms]
6. EXAMPLE.EDU = {
7. kdc = kerberos.example.edu:88
8. admin_server = kerberos.example.edu:749
9. }
10. Initialize a new Kerberos database using kdb5_util.
The -s option is used to create a stash file that includes
the master database password for unattended server startup.
11. kdb5_util create -s
12. Create administrative and regular users and policies using
kadmin.local.
This administrative interface directly modifies the Kerberos database
and must be run as root on the KDC; use this interface because no
principals currently exist with which to log in. Use kadmin
after creating the administrative principal and setting the appropriate
access control list.
Kerberos-5 principals are written in the form username/instance@REALM,
where username is a user's unique name, instance is an optional
group (such as admin), and realm is the realm name in which
this ticket is valid.
Create the administrative and default policies:
# kadmin.local -q "addpol -maxlife \"1 month\" -minlength 8 \
-minclasses 3 admin"
# kadmin.local -q "addpol -maxlife \"3 months\" -minlength 8 \
-minclasses 3 default"
Create an administrative and regular principal for testing the environment:
# kadmin.local -q "addprinc -policy admin +requires_preauth travis/admin"
Authenticating as principal root/admin@EXAMPLE.EDU with password.
Enter password for principal "travis/admin@EXAMPLE.EDU":
Re-enter password for principal "travis/admin@EXAMPLE.EDU":
Principal "travis/admin@EXAMPLE.EDU created.
# kadmin.local -q "addprinc travis"
Authenticating as principal root/admin@EXAMPLE.EDU with password.
NOTICE: no policy specified for travis@EXAMPLE.EDU; assigning "default"
Enter password for principal "travis@EXAMPLE.EDU":
Re-enter password for principal "travis@EXAMPLE.EDU":
Principal "travis@EXAMPLE.EDU created.
13. Edit the kadmind access control list. /var/kerberos/krb5kdc/kadm5.acl.
This file contains a list of principals that are authorized to perform
administrative tasks. From the kadmind(8) man page we find
the following access controls. If the character is lowercase, then
the operation is permitted; if the character is uppercase, then the
operation is disallowed.
14. a -- [Dis]allows the addition of principals or policies
in the database.
15. d -- [Dis]allows the deletion of principals or policies
in the database.
16. m -- [Dis]allows the modification of principals
or policies in the database.
17. c -- [Dis]allows the changing of passwords for principals
in the database.
18. i -- [Dis]allows inquiries to the database.
19. l -- [Dis]allows the listing of principals or policies
in the database.
20. x -- Short for admcil.
21. * -- Same as x.
A simple ACL that allows all principals with an administrative
instance full control may be sufficient in small environments, while
more complex lists may be required in environments with distributed
support groups:
*/admin@EXAMPLE.EDU *
22. Start the krb5kdc and kadmind services and test
that everything works by logging into kadmin with the principals
you created.
A minimal Kerberos server is now configured and should be adequate
for testing purposes. Before using in a production environment,
be sure to read the man pages and understand very well what you
are doing.
Backup and Restore
Several methods are available for backing up the Kerberos-5 database,
including a full filesystem backup and Kerberos database dump. The
recommended backup method is to use the dump mode of kdb5_util(8).
As root, stop the server process, dump the Kerberos database, and
then restart the process:
service krb5kdc stop
kdb5_util dump kerberos-backup.txt
service krb5kdc start
The backup file is encrypted with either the KDC password or dump-specific
password if the mkey_convert option is used. Write this file
to tape or a remote filesystem and protect it to the same extent as
the live KDC; compromising the backup database is as dangerous as
compromising the live database.
Restore the KDC database using the load mode of kdb5_util.
Load creates a new database containing only the principals in the
dump file, overwriting any existing principals. Existing principals
are kept when using the update option. As root, stop the server
process, load the Kerberos database, and then restart the process:
service krb5kdc stop
kdb5_util load kerberos-backup.txt current-database
service krb5kdc start
A Kerberos database into which the backup will be loaded must already
exist.
LDAP
The Lightweight Directory Access Protocol (LDAP) defines a method
to search and modify a remote database. Directory services are used
to reduce the number of administrative data repositories in an organization.
LDAP has its roots in the X.500 series of specifications, a worldwide
directory service complete with protocol, object classes, attribute
types, authentication framework, and replication. The directory
as defined was so thorough in its design that it became difficult
to implement. The complexity of implementation was not limited to
servers; clients were difficult to write as well. The University
of Michigan recognized this limitation and created LDAP, a gateway
to X.500 servers with a simple client interface. By making LDAP
clients easier to implement, more applications began to use the
directory, thus making it more useful. Eventually the gateway became
the first standalone LDAP server.
LDAP is an Internet standards track protocol defined in RFC 2251:
Lightweight Directory Access Protocol (v3).
Protocol
LDAP directory access operations describe the following protocol
exchange:
1. Client to server: Bind request
2. Server to client: Bind result
3. Client to server: Search request
4. Server to client: Search entry
5. Server to client: Search result
6. Client to server: Unbind request
The bind request message is constructed by an LDAP client
and sent to an LDAP server. It indicates the beginning of a new
connection and contains the distinguished name and password credentials
with which to bind. LDAP supports several authentication methods
(specified by the Auth Type), including Kerberos through the GSSAPI,
so this data may or may not be encrypted, depending on how the server
is configured.
Servers respond with a bind result message to bind request
messages. A result code, such as success, or error message indicates
whether the bind was successful and whether the connection should
continue.
Once bound, the client sends a search request message that
contains a Base DN, scope, and filter. The Base DN, such as ou=people,dc=example,dc=edu,
specifies where in the namespace hierarchy to start the search.
For example, a search for user accounts might be limited to the
user section of the namespace and omit searching application settings.
The scope specifies how deep to look and may be base (base
DN only), oneLevel (children of the base DN), or sub
(all entries below the base DN). Finally, the search filter specifies
what to look for.
Search filters are written in the form attribute=value
and may be combined with a subset of boolean operators. To find
the entry that represents my user account, I would construct a query
such as (&(objectClass=posixAccount)(uid=travis)). Most
LDAP-aware applications take care of constructing the search filter;
however, the command-line program ldapsearch allows you to
specify a custom filter. You might be surprised at how much information
can be extracted from public LDAP servers by constructing custom
queries because many sites implement access control, not in the
LDAP server itself, but in their Web-based front-end.
The search entry message is sent from server to client,
with one message per entry matching the search filter. These messages
contain the distinguished name and all associated attribute/value
pairs. The results are either returned printed to the screen or
returned to the application as an array for processing. The Search
result message is sent from server to client to indicate a successful
operation after all search entry messages have been sent.
Finally, an unbind request message is sent from client
to server to indicate no additional search requests will be sent.
This implies that multiple search requests may be sent during a
single connection, which reduces overhead.
Schema
The LDAP schema defines what data can be stored in the directory.
It is the collection of attribute types and object classes that
are valid. Attribute types define a specific type of variable for
use in the directory. It defines the name, matching rule, and whether
the attribute may be defined multiple times for a specific entry.
Directory-enabled applications use attribute types to store their
data.
RFC2307 defines a schema that enables Linux clients to store user
accounts in a directory server. The nis.schema file packaged
with OpenLDAP implements RFC2307 and provides the attribute and
object class definitions to store the contents of /etc/passwd,
/etc/shadow, and /etc/group in a directory. Providing
the functionality of these files in the directory allows it to replace
local databases throughout an organization.
Structural object classes typically represent real-world objects,
such as people or organizations. Every LDAP entry has exactly one
structural object class but may have additional auxiliary object
classes. For example, the structural object class person
represents a person, and the auxiliary object classes posixAccount
and shadowAccount represent the person's computer account.
Object classes and attributes are defined in the schema files included
with directories and directory-enabled applications.
Directory entries with structural object class person represent
individual people who may or may not have a computer account:
objectclass ( 2.5.6.6 NAME 'person' SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
Directory entries with auxiliary object class posixAccount
represent user accounts by allowing attributes that map directly to
each field in the /etc/passwd file:
objectclass ( 1.3.6.1.1.1.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 ) )
Directory entries with auxiliary object class shadowAccount
allow attributes that map directly to each field in the /etc/shadow
file:
objectclass ( 1.3.6.1.1.1.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 ) )
Directory entries with the object class posixGroup represent
groups; these entries are used to replace the /etc/group file:
objectclass ( 1.3.6.1.1.1.2.2 NAME 'posixGroup' SUP top STRUCTURAL
DESC 'Abstraction of a group of accounts'
MUST ( cn $ gidNumber )
MAY ( userPassword $ memberUid $ description ) )
Attributes are given a name, unique object identifier, matching rule,
and type. The object type specifies whether this attribute may exist
more than once for the same entry. For example, the homeDirectory
attribute may be assigned only once to an entry and, like all Linux
path names, is case sensitive:
attributetype ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory'
DESC 'The absolute path to the home directory'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
Configure the Server
The OpenLDAP configuration file slapd.conf contains configuration information for the OpenLDAP server. It should not be world-readable because several secret pieces of information must be stored in it, such as the root directory account and password and access control list definitions. Schema files that represent Linux user accounts and groups must be imported and the schema check enabled to ensure the schema are followed:
# Linux user accounts (objectClass posixAccount) are defined in
# nis.schema
# core.schema and cosine.schema are required by nis.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
schemacheck on
Logging will be very useful when configuring the server; the level of verbosity is specified with the loglevel option:
# Messages are logged to LOCAL4
# Add "local4.* /var/log/slapd.log" to your syslogd configuration
loglevel 256
The database section of slapd.conf specifies the backend database in which the directory will be stored. Specify the database format, where to store the database files, mode for new files, and the directory suffix:
# back-end database configuration
database ldbm
directory "/var/lib/ldap"
mode 0600
suffix "dc=example,dc=edu"
The root directory user specifies a distinguished name that, when bound as, has no search or modify restrictions. Although the password may be stored in this file as plain text, that practice is highly discouraged; use a password hash instead. Again, ensure the permissions on the configuration file prevent read access:
# root directory user account
rootdn "cn=Manager,dc=example,dc=edu"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
SASL AND GSSAPI
OpenLDAP does not directly support Kerberos-5 authentication. However, support is available through the SASL GSSAPI mechanism. The Simple Authentication and Security Layer (SASL) is a framework for integrating external authentication methods into an existing protocol. SASL does not provide any authentication methods of its own; it simply provides a framework to integrate third-party authentication services. One supported SASL authentication source is Kerberos-5, which is accessed via the Generic Security Services Application Programming Interface (GSSAPI):
LDAP <--> SASL <--> GSSAPI <--> Kerberos
The following options are available in slapd.conf for enabling Kerberos support. Specify the server, realm, and security properties:
sasl-host kerberos.example.edu
sasl-realm EXAMPLE.EDU
sasl-secprops noplain,noactive,noanonymous
The sasl-secprops option specifies which security options to use; the above listed values are sufficient for GSSAPI.
When GSSAPI is used as an authentication source, slapd.conf ACL entries must be modified because GSSAPI-distinguished names end with cn=gssapi,cn=auth. To allow all users who authenticate with GSSAPI to have read access, machines to have read access, and everyone to have no access, use an ACL similar to the following:
access to *
by dn.children="cn=gssapi,cn=auth" read
by dn.children="ou=Machines,dc=example,dc=edu"
by anonymous auth
A Kerberos principal must be created for LDAP, and the LDAP server keytab must be updated. Ensure slapd has read access to the keytab:
kadmin -q "addprinc -randkey ldap/ldap.example.edu@EXAMPLE.EDU"
kadmin -q "ktadd ldap/ldap.example.edu@EXAMPLE.EDU"
Clients can query the LDAP server using GSSAPI for authentication by first obtaining a TGT and specifying the appropriate SASL mechanism:
kinit travis
ldapsearch "(uid=travis)" -Y gssapi
Transport Layer Security
Transport Layer Security (TLS) is the evolution of SSL and is used to encrypt the communication between hosts at the transport layer. Enabling TLS first requires the creation of a digital certificate and key:
/usr/local/ssl/misc/CA -newcert
The script will prompt you for several pieces of information, such as country, state, etc. These values can be filled with whatever you like, except for the common name of your server. This must be the DNS name of your LDAP server or TLS will not work. List the required cipher strength, certificate, and key in:
slapd.conf.
TLSCipherStrength HIGH
TLSCertificateFile /etc/openldap/ldap-key-cert.pem
TLSCertificateKeyFile /etc/openldap/ldap-key-cert.pem
Backup and Restore
A comprehensive backup strategy will allow the directory to be restored after a disaster, user error, or malicious network attack. Two methods are available for backing up directory data: back up the entire filesystem on which the directory database is stored, or create an LDIF file containing all directory entries. The dump and restore commands are used to back up and restore entire filesystems. The slapcat and slapadd commands are used to create and restore LDIF files.
Creating then archiving an LDIF file is the recommended backup method because the format is server independent and stored as ASCII text rather than in binary format. This allows an administrator to make changes or correct errors before restoring the directory. As root, stop the LDAP server, write the directory contents to a file on disk, and then restart the server:
service ldap stop
slapcat > directory-backup.ldif
service ldap start
This method may be unacceptable because it requires stopping the service. In a replicated environment, a slave server may be used to export the database, thus keeping the service available.
The directory-backup.ldif file may be copied to tape or a remote file system for safekeeping. Security of the backup is critical because access control restrictions are implemented in the LDAP server, not the data file itself. This file is organized in superior first order, the same format that slapadd requires. The directory may be restored with:
service ldap stop
slapadd < directory-backup.ldif
service ldap start
The LDAP server must be properly configured, purged of any old data, and not running before data can be added.
Client Configurations
Each Linux client must be configured to authenticate users and look up account information over the network rather than to use the default local databases. These network services should be transparently accessed to make the login process easy for the user. Kerberos and Pluggable Authentication Modules (PAM) implement authentication, while LDAP and the Name Service Switch (NSS) implement look up of user information in the directory.
Kerberos Client Configuration
The Kerberos client configuration file /etc/krb5.conf specifies the local realm name and other parameters needed for authentication. More information is available in krb5.conf(5):
[libdefaults]
default_realm = EXAMPLE.EDU
[realms]
EXAMPLE.EDU = {
kdc = kerberos.example.edu:88
admin_server = kerberos.example.edu:749
}
Pluggable Authentication Modules
PAM is the Linux subsystem that handles authentication tasks on behalf of applications. It breaks down authentication into four distinct tasks: authentication, account management, session management, and password management. Authentication verifies the user is who he or she claims to be. Account management determines whether the authenticated user is permitted access at this time. Session management functions trigger events at login and logout, such as writing log entries. Password management functions change users' passwords.
PAM-aware applications can be configured globally with /etc/pam.conf or individually with files in /etc/pam.d. The presence of the /etc/pam.d directory causes the global configuration file to be ignored. The pam_stack.so module can be used to include configuration files.
We enable the Kerberos authentication service in PAM by adding the pam_krb5.so module to the appropriate PAM stack, such as the system-auth file that is included in most application configurations. Enable Kerberos for authentication and password tasks:
# /etc/pam.d/system-auth
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_krb5.so use_first_pass
auth required pam_deny.so
account required pam_unix.so
password required pam_cracklib.so retry=3 type=
password sufficient pam_unix.so nullok use_authtok md5 shadow
password sufficient pam_krb5.so use_authtok
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
After enabling Kerberos authentication in PAM, test the configuration by logging in with Kerberos credentials. More information is available in pam(8), The Linux-PAM System Administrators' Guide, and The Linux-PAM Module Writers' Guide (see References).
LDAP Client Configuration
The LDAP client configuration file /etc/ldap.conf specifies server connection parameters. More information is available in ldap.conf(5):
uri ldaps://ldap.example.edu
base dc=example,dc=edu
Name Service Switch
The NSS specifies where to look up name information and in what order. Traditionally, names were looked up in the passwd file by each application. The introduction of NSS allowed multiple name services by abstracting the lookup request from the actual lookup. Programs now make a request to NSS for a lookup and the appropriate library is used. Specify LDAP as a source for user account and group information in nsswitch.conf(5):
passwd: files ldap
shadow: files ldap
group: files ldap
Each line specifies a type of information to look up, followed by a list of locations in which to look it up. Local files are first consulted for account information. If a user account does not exist locally, the LDAP server is queried. This allows local users to still log in if the LDAP server is unavailable. After LDAP and NSS are configured, user account information may be looked up in the directory.
Configuration Tools
Most Linux distributions have tools for configuring Kerberos, PAM, LDAP, and NSS. Red Hat and Fedora users have authconfig(8) and the GUI-equivalent, authconfig-gtk, for reconfiguring an existing installation and Kickstart for new installations. Kickstart allows an administrator to automate the installation process by providing an answer file for common configuration questions, such as authentication and user account lookup methods. Check the documentation of your distribution for more information on configuration tools.
Account Management
The creation, modification, and deletion of user accounts on a single Unix system are simple tasks with the user{add|mod|del}, group{add|mod|del} and passwd commands. These commands are not compatible with Kerberos or LDAP, so we must look elsewhere for user management tools.
Administrative Tools
Kadmin is the Kerberos administrative interface for use over a network. It can be used to create, modify, and delete principals and policies. It authenticates using Kerberos and supports both command-line and interactive use. Kadmin replaces the passwd command in this environment.
Change password utility (CPU) is a user and group management tool that supports an LDAP backend. CPU replaces user{add|mod|del}, and group{add|mod|del}, making it a useful tool in our environment, performing most user and group management tasks.
Kadmin uses the main Kerberos configuration file krb5.conf(5). CPU uses the configuration file cpu.conf. Most of the defaults are sensible; however, be sure to change the connection parameters and directory suffix. See cpu.conf(5) for more information.
Password Policies
The policies feature allows an administrator to set password requirements such as length and number of required character classes. Specific policies may be assigned to principals during creation; if it exists, the policy named "default" is used when no policy is specified. See kadmin(8) for more addpol options:
kadmin -q "addpol -maxlife \"90 days\" -minlength 8 -minclasses 3 default"
kadmin -q "addpol -maxlife \"30 days\" -minlength 12 -minclasses 3 admin"
Creating Accounts
Users, machines, and services are represented as principals in the Kerberos database. Password and account aging similar to chage is supported, along with some Kerberos-specific options such as pre-authentication. It is recommended to assign each user the default policy, as well as to require pre-authentication. See kadmin(8) for more add_principal options.
The workflow for creating a user account in an environment with Kerberos and LDAP is very similar to creating users on a traditional Unix system. Create the user account with an LDAP-aware tool such as cpu, then create the Kerberos principal. These steps are very similar to creating a user with useradd and setting the password with passwd. Principals with an administrative instance typically do not require an LDAP user account because these principals are reserved for Kerberos administrative tasks only:
cpu useradd travis
kadmin -q "addprinc -policy admin travis/admin"
kadmin -q "addprinc travis"
Disabling Accounts
Users come and go, so occasionally user accounts will need to be disabled. The process of disabling an account is similar to the method used with passwd and shadow files. We delete the user's Kerberos principal to prevent password-based authentication and change the user's shell to /sbin/nologin to prevent authentication with SSH keys. This method preserves a record of the user and ensures the uid is not reused. Remember to remove all principals for the users, such as their principal with an administrative instance:
kadmin -q "delprinc travis"
cpu usermod -s /sbin/nologin travis
References
MIT Kerberos Site -- http://web.mit.edu/kerberos/
RFC 1510 (Kerberos specification) -- http://www.ietf.org/rfc/rfc1510.txt
Kerberos FAQ -- http://www.cmf.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html
Heimdal -- http://www.pdc.kth.se/heimdal/
Fedora -- http://fedora.redhat.com/
comp.protocols.kerberos -- http://www.google.com/groups?group=comp.protocols.kerberos
Needham, R., and M. Schroeder. "Using Encryption for Authentication in Large Networks of Computers." Communications of the ACM, 21(12):993-999.
Carter, Gerald. 2003. LDAP System Administration. O'Reilly & Associates.
RFC 2251 (LDAP specification) -- http://www.ietf.org/rfc/rfc2251.txt
Linux-PAM System Administrator's Guide -- http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html
Linux-PAM Module Writer's Guide --http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_modules.html
Garman, Jason. 2003. Kerberos: The Definitive Guide. O'Reilly & Associates.
Howes, T., M.G. Smith, and G.S. Good. 2003. Understanding and Deploying LDAP Directory Services, 2nd Ed. Addison-Wesley.
Change Password Utility -- http://cpu.sourceforge.net/
Travis Crawford is a Systems Administrator at Google, where he works with large Linux clusters, and recently a graduate of the Rochester Institute of Technology where he studied Information Technology. He can be reached at traviscrawford@gmail.com. |