Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I can't wrap my brain around the new pam.d configuration syntax used in Ubuntu 10.04. How do I setup PAM so that it allows users stored in my LDAP database to login.

I already configured nscd, so id <user> or getent passwd are already listing my LDAP users, but PAM doesn't work, whether the normal shell login nor su.

Update June, 17th 2010 18:45

LDAP is already working. I can list all accounts by executing getent passwd, but my PAM configuration is still not working.

The listing below shows my /etc/pam.d/login

# The PAM configuration file for the Shadow `login' service

# Enforce a minimal delay in case of failure (in microseconds).
# (Replaces the `FAIL_DELAY' setting from login.defs)
# Note that other modules may require another minimal delay. (for example,
# to disable any delay, you should add the nodelay option to pam_unix)
auth       optional  delay=3000000

# Outputs an issue file prior to each login prompt (Replaces the
# ISSUE_FILE option from login.defs). Uncomment for use
# auth       required issue=/etc/issue

# Disallows root logins except on tty's listed in /etc/securetty
# (Replaces the `CONSOLE' setting from login.defs)
# Note that it is included as a "required" module. root will be
# prompted for a password on insecure ttys.
# If you change it to a "requisite" module, make sure this does not leak
# user name information.
auth       required

# Disallows other than root logins when /etc/nologin exists
# (Replaces the `NOLOGINS_FILE' option from login.defs)
auth       requisite

# SELinux needs to be the first session rule. This ensures that any 
# lingering context has been cleared. Without out this it is possible 
# that a module could execute code in the wrong domain.
# When the module is present, "required" would be sufficient (When SELinux
# is disabled, this returns success.)
session [success=ok ignore=ignore module_unknown=ignore default=bad] close

# This module parses environment configuration file(s)
# and also allows you to use an extended config
# file /etc/security/pam_env.conf.
# parsing /etc/environment needs "readenv=1"
session       required readenv=1
# locale variables are also kept into /etc/default/locale in etch
# reading this file *in addition to /etc/environment* does not hurt
session       required readenv=1 envfile=/etc/default/locale

# Standard Un*x authentication.
@include common-auth

# This allows certain extra groups to be granted to a user
# based on things like time of day, tty, service, and user.
# Please edit /etc/security/group.conf to fit your needs
# (Replaces the `CONSOLE_GROUPS' option in login.defs)
auth       optional

# Uncomment and edit /etc/security/time.conf if you need to set
# time restrainst on logins.
# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs
# as well as /etc/porttime)
# account    requisite

# Uncomment and edit /etc/security/access.conf if you need to
# set access limits.
# (Replaces /etc/login.access file)
# account  required

# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session    required

# Prints the last login info upon succesful login
# (Replaces the `LASTLOG_ENAB' option from login.defs)
session    optional

# Prints the motd upon succesful login
# (Replaces the `MOTD_FILE' option in login.defs)
session    optional

# Prints the status of the user's mailbox upon succesful login
# (Replaces the `MAIL_CHECK_ENAB' option from login.defs). 
# This also defines the MAIL environment variable
# However, userdel also needs MAIL_DIR and MAIL_FILE variables
# in /etc/login.defs to make sure that removing a user 
# also removes the user's mail spool file.
# See comments in /etc/login.defs
session    optional standard

# Standard Un*x account and session
@include common-account
@include common-session
@include common-password

# SELinux needs to intervene at login time to ensure that the process
# starts in the proper default security context. Only sessions which are
# intended to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad] open
# When the module is present, "required" would be sufficient (When SELinux
# is disabled, this returns success.)

The listing below shows my /etc/pam.d/common-auth

# /etc/pam.d/common-auth - authentication settings common to all services
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
auth    [success=2 default=ignore] nullok_secure
auth    [success=1 default=ignore] use_first_pass
# here's the fallback if no module succeeds
auth    requisite 
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth    required  
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
share|improve this question
Your common-auth looks correct. Perhaps the problem is somewhere else? Is there anything in /var/log/auth.log? Check some other logs too, such as syslog, messages, user.log and daemon.log. Are there any other LDAP-related files you've edited? Did you configure any authentication or access control on the LDAP server? – Shtééf Jun 17 '10 at 18:50
up vote 0 down vote accepted

Restore you pam files to the original versions. Install the libnss-ldap package which will integrate ldap access into pam. You may also want to install nscd.

Configure your server in /etc/ldap.conf.

Edit /etc/nsswitch.conf adding ldap to the end of the lines for passwd group and shadow.

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap 

Check to see if 'sudo getent shadow' is working for ldap entries. Check that you can get an authenticated connection using ldap-search from ldap-utils using your /etc/ldap.conf connection data.

Depending on your configuration you will also have to configure ssl values in /etc/ldap.conf.

share|improve this answer
I guess I messed up my configuration. I tried again by installing the packages and configuring /etc/nsswitch.conf, and see, it works! Great, thanks a lot. – t6d Jun 18 '10 at 7:49
  • Firstly, you'll need to open up your favourite package manager and install libpam-ldap
  • Once the packages start being unpacked you'll be hit up for a few questions about:
    . IP address/hostname of the LDAP server
    . The search base of your LDAP domain etc...
  • Now you need to customise PAM to make it use LDAP for authentication:
    sudo vi /etc/pam.d/login
  • you need to add one line above the existing line:

auth sufficient
auth required try_first_pass

Or modified the common-auth file

share|improve this answer
First of all, thanks, but your suggestion didn't work. Maybe, because I don't know where to insert it exactly. Btw., I updated my question. – t6d Jun 17 '10 at 16:41

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.