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