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>
 |