281 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
		
		
			
		
	
	
			281 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
| 
								 | 
							
								<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
							 | 
						||
| 
								 | 
							
								<html>
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
							 | 
						||
| 
								 | 
							
								<title>LDAP Authentication for Linux</title>
							 | 
						||
| 
								 | 
							
								<link rel="stylesheet" type="text/css" href="index.css">
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								<body>
							 | 
						||
| 
								 | 
							
								<div class="title">LDAP Authentication for Linux</div>© 2002 by
							 | 
						||
| 
								 | 
							
								<a href="http://www.metaconsultancy.com">metaconsultancy</a><br>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								LDAP is a directory server technology that allows information such
							 | 
						||
| 
								 | 
							
								as usernames and passwords for an entire site to be stored on a central
							 | 
						||
| 
								 | 
							
								server.
							 | 
						||
| 
								 | 
							
								This whitepapers describes how to set up a Linux workstation
							 | 
						||
| 
								 | 
							
								to use an LDAP server for user information and authentication.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Before proceeding, you will need a working LDAP server which can
							 | 
						||
| 
								 | 
							
								provide you with user information. If you need to set one up,
							 | 
						||
| 
								 | 
							
								consult our <a href="ldap.htm">OpenLDAP whitepaper</a> for
							 | 
						||
| 
								 | 
							
								instructions.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								User information consists of such data as mappings between user id numbers
							 | 
						||
| 
								 | 
							
								and  user names (used, for example, by <span class="in">ls -l</span>), or home directory
							 | 
						||
| 
								 | 
							
								locations (used, for example, by <span class="in">cd ~</span>). Lookups of such information
							 | 
						||
| 
								 | 
							
								are handled by the name service subsystem, configured in the file
							 | 
						||
| 
								 | 
							
								<span class="path">/etc/nsswitch.conf</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Authentication (password checking), on the other hand, is handled by the
							 | 
						||
| 
								 | 
							
								PAM (plugable authentication module) subsystem, configured in the
							 | 
						||
| 
								 | 
							
								<span class="path">/etc/pam.d/</span> directory.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								While these two subsystems can (in fact must) be configured seperately,
							 | 
						||
| 
								 | 
							
								you will likely want both to use LDAP.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="section">
							 | 
						||
| 
								 | 
							
								<span class="section">nss-ldap</span>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Begin by installing the shared library code necessary for the
							 | 
						||
| 
								 | 
							
								name service to use ldap.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script"><pre class="code">
							 | 
						||
| 
								 | 
							
								# <span class="in">apt-get install libnss-ldap</span>
							 | 
						||
| 
								 | 
							
								</pre></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Next, open the <span class="path">/etc/nsswitch.conf</span> file, and tell the
							 | 
						||
| 
								 | 
							
								name service subsystem to use LDAP to obtain user information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">nsswitch.conf</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								passwd:    files ldap
							 | 
						||
| 
								 | 
							
								group:     files ldap
							 | 
						||
| 
								 | 
							
								shadow:    files ldap		
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Note that we do not eliminate the use of flat files, since some
							 | 
						||
| 
								 | 
							
								users and groups (e.g. root) will remain local. If your machines do not
							 | 
						||
| 
								 | 
							
								use flat files at all and your LDAP server goes down, not even
							 | 
						||
| 
								 | 
							
								root will be able to log in.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Finally, you need to tell then name service subsystem how to talk
							 | 
						||
| 
								 | 
							
								to your LDAP server. This is done in the file
							 | 
						||
| 
								 | 
							
								<span class="path">/etc/libnss-ldap.conf</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">libnss-ldap.conf</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								uri ldap://ldap.example.com/ ldap://ldap-backup.example.com/
							 | 
						||
| 
								 | 
							
								base dc=example, dc=org
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The uri directive specifies the domain name (or IP address) of your LDAP
							 | 
						||
| 
								 | 
							
								server. As our example illustrates, you can specify multiple LDAP servers,
							 | 
						||
| 
								 | 
							
								in which case they will be employed in failover fashion.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The base directive specifies the root DN at which searches should start.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For additional information on these and other configuration directives,
							 | 
						||
| 
								 | 
							
								<span class="in">man libnss-ldap.conf</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								nss-ldap expects accounts to be objects with the following attributes: uid,
							 | 
						||
| 
								 | 
							
								uidNumber, gidNumber, homeDirectory, and loginShell. These attributes are 
							 | 
						||
| 
								 | 
							
								allowed by the objectClass posixAccount.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								There is a simple way to verify that your name service subsystem is using
							 | 
						||
| 
								 | 
							
								your LDAP server as instructed. Assign a file to be owned by a user that
							 | 
						||
| 
								 | 
							
								exists only in the LDAP database, not in <span class="path">/etc/passwd</span>. If
							 | 
						||
| 
								 | 
							
								an <span class="path">ls -l</span> correctly shows the username, then the name service
							 | 
						||
| 
								 | 
							
								subsystem is consulting the LDAP database; if it just shows the user number,
							 | 
						||
| 
								 | 
							
								something is wrong.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For example, if the user john, with user number 1001, exists only in
							 | 
						||
| 
								 | 
							
								LDAP, we can try
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script"><pre class="code">
							 | 
						||
| 
								 | 
							
								# <span class="in">touch /tmp/test</span>
							 | 
						||
| 
								 | 
							
								# <span class="in">chown 1001 /tmp/test</span> 
							 | 
						||
| 
								 | 
							
								# <span class="in">ls -l /tmp/test</span>
							 | 
						||
| 
								 | 
							
								-rw-r-----     1 john     users         0 Jan  1 12:00 test
							 | 
						||
| 
								 | 
							
								</pre></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								to determine whether the the name service is using LDAP.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="section">
							 | 
						||
| 
								 | 
							
								<span class="section">pam-ldap</span>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Next we configure the PAM subsystem to use LDAP for passwords. Begin by
							 | 
						||
| 
								 | 
							
								installing the necessary PAM module.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script"><pre class="code">
							 | 
						||
| 
								 | 
							
								# <span class="in">apt-get install libpam-ldap</span>
							 | 
						||
| 
								 | 
							
								</pre></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The configuration file for the <span class="path">pam_ldap.so</span> module is
							 | 
						||
| 
								 | 
							
								<span class="path">/etc/pam_ldap.conf</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">pam_ldap.conf</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								uri ldaps://ldap.example.com/
							 | 
						||
| 
								 | 
							
								base dc=example,dc=com
							 | 
						||
| 
								 | 
							
								pam_password exop
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The uri and base directives work the same way they do for
							 | 
						||
| 
								 | 
							
								<span class="path">/etc/libnss_ldap.conf</span> and <span class="path">/etc/ldap/ldap.conf</span>.
							 | 
						||
| 
								 | 
							
								Notice that we have used ldaps to ensure that connections over which
							 | 
						||
| 
								 | 
							
								passwords are exchanged are encrypted.
							 | 
						||
| 
								 | 
							
								The directive "pam_password exop" tells pam-ldap to change passwords in
							 | 
						||
| 
								 | 
							
								a way that allows OpenLDAP to apply the hashing algorithm specified
							 | 
						||
| 
								 | 
							
								in <span class="path">/etc/ldap/slapd.conf</span>, instead of attempting to hash
							 | 
						||
| 
								 | 
							
								locally and write the result directly into the database.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								pam-ldap assumes accounts to be ojbects with the following attributes:
							 | 
						||
| 
								 | 
							
								uid and userPassword. The attributes are allowed by the objectClass
							 | 
						||
| 
								 | 
							
								posixAccount.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								We are now ready to configure individual services to use the LDAP server
							 | 
						||
| 
								 | 
							
								for password checking. Each service that uses PAM for authentication has
							 | 
						||
| 
								 | 
							
								its own configuration file <span class="path">/etc/pam.d/service</span>.
							 | 
						||
| 
								 | 
							
								To configure a service to use LDAP for password-checking, you must modify
							 | 
						||
| 
								 | 
							
								its PAM configuration file.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								To avoid an in-depth explanation of PAM, we will
							 | 
						||
| 
								 | 
							
								content ourselves with a few examples. Consider first the login program,
							 | 
						||
| 
								 | 
							
								which handles logins from the text console. A typical PAM stack which
							 | 
						||
| 
								 | 
							
								checks passwords both in <span class="path">/etc/passwd</span> and in the LDAP database
							 | 
						||
| 
								 | 
							
								follows.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">/etc/pam.d/login</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								auth        required      pam_nologin.so
							 | 
						||
| 
								 | 
							
								auth        sufficient    pam_ldap.so
							 | 
						||
| 
								 | 
							
								auth        sufficient    pam_unix.so shadow use_first_pass
							 | 
						||
| 
								 | 
							
								auth        required      pam_deny.so
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								After successful password authentication using the auth stack, login checks
							 | 
						||
| 
								 | 
							
								for the existance of an account using the account stack, so it is necessary
							 | 
						||
| 
								 | 
							
								to reference pam-ldap there, too.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">/etc/pam.d/login</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								account     sufficient    pam_unix.so
							 | 
						||
| 
								 | 
							
								account     sufficient    pam_ldap.so
							 | 
						||
| 
								 | 
							
								account     required      pam_deny.so
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Other login-like programs include xdm and gdm (for graphical logins),
							 | 
						||
| 
								 | 
							
								ssh (for remote logins), su (for switching programs), and
							 | 
						||
| 
								 | 
							
								xlock and xscreensaver (for locked screens). Each has its own file
							 | 
						||
| 
								 | 
							
								in <span class="path">/etc/pam.d/</span>.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Some applications not only authenticate passwords, but can also be used
							 | 
						||
| 
								 | 
							
								to change them. The prototypical example is of course <span class="path">passwd</span>,
							 | 
						||
| 
								 | 
							
								the standard password-changing utility. Such programs can be configured to
							 | 
						||
| 
								 | 
							
								use LDAP by modifying their password stack.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">/etc/pam.d/passwd</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								password    required      pam_cracklib.so
							 | 
						||
| 
								 | 
							
								password    sufficient    pam_ldap.so
							 | 
						||
| 
								 | 
							
								password    sufficient    pam_unix.so
							 | 
						||
| 
								 | 
							
								password    required      pam_deny.so
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								One convienient application of pam-ldap is to set up "black box" servers
							 | 
						||
| 
								 | 
							
								that can authenticate users for a particular service without having an
							 | 
						||
| 
								 | 
							
								account on the machine at all. Services such as netatalk, (Cyrus) imap,
							 | 
						||
| 
								 | 
							
								and (Postfix) smtp use PAM. By configuring their PAM stacks to use LDAP,
							 | 
						||
| 
								 | 
							
								while leaving LDAP out of the PAM stacks of services such as login and ssh,
							 | 
						||
| 
								 | 
							
								you can easily create a "black box" server.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="section">
							 | 
						||
| 
								 | 
							
								<span class="section">nscd</span>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								To keep your computers from pounding your LDAP server every time
							 | 
						||
| 
								 | 
							
								a command such as <span class="in">ls -l /home</span> is issued on a computer in your
							 | 
						||
| 
								 | 
							
								organization, it is a good idea to configure your workstations to
							 | 
						||
| 
								 | 
							
								cache some user data. As long as the data in the cache is sufficiently
							 | 
						||
| 
								 | 
							
								fresh, the workstations use in instead of asking your LDAP server again.
							 | 
						||
| 
								 | 
							
								The name server caching daemon (nscd) accomplishes exactly
							 | 
						||
| 
								 | 
							
								this task.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								To install nscd on Debian, just
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script"><pre class="code">
							 | 
						||
| 
								 | 
							
								# <span class="in">apt-get install nscd</span>
							 | 
						||
| 
								 | 
							
								</pre></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								The configuration file for nscd is <span class="path">/etc/nscd.conf</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div class="script">
							 | 
						||
| 
								 | 
							
								<div class="codetitle">nscd.conf</div>
							 | 
						||
| 
								 | 
							
								<pre class="code">
							 | 
						||
| 
								 | 
							
								enable-cache            passwd          yes
							 | 
						||
| 
								 | 
							
								positive-time-to-live   passwd          600
							 | 
						||
| 
								 | 
							
								negative-time-to-live   passwd          20
							 | 
						||
| 
								 | 
							
								suggested-size          passwd          211
							 | 
						||
| 
								 | 
							
								check-files             passwd          yes
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</body>
							 | 
						||
| 
								 | 
							
								</html>
							 |