Solaris PAM
Pluggable Authentication Modules (PAM) are an integral part of the authentication
mechanism for the Solaris. PAM provides system administrators with the ability
and flexibility to choose any authentication service available on a system
to perform end-user authentication. Other PAM implementations are Linux-PAM
and OpenPAM.
By using PAM, applications can perform authentication regardless of what
authentication method is defined by the system administrator for the given
client.
PAM enables system administrators to deploy the appropriate authentication
mechanism for each service throughout the network. System administrators
can also select one or multiple authentication technologies without modifying
applications or utilities. PAM insulates application developers from evolutionary
improvements to authentication technologies, while at the same time allowing
deployed applications to use those improvements.
PAM employs run-time pluggable modules to provide authentication for
system entry services. PAM offers a number of benefits, including:
- Flexible configuration policy by enabling each application or service
to use its own authentication policy. PAM provides the ability for system
administrators to choose a default authentication mechanism. By using
the PAM mechanism to require multiple passwords, protection can be enhanced
on high security systems. For example, a system administrator might
want users to get authenticated by both Kerberos and Digest-MD5.
- Ease of use for the end user. Password usage can be made easier
by using PAM. If users have the same passwords for different mechanisms,
they do not need to retype the password. Configured and implemented
properly, PAM offers a way to n prompt the user for passwords for multiple
authentication methods without having the user enter multiple commands.
For example, a site may require certificate-based password authentication
for telnet access, while allowing console login sessions with just a
UNIX password.
- Enhances security and provides ease of use of the Solaris 9 OE in
an extensible way. The security mechanisms accessible through PAM are
implemented as dynamically loadable, shared software modules that can
be installed by system administrators in a manner that is transparent
to applications. By increasing overall security, users enjoy greater
service levels and lower cost of ownership.
This article is part one of a two-part series that offers a technical
overview of how the Solaris 9 OE implementation of PAM works, and demonstrates
the straightforward way in which it can be configured to accommodate site-specific
security policy requirements. This article examines the PAM architecture
and the components that make up PAM.
Extending Authentication in the Solaris 9 OE Using PAM: Part II
due in the October issue of Sun BluePrintsTM Online details the
PAM application programming interface (API) and the PAM service provider
interface (SPI). It also details how to write your first PAM module, including
annotated examples of how to write pluggable authentication modules.
Part one of this article contains the following information:
- Traditional Solaris OE authentication
- PAM components
- How to add a PAM module
- PAM LDAP module
Traditional Solaris OE Authentication
Traditional Solaris OE authentication is based on the method developed
for early UNIX implementations. This method employs an one-way encryption
hashing algorithm called crypt(3c). The encrypted password is stored either
in a file or in a Solaris OE naming service, from which it is retrieved
during the user login process. The traditional UNIX method of the Solaris
OE authentication, using crypt(3c), is very popular and has been enhanced
to use an LDAP directory as its data store.
Before proceeding with the details on authentication, you must have a
good understanding of what crypt(3c) is. There is some confusion because
of a naming conflict with an application named crypt; the
latter is a standard tool that ships with the Solaris OE and is a program
for encrypting and decrypting the contents of a file. (This program can
be found in /usr/bin/crypt.)
However, when the term "crypt" is referred to in authentication, it is
normally cited as crypt(3c) and refers to the standard UNIX password hashing
algorithm crypt(3c), available to C programmers in the libc.so
library.
A more sophisticated authentication method based on public key technology
was introduced with the Network Information System (NIS+) naming service
(now rebranded as the Sun OSTM 5.0 Network Information Service).
The NIS+ naming service method does not replace crypt(3c), but rather provides
an additional security layer by introducing the concept of a network password.
When users access network services through the secure remote procedure call
(RPC) mechanism, the network password is required.
Originally developed by Sun Microsystems, Inc. and adopted by the Open
Software Foundation (OSF) for inclusion in Common Desktop Environment (CDE)/Motif,
pluggable authentication modules (PAM) provide a mechanism for dynamic system
authentication and related services such as password, account, and session
management. Realizing that new authentication models continue to be developed,
Sun Microsystems, Inc. created the PAM architecture that allows additional
methods to be added without disturbing existing ones. PAM was introduced
in the Solaris 2.6 OE to overcome having to recode system entry services
such as, login, passwd, dtlogin, telnet,
and rlogin when a new authentication mechanism was developed and
introduced.
The PAM architecture and alternatives to traditional Solaris OE authentication
are presented in the Section , "Solaris 9 OE PAM Framework," on page 6.
UNIX Passwords
Passwords are created with the Solaris OE passwd command. This
command prompts the user for a (new) password, which the user enters as
a text string. In the Solaris OE, this text string is then hashed—or one-way
encrypted—using the crypt(3c) algorithm. The result is stored either in
/etc/shadow, or in the passwd.byname and passwd.byuid
NIS maps. If the NIS+ naming service is used, the results are stored in
the Passwd and Cred table type. The crypt(3c) algorithm
is provided with a random seed, known technically as a salt string,
so that the result is different each time the passwd command is
run, even if the same text string is used.
When a user logs in, the Solaris OE login program challenges
the user to provide a password. This password is hashed in the same manner
as the passwd command. If the output from this process matches
the output that is stored in the password database, the user is authenticated.
The major benefit of crypt(3c) is that it is easy to implement in a closed
environment. Authentication takes place on the host that the user logs in
to, so an authentication server is not required. In the case of local logins,
the clear text passwords are never stored or sent over the network, so there
is no reason to be concerned about eavesdroppers intercepting the password.
However, when authenticating over a network using telnet or
rlogin, passwords are sent in the clear text.
Because crypt(3c) uses a one-way encryption algorithm, it is difficult
to decrypt passwords stored on the server. Only the user knows what the
actual password is. This means that there is no way to convert passwords
stored in crypt to another format required by a different authentication
method.
When the crypt(3c) function is called, it takes the first eight characters
and returns its computation. This computation is then injected with a randomly
generated value called the salt. In conventional crypt, the salt
is stored as the first two characters. This salt value is then added, resulting
in a sequence of 13 characters. The result is that the salt is actually
an important part of the password string that is stored in the specific
naming service.
NOTE
In the future, Sun plans to update the crypt(3c) API in the Solaris
9 OE to allow different algorithms, such as MD5 and Blowfish to be used
for encrypting the user's login password.
As CPUs and storage capabilities increase, the crypt(3c) algorithm becomes
vulnerable to attack. The crypt(3c) mechanism shipping with the Solaris
9 OE, along with PAM authentication, is exactly the same implementation
that has been in the Solaris OE for many years now, and is due to change
in a subsequent update release of the Solaris 9 OE.
The Solaris OE crypt(3c) mechanisms work well for authenticating local
Solaris OE clients, but they are not the only methods used by applications
and services running in the Solaris OE. This can make it difficult for system
developers and system administrators, who must work with multiple password
systems, and for users who must remember multiple passwords.
The PAM interface in the Solaris 9 OE makes it easier for system administrators
to deploy different authentication technologies without modifying administrative
commands such as login, telnet, and other administrative
commands. Administrators are able to select one or multiple authentication
technologies, without modifying applications or utilities. PAM can also
be an integral part of a single sign-on system. The PAM APIs provide a flexible
mechanism that increases overall system security. The PAM APIs are detailed
in Extending Authentication in the Solaris 9 OE Using PAM: Part II
due in the October issue of Sun BluePrints Online.
PAM Components
This section details the following components that make up PAM:
- Solaris 9 OE PAM framework
- PAM module types
- PAM service module update
- PAM configuration file update
- PAM password management extensions
- pam_ldap password management (available in Solaris 9 12/02
OE)
Solaris 9 OE PAM Framework
The PAM framework enables new authentication technologies to be plugged
in without the need to change commands such as login, dtlogin,
rsh, su, ftp, and telnetd. PAM is also
used to replace the UNIX login with other security mechanisms, such as Kerberos
and LDAP authentication. Mechanisms for account, session, and password management
can also be plugged in through this framework.
This framework consists of four specific components:
- PAM API presented to the application programs (detailed in Part
II of this article)
- PAM framework responsible for implementing the API
- PAM service provider interface (SPI) implements the back end functionality
for the PAM API (detailed in Part II of this article)
- Configuration file pam.conf specifies which service providers
are used for the various programs
PAM allows the system administrator to choose any combination of services
to provide authentication. These include a flexible configuration policy
that enables a per application authentication policy, choice of a default
authentication mechanism for non-specified applications, and multiple passwords
on high security systems. Another valuable service is the ease of use for
the end user that enables no retyping of user passwords if the passwords
are the same, and optional parameters passed to the services.
With the introduction of the new PAM framework in the Solaris 9 OE, the
LDAP service module for PAM has been extended to support the account service,
which checks a user's password and account status by binding to the directory
(LDAP) server. The directory server returns the password status to pam_ldap,
which in turn maps the status to the PAM error codes. A user might be rejected
when logging in with an expired password, or might see a warning message
after logging in when the password is about to expire.
The pam_ldap module has also been updated to support password
syntax checking, which is performed through the SunTM Open Net
Environment (Sun ONE) Directory Server 5.x (formerly known as the iPlanetTM
Directory Server) password policy engine. When changing the password (using
the passwd command), the user might see error messages such as
password too short, password in history, and so forth
Pluggable Authentication Service Module Types
The PAM framework currently provides four different types of service
modules, which are implemented by dynamic loadable module types to provide
authentication related services. These modules are categorized based on
the function they perform:
- Authentication (auth): Provides authentication for users
and enables credentials to be set, refreshed, or destroyed.
- Account management (account): Checks for password aging,
account expiration, and access hour restrictions. Once the user is identified
by the authentication modules, the account management modules determine
whether the user can be given access.
- Session management (session): Manages the opening and closing
of a session. The modules can log activity, or clean up after the session
is over. For example, the unix_session module updates the
lastlog file.
- Password management (password): Contains functionality
that enables the user to change an authentication token (usually a password).
Stacking
PAM enables authentication by multiple methods through stacking. When
a user is authenticated through PAM, multiple methods can be selected to
fully identify the user. Depending on the configuration, the user can be
prompted for passwords for each authentication method. This means that the
user need not execute another command to be fully authenticated. The order
in which the methods are used is determined through the configuration file,
/etc/pam.conf.
NOTE
Stacking might increase the security risk, because the security of
each mechanism could be limited by the least secure password method
used in the stack. For example, it may not be possible to use the strongest
PAM mechanism, such as pam_kerb5 (Kerberos V5 service module
for PAM) in the Solaris OE LDAP Client implementation with the directory
server, because the currently available directory server does not yet
support Kerberos.
Now that some of the PAM basics have been covered, the next section presents
an architectural overview of the PAM framework.
FIGURE 2 illustrates the PAM framework.
FIGURE
2 PAM Framework Architecture
PAM Operation
The PAM software consists of a library, several modules, and a configuration
file. The PAM library, /usr/lib/libpam.so, provides the framework
to load the appropriate modules and manage stacking. It provides a generic
structure for all of the modules to plug into.
FIGURE 3 illustrates the relationship between the applications, the
library, and the modules. The applications login, passwd,
and su use the PAM library to access the appropriate module. The
pam.conf file defines which modules are used with each application.
Responses from the modules are passed back through the library to the application.
FIGURE
3 PAM and the Relationship Between Applications, Library, and Modules
Pluggable Authentication Service Modules
Each module provides the implementation of a specific mechanism. More
than one module type (auth, account, session,
or password) can be associated with each module, but each module
needs to manage at least one module type. The following is a description
of the modules that are part of the Solaris 9 OE.
- pam_authtok_get: Supports authentication and password management.
This module takes care of obtaining (old or new) passwords from the
user so that other modules on the stack can concentrate on their task,
and not worry about obtaining information from the user.
- pam_authtok_check: This module provides functionality to
the password management stack. Specifically, it performs a number of
checks on the construction of the newly entered password. See pam_authtok_check(5)
man page for a description of the checks it performs.
- pam_authtok_store: Provides functionality to the PAM password
management stack. When invoked with flags set to pam_update_authtok,
this module updates the authentication token for the user specified
by pam_user.
- pam_dhkeys: Supports authentication and password management.
This module specifically deals with the establishment and modification
of the Diffie-Hellman keys which are used, for example, for Secure RPC
calls (NIS+ and Secure NFS).
- pam_passwd_auth: Provides authentication functionality
to the password service as implemented by passwd(1). It differs
from the standard PAM authentication modules in its prompting behavior.
- pam_unix_account: Provides functionality to the PAM account
management stack, as the PAM account management module for UNIX. The
pam_acct_mgmt(3PAM) function retrieves password aging information
from the repositories specified in nsswitch.conf(4) and verifies
that the user's account and password have not expired.
- pam_unix_auth: Verifies the password that the user has
entered against any password repository specified in the nsswitch.conf
using normal UNIX crypt(3c) style password encryption. Can only be used
for authentication.
- pam_unix_session: Provides functions to initiate and to
terminate session as the session management PAM module for UNIX.
For security, these files are required to be owned by root and
to have their permissions set so that the files are not writable
through group or other permissions. If the file is not
owned by root, then PAM will not load the module. This requirement
on permissions and owner for the modules is not documented anywhere, and
might change in future releases.
NOTE
In
FIGURE 3, pam_unix is not layered entirely on the LDAP
server. The pam_unix module sits on the Name Service Switch
(NSS) layer and the NSS backends that could be files, NIS, NIS+, or
LDAP.
PAM Configuration File Update
The PAM configuration file, /etc/pam.conf, determines what authentication
services are used and in what order. Edit this file to select the desired
authentication mechanisms for each system entry application.
Configuration File Syntax
The PAM configuration file consists of entries with the following syntax:
service_name module_type control_flag module_path module_options
TABLE 1 explains the functions of the syntax.
TABLE 1 Configuration File Syntax
| Syntax |
Function |
| service_name |
Name of the service
(for example, ftp, login, telnet) |
| module_type |
Module type for the
service (auth, account, session, password) |
| control_flag |
Determines the continuation
or failure semantics for the module (see note below) |
| module_options |
Specific options passed
to the service modules |
Comments can be added to the pam.conf file by starting
the line with a pound sign (#). Use white space to delimit the fields.
NOTE
An entry in the PAM configuration file is ignored if one of the following
conditions exists: the line has fewer than four fields, an invalid value
is given for module_type or control_flag, or the named
module is not found.
TABLE 2 summarizes PAM configurations.
TABLE 2 PAM Configurations
| Service Name |
Daemon or Command |
Module Type |
| cron |
/usr/sbin/cron |
account |
| dtlogin |
/usr/dt/bin/dtlogin |
auth, account, session |
| ftp |
/usr/sbin/in.ftpd |
auth, account, session |
| init |
/usr/sbin/init |
session |
| login |
/usr/bin/login |
auth, account, session,
password |
| passwd |
/usr/bin/passwd |
auth, account, password |
| ppp |
/usr/bin/pppd |
auth, account, session |
| rexecd |
/usr/sbin/in.rexecd |
auth, account |
| rexd |
/usr/sbin/rpc.rexd |
account, session |
| rlogin |
/usr/sbin/in.rlogind |
auth, account, session,
password |
| rsh |
/usr/sbin/in.rshd |
auth, account |
| sac |
/usr/lib/saf/sac |
session |
| sshd |
/usr/lib/ssh/sshd |
auth, account, session,
password |
| su |
/usr/bin/su |
auth, account |
| telnet |
/usr/sbin/in.telnetd |
auth, account, session,
password |
| ttymon |
/usr/lib/saf/ttymon |
session |
| uucp |
/usr/sbin/in.uucpd |
auth, account |
Control Flags
To determine continuation or failure behavior from a module during the
authentication process, you must select one of four control flags for each
entry. Successful or failed attempts are indicated through control flags.
Even though these flags apply to all module types, the following explanation
assumes that the flags are being used for authentication modules. The control
flags are as follows:
required — This module must return success in order
to have an overall successful result. If all of the modules are labeled
as required, then authentication through all modules must succeed
for the user to be authenticated. If some of the modules fail, then an error
value from the first failed module is reported. If a failure occurs for
a module flagged required, all modules in the stack are still tried
but failure is returned. If none of the modules are flagged required,
then at least one of the entries for that service must succeed for the user
to be authenticated.
requisite — This module must return success for additional
authentication to occur. If a failure occurs for a module flagged requisite,
an error is immediately returned to the application and no additional authentication
is done. If the stack does not include prior modules labeled required
that failed, then the error from this module is returned. If a earlier module
labeled required has failed, the error message from the required
module is returned.
optional — If this module fails, the overall result can be successful
if another module in this stack returns success. The optional
flag should be used when one success in the stack is enough for a user to
be authenticated. This flag should only be used if it is not important for
this particular mechanism to succeed. If your users need to have permission
associated with a specific mechanism to get their work done, then you should
not label it optional.
sufficient — If this module is successful, skip the remaining
modules in the stack, even if they are labeled required. The
sufficient flag indicates that one successful authentication is
enough for the user to be granted access. More information about these flags
is provided in the next section, which describes the default /etc/pam.conf
file.
NOTE
In Solaris 9 12/02 OE, a NEW control flag has been added to the PAM
framework. The control flag binding has a meaning of terminate
processing upon success, and report the failure if unsuccessful.
This option effectively provides a local account overriding remote (ldap)
account functionality.
Generic pam.conf File
The following is an example of a generic pam.conf file:
# PAM configuration
# Authentication management
#
login auth requisite pam_authtok_get.so.1
login auth sufficient pam_unix_auth.so.1
login auth required pam_ldap.so.1
#
rlogin auth sufficient pam_rhosts_auth.so.1
rlogin auth required pam_authtok_get.so.1
rlogin auth sufficient pam_unix_auth.so.1
#
dtlogin auth required pam_authtok_get.so.1
dtlogin auth required pam_unix_auth.so.1
#
rsh auth sufficient pam_rhosts_auth.so.1
rsh auth required pam_unix_auth.so.1
#
dtsession auth required pam_authtok_get.so.1
dtsession auth required pam_unix_auth.so.1
#
other auth required pam_authtok_get.so.1
other auth required pam_unix_auth.so.1
#
# Account management
#
login account requisite pam_roles.so.1
login account required pam_projects.so.1
login account required pam_unix_account.so.1
#
dtlogin account requisite pam_roles.so.1
dtlogin account required pam_projects.so.1
dtlogin account required pam_unix_account.so.1
#
cron account required pam_projects.so.1
#
cron account required pam_unix_account.so.1
#
other account requisite pam_roles.so.1
other account required pam_projects.so.1
other account required pam_unix_account.so.1
# Session management
#
other session required pam_unix_session.so.1
#
# Password management
#
other password requisite pam_authtok_get.so.1
other password requisite pam_authtok_check.so.1
other password sufficient pam_authtok_store.so.1
other password required pam_ldap.so.1
This generic pam.conf file specifies the following behavior:
- When running login, authentication must succeed for the
pam_authtok_get module and for either the pam_unix_auth
or the pam_ldap module.
- For rlogin, authentication through the pam_authtok_get
and pam_unix_auth modules must succeed if authentication through
pam_rhost_auth fails.
- The sufficient control flag for rlogin's pam_rhost_auth
module indicates that if the authentication performed by the pam_rhost_auth
module is successful, the remainder of the stack is not executed, and
a success value is returned.
- Most of the other commands requiring authentication require successful
authentication through the pam_unix_auth module.
The other service name allows a default to be set for any other
commands requiring authentication that are not included in the file. The
other option makes it easier to administer the file, since many
commands that use the same module can be covered by only one entry. Also,
the other service name, when used as a catchall, can ensure that
each access is covered by one module. By convention, the other
entry is included at the bottom of the section for each module type. The
rest of the entries are in the file control account management, session
management, and password management.
Normally, the entry for the module_path is root-relative. If
the file name entered for module_path does not begin with a slash
(/), the path /usr/lib/security/$ISA is added to the file
name, where $ISA is expanded by the framework to contain the instruction
set architecture of the executing machine (see the isainfo(1) man
page for additional information).
A full path name must be used for modules located in directories other
than the default. The values for the module_options can be found
in the man pages for the module (for example, pam_unix_auth(5)).
If login specifies authentication through both pam_unix_auth
and pam_ldap, then the user is prompted to enter a password for
each module, for example:
# Authentication management
#
login auth required pam_authtok_get.so.1
login auth sufficient pam_unix_auth.so.1
login auth required pam_ldap.so.1
PAM and LDAP Password Management Extensions
It is important to provide a quick overview to clarify the difference
between PAM Password Management Extensions and the new pam_ldap
password management.
PAM Password Management Extensions provide the same functionality as
the existing pam_unix module. The only difference is how
the module is packaged. What used to be a single module is now split up
into multiple components, known as service modules, each performing a separate
function. This modular construction makes implementing custom password management
policies easier.
The new pam_ldap password management facility includes two new
account management features: password aging and account expiration. Because
the directory server provides its own mechanism for account management,
a conflict can occur if you wish pam_ldap to implement a different
password policy than what the directory-wide policy is set for. For example,
the directory may force all users to change passwords after 60 days but
you might want some special user accounts to be able to keep their current
password for a longer period of time.
To support this flexibility, the PAM framework has been enhanced by the
addition of a new control flag called binding which instructs
pam_ldap to terminate further process once the password policy criteria
has been met and report a failure if it is not. Effectively, this control
flag allows you to override the password policy that the directory server
enforces.
A server_policy option has been added to instruct pam_unix
to allow users that only have LDAP accounts to be processed by the password
policy set on the directory server. This option can be used to instruct
the pam_unix_account, pam_unix_auth, and pam_passwd_auth
service modules to ignore the user being authenticated and let the pam_ldap
module stacked below them process the user according to the password policy
established in the directory server. This effectively allows you to override
the local pam_unix password policy.
NOTE
The pam_authtok_store module handles this option differently.
The server_policy option was introduced to solve a problem found
when stacking the pam_unix_account and pam_ldap modules
together. When used, it tells the module to rely on the policy specified
on the LDAP server and not to apply a local policy.
Because pam_unix_account receives incomplete information from
the LDAP server, it might inadvertently decide that an active account has
expired, or that an expired account is still active. Specifying server_policy
in /etc/pam.conf tells pam_unix_account not to guess an
account's status but to leave the decision to the LDAP server. The LDAP
server keeps accurate current status of each account and can draw the correct
conclusion about its expiration status.
Because this feature enables the pam_ldap module to fully support
the account management, it is reasonable to use the following PAM configuration
for account management.
other account requisite pam_roles.so.1
other account required pam_projects.so.1
other account binding pam_unix_account.so.1 server_policy
other account required pam_ldap.so.1
NOTE
In this configuration, please note the binding control flag for
pam_unix_account.so.1.
This configuration specifies that pam_unix_account should check
the user's local account first. Because of the binding control flag, the
stack succeeds or fails depending on the values returned by pam_unix_account.
If only the ldap account exists for the user, pam_unix_account
does nothing and allows pam_ldap determine the stack's success
or failure.
Customer feedback indicated that the PAM functionality in the Solaris
OE needed some enhancements. The requested changes included improving the
mechanism used to validate password structures, adding the ability to change
numbers of characters, total password length, and so forth.
In previous versions of the Solaris OE, this functionality was tightly
coupled in a single monolithic module (pam_unix) and local extensions
could not be incorporated in the module.
Only with a great deal of effort could you extend part of the operations
performed by this module. Because of this, the pam_unix(5) functionality
has been replaced with a new set of modular PAM service modules that are
listed in this section. The functionality of pam_unix has been
entirely replaced in the Solaris 9 OE. New PAM modules are now provided
that replace a specific piece of pam_unix. This makes it easier
to customize the PAM behavior by inserting or replacing individual modules.
The Solaris 9 OE no longer uses pam_unix by default. During upgrades
any existing instances of pam_unix in pam.conf are replaced
by the new modules.
In the Solaris 9 OE, the functionality provided by the old pam_unix
module has been split over a number of small modules, each performing a
well-defined task, that can be easily extended or replaced by modifying
the pam.conf file.
These new modules are:
- pam_authtok_get(5)
- pam_authtok_check(5)
- pam_authtok_store(5)
- pam_unix_auth(5)
- pam_dhkeys(5)
- pam_unix_account(5)
- pam_unix_session(5)
You no longer have to replace the pam_authtok_check module to
extend or replace the standard password strength checks. Just list the module
in the /etc/pam.conf file right before, after, or instead of the
pam_authtok_check file.
To Add a PAM Module
- Determine the control flags and other options to be used.
- Become superuser.
- Copy the new module to /usr/lib/security.
NOTE
If you have a 64-bit version of the module, you should place
that version in /usr/lib/security/sparcv9.
- Set the permissions so that the module file is owned by root
and the permissions are 755.
- Edit the PAM configuration file, /etc/pam.conf, and to
add this module to the appropriate services.
To Verify The Configuration
It is essential to do some testing before logging out, in case the configuration
file is misconfigured.
- Test the modified service or the other configuration.
- Run rlogin, su, and telnet if these services
have been changed.
If the service is a daemon spawned only once when the system is booted,
it might be necessary to reboot the system before you can verify that the
module has been added, however it might be possible to restart the daemon
using the appropriate /etc/init.d/ script.
To Disable .rhosts Access With PAM From Remote Systems
A common use of the .rhosts file is to simplify remote logins
between multiple accounts owned by the same user. For example, if you have
multiple accounts on more than one system, you might need to perform specific
tasks and using the .rhosts file is ideal.
However, using the .rhosts file as an authentication mechanism
is a weak form of security and should be avoided.
- Remove the rlogin and rsh (pam_rhosts_auth.so.1)
entries from the PAM configuration file.
This prevents reading the ~/.rhosts files during an rlogin
session and therefore prevents unauthenticated access to the local system
from remote systems. All rlogin access requires a password, regardless
of the presence or contents of any ~/.rhosts or /etc/hosts.equiv
files.
NOTE
To prevent other unauthenticated access to the ~/.rhosts
files, remember to disable the rsh service. The best way to
disable a service is to remove the service entry from /etc/inetd.conf.
The remote shell server, rshd, and the remote login server,
rlogind, only use PAM, they do not call the ruserok()
function themselves.
PAM Error Reporting
Diagnostic messages generated by the PAM modules or the PAM framework
are output using syslog(3c). They are logged to the facility that
was specified at the time the application (login, telnet,
sshd) called openlog(3c), so the exact location of these
messages depends upon whether the application uses PAM.
For example, login sends its messages to the LOG_AUTH
facility, while rlogind sends its messages to the LOG_DAEMON
facility. Other daemons might use a configurable facility (sshd,
ftpd, and so forth) which can be set in the configuration file
of the particular service.
Depending on the severity of the diagnostic message, the PAM module directs
the message to one of the eight available log priorities.
NOTE
For additional details on the syslog() function and priorities,
see the syslog(3c) and syslog.conf(4)man pages.
Debug messages are logged with:
syslog(LOG_DEBUG, "...")
Critical messages are logged with:
syslog(LOG_CRIT, "...")
For example, a general error message (LOG_ERR) from PAM, used by
login, is directed to auth.crit and ends up in a logfile
as:
Jul 22 22:11:43 host login: [ID 887986 auth.error] ACCOUNT:pam_sm_acct_mgmt: illegal option debuf
To Initiate Diagnostics Reporting for PAM
- Backup the syslog.conf file before editing it.
- Determine the syslog facility used by the application you
want to receive diagnostic reports from.
- Edit the /etc/syslog.conf to add a line describing where
the message with the intended facility and priority will be logged,
for instance:
auth.debug /var/adm/authlog
Note that these message levels are part of a hierarchy:
High -------------------------------------Low
EMERG ALERT CRIT ERR WARNING NOTICE INFO DEBUG
Due to this hierarchical ordering, a syslog channel specified
to log debug messages also logs messages at all higher levels
(for example, logs messages with priority debug and up).
- Make sure that the logfile specified in the previous step
actually exists. If it doesn't, create it now with
# touch /var/adm/authlog
- Make syslogd re-read the configuration file by sending
it a HUP signal:
# pkill -HUP syslogd
Initiate PAM Error Reporting
The following example displays all alert messages on the console. Critical
messages are mailed to root. Debug messages are added to /var/log/pamlog.
auth.alert /dev/console
auth.crit root
auth.debug /var/log/pamlog
Each line in the logfile contains a timestamp, the name of the system
that generated the message, and the message itself. Be aware that a large
amount of information may be written to the pamlog file.
The log format was changed in the Solaris 8 OE and subsequent releases,
and now includes a hash-value of the message generating string for example—"user
%s not found." It now contains the message facility and severity.
There is another part to diagnostics reporting the debug option
to a module.
- Add the debug flag to a PAM module to enable diagnostics
reporting of that module, for example:
# PAM Module Debugging
#
login auth requisite pam_authtok_get.so.1
login auth required pam_dhkeys.so.1 debug
login auth required pam_unix_auth.so.1 debug
login auth required pam_dial_auth.so.1
This configuration example enables debugging information from pam_dhkeys.so.1
and pam_unix_auth.so.1.
What gets logged might vary quite a bit, since there is no standard describing
the information that needs to be output in response to this option. It is
a good practice for module developers to recognize this debug flag
and enable some form of debugging when the flag is specified in /etc/pam.conf.
PAM LDAP Module
The PAM LDAP module (pam_ldap) was introduced in the Solaris
8 OE for use in conjunction with pam_unix for authentication and
password management with an LDAP server. This module was written to support
stronger authentication methods such as CRAM-MD5, in addition to the other
UNIX authentication capabilities provided by pam_unix.
NOTE
The pam_ldap module must be used in conjunction with the
modules supporting the UNIX authentication, password and account management,
as pam_ldap is designed to be stacked directly below these
modules.
Currently, pam_ldap provides support only for authentication
and password management. Support for account management is expected to be
provided in the Solaris 9 12/02 OE.
The pam_ldap module should be stacked directly below the
pam_unix module in the configuration file /etc/pam.conf. If
there are other modules that are designed to be stacked in this manner,
they could be stacked under the pam_ldap module. This design
must be followed in order for authentication and password management to
work when pam_ldap is used. The following is a sample of /etc/pam.conf
file with pam_ldap stacked under pam_unix:
# Authentication management for login service is stacked.
# If pam_unix succeeds, pam_ldap is not invoked.
login auth sufficient /usr/lib/security/pam_unix.so.1
login auth required /usr/lib/security/pam_ldap.so.1
# Password management
other password sufficient /usr/lib/security/pam_unix.so.1
other password required /usr/lib/security/pam_ldap.so.1
It is important to note that the control flag for pam_unix is
sufficient. This flag means that if authentication through
pam_unix succeeds, then pam_ldap is not invoked. Also, other
service types, such as dtlogin, su, telnet, and
so forth can substitute for login. See
FIGURE 4.
FIGURE
4 pam_ldap Structure
The options supported by the pam_ldap are:
- debug: If this option is used with pam_ldap, then
debugging information is output to the syslog(3C) files.
- nowarn: This option turns off warning messages.
How PAM and LDAP Work
Before discussing the details of how PAM and LDAP work, it is important
to provide a quick overview to understand and distinguish between how the
password is stored and how the authentication mechanism is used to authenticate
to the LDAP server. The password can be stored in a variety of formats in
the Sun ONE Directory Server, such as, salted secure hash algorithm (SSHA)
secure hash algorithm (SHA), CRYPT, and so forth.
The authentication mechanisms currently used and supported in the Solaris
8 OE LDAP Client, are NONE, SIMPLE, and CRAM-MD5 authentication. SIMPLE
authentication requires the client to pass a distinguished name (DN) and
password to the server in clear text. Currently, the Sun ONE Directory Server
5.x does not support the authentication mechanism CRAM-MD5, which sends
only the digest over the wire. CRAM-MD5 is implemented as a simple authentication
and security layer (SASL) mechanism and both the client and server must
use it. What happens is the client request authentication is based on SASL/CRAM-MD5
and the server must support this to complete the authentication. In general,
very few clients use CRAM-MD5, now that RFC 2831 mandates the use of Digest-MD5,
which is intended to be an improvement over CRAM-MD5. With the introduction
of the Solaris 8 OE and the LDAP Client, a usable security model is not
provided.
With the introduction of the Sun ONE Directory Server 5.x; SASL External
and Digest-MD5 are now supported for authentication. With Digest-MD5, a
digest is created and sent across the wire to authenticate to the directory
server. The directory server then compares the digest that was sent with
the digest created by itself with the stored password and returns success
if it matches. In this case, the password is not sent in clear text.
To address the absence of a security model in the Solaris 8 OE LDAP Client,
the Solaris 9 OE now incorporates the Sun ONE Directory Server 5.1 and Solaris
9 OE Secured LDAP Client, addressing the security issues found in the LDAP
Client.
There are two LDAP Client libraries available. Currently, the Solaris
8 OE LDAP Client library version provides no support for Secure Socket Layer/Transport
Layer Security 1.0 (SSL/TLS 1.0). To address this, a new LDAP library (libldap
(v5)) for the Solaris 9 OE has been developed and it supports both
SSL and TLSv1.
NOTE
In the current release of the Solaris 9 OE, the extended startTLS
operation is not supported.
The LDAP Client library continues to provide support for the simple page
control and the SASL CRAM-MD5 authentication mechanism.
Authentication With pam_unix
In authentication with pam_unix, the client retrieves the password
that is stored in the server by making a call to the getspnam function.
This function binds to the LDAP server with the proxy agent account (the
reason the proxy passwd is sent across the wire in clear text).
The proxy agent password is stored in the userPassword attribute
in the directory server. This proxy agent account can reside anywhere in
the directory server, but must contain the userPassword attribute.
Note that the access control instructions (ACIs) of the proxy agent allow
this account to have read access to all user passwords. ACIs are instructions
that are stored in the directory server itself. Every entry can have a set
of rules that define an ACI for that entry. An ACI appears as an attribute
in the entry so it can be retrieved by using LDAP search, or it can be added,
updated, or deleted with an LDAP modify operation.
An entry may have one ACI, many ACIs, or none. ACIs allow or deny permissions
to entries. When the directory server processes an incoming request for
that entry, the server uses the ACIs specific to that entry to determine
whether or not the LDAP client has permission to perform the requested operation.
NOTE
LDAP stores data as entries. An entry has a distinguished name (DN)
to uniquely identify it within the directory server
The encrypted password is sent to the client side and compared with the
crypted password supplied by the user at the password prompt. If there is
a match, pam_unix returns success. The following tables
illustrate the authentication mechanisms currently used.
TABLE 3 lists the PAM abbreviations used in this section.
TABLE 3 PAM Abbreviations
| Abbreviation |
Description |
| UP |
User password |
| PP |
Proxy agent password |
| NP |
New password |
| NO* |
Not applicable (at present) |
TABLE 4 illustrates if the user password and proxy password are
transmitted in the clear during PAM authentications.
TABLE 4 PAM Authentication
| Authentication Mechanisms |
pam_unix |
pam_ldap |
| SIMPLE |
UP-No PP-Yes |
UP-Yes PP-Yes |
| DIGEST-MD5 |
UP-NO* PP-No |
UP-No PP-No |
| TLS: SIMPLE |
UP-No PP-No |
UP-No PP-No |
| TLS: DIGEST-MD5 |
UP-No PP-No |
UP-No PP-No |
NOTE
In Tables 4 and 5 the reason for "NO*" as the value of the Digest-MD5
UP column is because the Sun ONE Directory Server version 5.1 requires
the passwords be stored in the server in clear text for Digest-MD5 to
work.
For updating passwords in pam_unix, the same comparison as for
authentication takes place (since the user has to bind as the dn);
then, the new password is encrypted and not passed over the wire
in clear text (see TABLE 5).
TABLE 5 PAM Update of Password
| Authentication Mechanisms |
pam_unix |
pam_ldap |
| SIMPLE |
UP-No PP-Yes NP-No |
UP-Yes PP-Yes NP-Yes |
| Digest-MD5 |
UP-NO* PP-No NP-NO* |
UP-No PP-No NP-Yes |
| TLS: SIMPLE |
UP-No PP-No NP-No |
UP-No PP-No NP-No |
| TLS: Digest-MD5 |
UP-No PP-No NP-No |
UP-No PP-No NP-No |
The matrices are easier to understand when you distinguish between
how the password is stored and how the authentication mechanism is used
to authenticate to the LDAP server. The password can be stored in a variety
of formats, such as SSHA, SHA, crypt, clear text, and so forth. The authentication
mechanisms that are currently supported are NONE, SIMPLE, SASL/CRAM-MD5,
SASL/Digest-MD5, TLS:NONE, TLS:SIMPLE, TLS:SASL/CRAM-MD5, and TLS:SASL/Digest-MD5.
pam_ldap Authentication
In authentication that uses pam_ldap, the user password is passed
to the server in an auth structure in clear text, since authentication
is being attempted with the user dn and password. If SIMPLE
authentication is used and the password matches, then success is
returned. Using pam_ldap in the Solaris 9 Secure LDAP client now
provides SASL/Digest-MD5 authentication, privacy, and data integrity with
SSL/TLS. If you require stronger authentication mechanisms such as Digest-MD5;
then you must use pam_ldap. In addition, pam_ldap is designed
to be extended for future authentication mechanisms that will be supported
in future Solaris OE releases. One of the benefits of using pam_ldap,
is it does not require passwords to be stored in any specific format, so
you can store passwords using SSHA, SHA, or CRYPT formats.
For additional information, see the pam_ldap man page for the
correct way to stack the authentication management for login service, and
password management modules in the /etc/pam.conf configuration
file.
NOTE
CRAM-MD5 is supported by the Secure LDAP client, but not by the Sun
ONE Directory Server. However, Digest-MD5 is supported by both.
The author would like to recognize the following individuals for their
contributions to this article:
- Joep Vesseur, Technical Staff, is a member of the Solaris Security
Technology Group.
- Michen Chang, Technical Staff, is a member of the Solaris Naming
Services Group.
The SunDocsSM program provides more than 250 manuals from
Sun Microsystems, Inc. If you live in the United States, Canada, Europe,
or Japan, you can purchase documentation sets or individual manuals through
this program.
The docs.sun.com web
site enables you to access Sun technical documentation online. You can browse
the docs.sun.com archive
or search for a specific book title or subject. The URL is
http://docs.sun.com/.
To reference Sun BluePrints OnLine articles, visit the Sun BluePrints
OnLine Web site at:
http://www.sun.com/blueprints/online.html.
PAM in Open Solaris
RBAC - Role Based Access Control at OpenSolaris.org
OpenSolaris UserGroup RBAC presentation
RBAC Best Practices for OpenSolaris developers
The following best practice documents for using RBAC in developing
other parts of OpenSolaris can be found in the ARC community:
Why use
PAM were created by Sun and first appeared as a public interface
in Solaris 2.6. Previous versions of a very similar framework were
in Solaris 2.4 and Solaris 2.5.1. Until Solaris 9 there was only
one module, pam_unix.so, that implemented the default UNIX username/password
policy. In Solaris 9 we broke up that module in to a number of smaller
parts: pam_unix_auth.so, pam_unix_cred.so, pam_authtok_get.so, pam_authtok_check.so,
pam_authtok_store.so, pam_dhkeys.so and pam_passwd_auth.so.
Sample Modules
In the files section there are a few sample modules and programs
that I (Darren Moffat) have had lying around in my home directory
at Sun since I first started playing with PAM before Solaris 2.6
was released.
I originally called this su_cookie.so, and it was one of my earliest
PAM modules. I'm not proud of the way it is coded and it is an ugly
hack since it uses the xauth(1) program to do its work. However
I've always found it very useful, no more xhost + for me :-) I know
that some Linux based distros ship with something like this but
I'm pretty confident I was the first to implement it and someone
else idependently came up with the idea.
This is a simple demo application that calls the PAM APIs that
an application would call. I use it as a very simple test application,
not really useful for anything else.
This is a PAM implementation of the check that /bin/login has
hardcoded for root on the system console.
Basically this is a local file that contains usernames and/or
netgroups that should either be allowed or denied access to a given
service. The idea for this module came from observing the performance
hit that the nsswitch passwd_compat +/- syntax can have on some
systems. What most people used that for was invalidating the users
shell and/or password so they couldn't login, but still allow the
admin to get uid->name translations of the files the users owned
on the server. This module has appeared in SunSolve articles in
the past. I wrote this version of it in 1999.
Hi,
If anyone can help me understand OpenSSH and PAM and
the various
Which version of OpenSSH? The PAM behaviour has changed
(improved, I hope :-) over time. An overview is in the faq
(http://www.openssh.com/faq.html#3.15)
but the details vary with the
version.
I apologize. I wanted to provide you with all of the information
as
well as write a post that made sense so I edited out the version
information. I am running "OpenSSH_4.3p2, OpenSSL 0.9.8a 11
Oct 2005".
user2 is unable to login and instead of calling pam_sm_chauthtok()
OpenSSH calls passwd().
That happens when you use password authentication and privilege
separation
together. When you use password authentication, sshd doesn't
have the
ability to interact with the user until very late in the
login process
(ie after the pty is allocated) and when privsep is in use,
has long
since given up the privilege it would need to call pam_chauthtok
(and
have it work, anyway).
Either use ChallengeResponseAuthentication (preferred) or
disable
UsePrivilegeSeparation.
I apologize again. I assumed priv sep was disabled by default.
I shut
it off and set "ChallengeResponseAuthentication no" and
"PasswordAuthentication yes" and everything seems to work as
intended.
user1 gets the 'account has expired' message but it
does not close the
connection until three attempts are made!
I think that this no longer happens in 4.3p2.
Well I am going to paste some more stuff. Since you say that
ChallengeResponseAuthentication is preferred here are the issues
i am
having with it enabled. Here is my configuration:
### START /usr/local/etc/sshd_config ###
[Mon May 01|14:04:59][root@unknown:/]
$ cat /usr/local/etc/sshd_config | grep -v '^#'
Port 2022
Protocol 2
PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes
UsePrivilegeSeparation no
Subsystem sftp /usr/local/libexec/sftp-server
[Mon May 01|14:05:38][root@unknown:/]
### END /usr/local/etc/sshd_config ###
user1 reports expired and returns PAM_ACCT_EXPIRED. I am not
kicked
out.
Here are the dumps!
### START server command ###
$ /usr/local/sbin/sshd -ddd -D > /tmp/sshdebug.txt 2>&1
[Mon May 01|14:15:38][root@unknown:/]
$
### END server command ###
### START client view ###
[Mon May 01|14:05:38][root@unknown:/]
$ ssh -p 2022 -l user1 localhost
Password:
User account has expired!
Password:
User account has expired!
Password:
User account has expired!
Permission denied (publickey,keyboard-interactive).
[Mon May 01|14:15:38][root@unknown:/]
### END client view ###
### START sshd debug ###
$ cat /tmp/sshdebug.txt
debug2: load_server_config: filename /usr/local/etc/sshd_config
debug2: load_server_config: done config len = 265
debug2: parse_server_config: config /usr/local/etc/sshd_config
len 265
debug1: sshd version OpenSSH_4.3p2
debug3: Not a RSA1 key file /usr/local/etc/ssh_host_rsa_key.
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug3: Not a RSA1 key file /usr/local/etc/ssh_host_dsa_key.
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: rexec_argv[0]='/usr/local/sbin/sshd'
debug1: rexec_argv[1]='-ddd'
debug1: rexec_argv[2]='-D'
debug2: fd 3 setting O_NONBLOCK
debug1: Bind to port 2022 on ::.
Server listening on :: port 2022.
debug2: fd 4 setting O_NONBLOCK
debug1: Bind to port 2022 on 0.0.0.0.
Server listening on 0.0.0.0 port 2022.
debug1: fd 5 clearing O_NONBLOCK
debug1: Server will not fork when running in debugging mode.
debug3: send_rexec_state: entering fd = 10 config len 265
debug3: ssh_msg_send: type 0
debug3: send_rexec_state: done
debug1: rexec start in 5 out 5 newsock 5 pipe -1 sock 10
debug1: inetd sockets after dupping: 3, 3
Connection from 127.0.0.1 port 32861
debug1: Client protocol version 2.0; client software version
Sun_SSH_1.1
debug1: no match: Sun_SSH_1.1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.3
debug2: fd 3 setting O_NONBLOCK
debug1: list_hostkey_types: ssh-rsa,ssh-dss
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit:
diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
debug2: kex_parse_kexinit:
aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@xxxxxxxxxxxxxx,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit:
aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@xxxxxxxxxxxxxx,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit:
hmac-md5,hmac-sha1,hmac-ripemd160,hmac-ripemd160@xxxxxxxxxxx,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit:
hmac-md5,hmac-sha1,hmac-ripemd160,hmac-ripemd160@xxxxxxxxxxx,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib@xxxxxxxxxxx
debug2: kex_parse_kexinit: none,zlib@xxxxxxxxxxx
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit:
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: kex_parse_kexinit:
diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
debug2: kex_parse_kexinit:
aes128-ctr,aes128-cbc,arcfour,3des-cbc,blowfish-cbc
debug2: kex_parse_kexinit:
aes128-ctr,aes128-cbc,arcfour,3des-cbc,blowfish-cbc
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib
debug2: kex_parse_kexinit: none,zlib
debug2: kex_parse_kexinit: i-default
debug2: kex_parse_kexinit: i-default
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: mac_init: found hmac-md5
debug1: kex: client->server aes128-ctr hmac-md5 none
debug2: mac_init: found hmac-md5
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST received
debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent
debug2: dh_gen_key: priv key bits set: 137/256
debug2: bits set: 1022/2048
debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT
debug2: bits set: 1022/2048
debug1: SSH2_MSG_KEX_DH_GEX_REPLY sent
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done
debug1: userauth-request for user user1 service ssh-connection
method
none
debug1: attempt 0 failures 0
debug2: input_userauth_request: setting up authctxt for user1
debug1: PAM: initializing for "user1"
debug3: PAM STARTS FROM HERE
debug3: Trying to reverse map address 127.0.0.1.
debug1: PAM: setting PAM_RHOST to "localhost"
debug1: PAM: setting PAM_TTY to "ssh"
debug2: input_userauth_request: try method none
debug3: DOOPIE!#!#!
Failed none for user1 from 127.0.0.1 port 32861 ssh2
debug1: userauth-request for user user1 service ssh-connection
method
keyboard-interactive
debug1: attempt 1 failures 1
debug2: input_userauth_request: try method keyboard-interactive
debug1: keyboard-interactive devs
debug1: auth2_challenge: user=user1 devs=
debug1: kbdint_alloc: devices 'pam'
debug2: auth2_challenge_start: devices pam
debug2: kbdint_next_device: devices <empty>
debug1: auth2_challenge_start: trying authentication method
'pam'
debug3: PAM: sshpam_init_ctx entering
debug3: sshpam_thread called!!!!!!!!
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 1
debug3: ssh_msg_recv entering
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: DOOPIE!#!#!
Postponed keyboard-interactive for user1 from 127.0.0.1 port
32861 ssh2
debug2: PAM: sshpam_respond entering, 1 responses
debug3: ssh_msg_send: type 6
debug3: POOPIE!@!@!
debug1: do_pam_account: called
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 3
debug3: PAM: do_pam_account pam_acct_mgmt = 17 (User account
has
expired)
debug3: ssh_msg_send: type 9
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: ssh_msg_recv entering
debug3: PAM: PAM_AUTH_ERR
debug3: DOOPIE!#!#!
Postponed keyboard-interactive/pam for user1 from 127.0.0.1
port 32861
ssh2
debug2: PAM: sshpam_respond entering, 0 responses
debug2: auth2_challenge_start: devices <empty>
debug3: PAM: sshpam_free_ctx entering
debug3: PAM: sshpam_thread_cleanup entering
debug3: DOOPIE!#!#!
Failed keyboard-interactive/pam for user1 from 127.0.0.1 port
32861
ssh2
debug1: userauth-request for user user1 service ssh-connection
method
keyboard-interactive
debug1: attempt 2 failures 2
debug2: input_userauth_request: try method keyboard-interactive
debug1: keyboard-interactive devs
debug1: auth2_challenge: user=user1 devs=
debug1: kbdint_alloc: devices 'pam'
debug2: auth2_challenge_start: devices pam
debug2: kbdint_next_device: devices <empty>
debug1: auth2_challenge_start: trying authentication method
'pam'
debug3: PAM: sshpam_init_ctx entering
debug3: sshpam_thread called!!!!!!!!
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 1
debug3: ssh_msg_recv entering
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: DOOPIE!#!#!
Postponed keyboard-interactive for user1 from 127.0.0.1 port
32861 ssh2
debug2: PAM: sshpam_respond entering, 1 responses
debug3: ssh_msg_send: type 6
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: POOPIE!@!@!
debug1: do_pam_account: called
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 3
debug3: ssh_msg_recv entering
debug3: PAM: do_pam_account pam_acct_mgmt = 17 (User account
has
expired)
debug3: ssh_msg_send: type 9
debug3: PAM: PAM_AUTH_ERR
debug3: DOOPIE!#!#!
Postponed keyboard-interactive/pam for user1 from 127.0.0.1
port 32861
ssh2
debug2: PAM: sshpam_respond entering, 0 responses
debug2: auth2_challenge_start: devices <empty>
debug3: PAM: sshpam_free_ctx entering
debug3: PAM: sshpam_thread_cleanup entering
debug3: DOOPIE!#!#!
Failed keyboard-interactive/pam for user1 from 127.0.0.1 port
32861
ssh2
debug1: userauth-request for user user1 service ssh-connection
method
keyboard-interactive
debug1: attempt 3 failures 3
debug2: input_userauth_request: try method keyboard-interactive
debug1: keyboard-interactive devs
debug1: auth2_challenge: user=user1 devs=
debug1: kbdint_alloc: devices 'pam'
debug2: auth2_challenge_start: devices pam
debug2: kbdint_next_device: devices <empty>
debug1: auth2_challenge_start: trying authentication method
'pam'
debug3: PAM: sshpam_init_ctx entering
debug3: sshpam_thread called!!!!!!!!
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 1
debug3: ssh_msg_recv entering
debug3: DOOPIE!#!#!
Postponed keyboard-interactive for user1 from 127.0.0.1 port
32861 ssh2
debug2: PAM: sshpam_respond entering, 1 responses
debug3: ssh_msg_send: type 6
debug3: PAM: sshpam_query entering
debug3: ssh_msg_recv entering
debug3: POOPIE!@!@!
debug1: do_pam_account: called
debug3: PAM: sshpam_thread_conv entering, 1 messages
debug3: ssh_msg_send: type 3
debug3: PAM: do_pam_account pam_acct_mgmt = 17 (User account
has
expired)
debug3: ssh_msg_send: type 9
debug3: ssh_msg_recv entering
debug3: PAM: PAM_AUTH_ERR
debug3: DOOPIE!#!#!
Postponed keyboard-interactive/pam for user1 from 127.0.0.1
port 32861
ssh2
debug2: PAM: sshpam_respond entering, 0 responses
debug2: auth2_challenge_start: devices <empty>
debug3: PAM: sshpam_free_ctx entering
debug3: PAM: sshpam_thread_cleanup entering
debug3: DOOPIE!#!#!
Failed keyboard-interactive/pam for user1 from 127.0.0.1 port
32861
ssh2
Connection closed by 127.0.0.1
debug1: do_cleanup
debug1: PAM: cleanup
debug3: PAM: sshpam_thread_cleanup entering
[Mon May 01|14:18:11][root@unknown:/]
$
### END sshd debug ###
If you look at the sshd debug you will see that my pam module
returns
"debug3: PAM: do_pam_account pam_acct_mgmt = 17 (User account
has
expired)" however the user is prompted again for a password.
I looked
at the code and found that do_pam_account() is called from
sshpam_thread(void *ctxtp). There seems to be no code that kicks
the
user out after a bad attempt it just goes through the attempts
cycle. I
assume sshd checks the thread's return code this is how it knows
whether or not the authentication was successful so it should
be able
to kick the user out.
### START code snippet ###
if (compat20) {
if (!do_pam_account())
goto auth_fail;
if (sshpam_authctxt->force_pwchange) {
sshpam_err = pam_chauthtok(sshpam_handle,
PAM_CHANGE_EXPIRED_AUTHTOK);
if (sshpam_err != PAM_SUCCESS)
goto auth_fail;
sshpam_password_change_required(0);
}
}
auth_fail:
buffer_put_cstring(&buffer,
pam_strerror(sshpam_handle, sshpam_err));
/* XXX - can't do much about an error here */
ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, &buffer);
buffer_free(&buffer);
pthread_exit(NULL);
return (NULL); /* Avoid warning for non-pthread case */
}
### END code snippet ###
If you look at auth2.c in userauth_finish() the code checks
for
errors...
### START code snippet ###
#ifdef USE_PAM
debug3( "DOOPIE!#!#!" );
if (options.use_pam && authenticated) {
if (!PRIVSEP(do_pam_account())) {
/* if PAM returned a message, send it to the user */
if (buffer_len(&loginmsg) > 0) {
buffer_append(&loginmsg, "\0", 1);
userauth_send_banner(buffer_ptr(&loginmsg));
packet_write_wait();
}
fatal("Access denied for user %s by PAM account "
"configuration", authctxt->user);
}
}
#endif
### END code snippet ###
Here there is a fatal statement saying that access is denied,
which I
assume kicks you
out.
SSHD CONFIGURATION #3
Protocol 2
PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes
user1 now prompts 4 times three times for keyboard-interactive
and once
for password.
########################################################
[Fri Apr 28|19:24:50][root@unknown:/]
$ ssh -l user1 localhost
Password:
User account has expired!
Password:
User account has expired!
Password:
User account has expired!
user1@localhost's password:
User account has expired!
Are you sure about this one? If PasswordAuthentication is
set to no, it
won't even be offered to the client.
I wonder if "UsePrivilegeSeparation yes" had anything to do
with it?
Elroy
.
-
How do you make the Solaris Secure Shell (aka the SSH client
that is shipped with Solaris 9) work with Kerberos 5 authentication?
-
With the release of Solaris 9, Sun has finally started to ship
a mostly reasonable SSH client (known by Sun as the Solaris
Secure Shell) and server. The server is in
/usr/lib/ssh/sshd
directory. The sshd daemon included in Solaris 9 will use the
PAM (Pluggable Authentication Module) framework that comes with
Solaris 9 to do authentication, in addition to the internal
public key framework that SSH is capable of using for authentication.
The PAM configuration on Solaris 9 doesn't have any specific
configuration for the sshd daemon. Activating the Kerberos 5
configuration lines at the end of the /etc/pam.conf
file will not make sshd work with Kerberos 5. This is contrary
to the comments in that file about what must be done to make
Kerberos 5 authentication work for all the services on the system.
If the following authentication bits are added to the the
/etc/pam.conf file, the sshd daemon will just start
using Kerberos authentication, and will fall-back to any local
password on the machine, if the KDC is unavailable, or the password
given doesn't match that stored in the KDC.
#
# sshd authentication order
#
sshd auth sufficient pam_krb5.so.1 try_first_pass
sshd auth required pam_unix_auth.so.1
No changes are necessary to the /etc/ssh/sshd_config
file to make sshd with Kerberos. Of course, the /etc/krb5/krb5.conf
file will need to be setup properly, but that's a task outlined
in another NSFAQ.
Thanks to Chris Ross for helping to rationalize and debug the
configuration.
Back
to the page of Not So Frequently Asked Questions.
alexei at soemail.rutgers.edu
alexei at soemail.rutgers.edu
Tue Sep 30 10:26:25 EDT 2003
Dear sun managers,
Thanks a lot to those of you who replied to my posting.
The suggestions and ideas were very good.
The winning solution came from Fergus Donohue, who pointed me at
the bug report at http://bugzilla.mindrot.org/show_bug.cgi?id=700
The advice about setting "PasswordAuthentication no" and
"ChallengeResponseAuthentication yes" in sshd_config made it to work
with PAM and my LDAP users can login now.
However, for LDAP to work properly, I had to modify my pam.conf slightly,
but it is minor change:
sshd auth requisite pam_authtok_get.so.1
sshd auth required pam_dhkeys.so.1
sshd auth sufficient pam_unix_auth.so.1
sshd auth required pam_ldap.so.1 try_first_pass
sshd account required pam_unix_account.so.1
Regards,
Alexei
I have no problem getting pam and winbindd (samba) to play well,
though
Solaris 10 has been a real challenge (still is) I am reading the
docs
http://docs.sun.com/app/docs/doc/816-4557/6maosrjj0?a=view#pam-36
and
see they have really re-worked pam since Solaris 9.
I am attempting to run winbindd as an auth module but get conflicting
results; it appears the module just is not working, pam, in it's
new
implementation does not accept it.
Here is a snip from the system during a ssh login:
Jan 19 10:27:00 testhost2 pam_winbind[17861]: [ID 467601 auth.error]
request failed: No such user, PAM error was 13, NT error was
NT_STATUS_NO_SUCH_USER
So something is happening at the pam_winbind layer.
And the winbindd log:
[2006/01/19 13:46:06, 6] nsswitch/winbindd.c:new_connection(638)
accepted socket 17
[2006/01/19 13:46:06, 3]
nsswitch/winbindd_misc.c:winbindd_interface_version(454)
[ 0]: request interface version
[2006/01/19 13:46:06, 3]
nsswitch/winbindd_misc.c:winbindd_priv_pipe_dir(487)
[ 0]: request location of privileged pipe
[2006/01/19 13:46:06, 6] nsswitch/winbindd.c:new_connection(638)
accepted socket 18
[2006/01/19 13:46:06, 3]
nsswitch/winbindd_user.c:winbindd_getpwnam(336)
[ 0]: getpwnam TESTDOM+testuser
[2006/01/19 13:46:12, 3]
nsswitch/winbindd_user.c:winbindd_getpwnam(336)
[ 0]: getpwnam TESTDOM+testuser
[2006/01/19 13:46:12, 3]
nsswitch/winbindd_user.c:winbindd_getpwnam(336)
[ 0]: getpwnam TESTDOM+testuser
[2006/01/19 13:46:12, 3]
nsswitch/winbindd_user.c:winbindd_getpwnam(336)
[ 0]: getpwnam TESTDOM+testuser
Anyone have some ideas?
I have included a copy of my pam.conf for Solaris 10 as well as
a copy
from my 'working' Solaris 9.
========BEGIN pam.conf Solaris 9 ==================
#
#ident "@(#)pam.conf 1.20 02/01/23 SMI"
#
# Copyright 1996-2002 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# PAM configuration
#
# Unless explicitly defined, all services use the modules # defined
in
the "other" section.
#
# Modules are defined with relative pathnames, i.e., they are #
relative to /usr/lib/security/$ISA. Absolute path names, as # present
in this file in previous releases are still acceptable.
#
# Authentication management
#
# login service (explicit because of pam_dial_auth) #
login auth requisite pam_authtok_get.so.1
login auth sufficient pam_dhkeys.so.1
login auth sufficient pam_unix_auth.so.1
login auth sufficient pam_dial_auth.so.1
login auth sufficient /usr/lib/security/pam_winbind.so.1
try_first_pass
#
# rlogin service (explicit because of pam_rhost_auth) #
rlogin auth requisite pam_authtok_get.so.1
rlogin auth sufficient pam_dhkeys.so.1
rlogin auth sufficient pam_unix_auth.so.1
rlogin auth sufficient /usr/lib/security/pam_winbind.so.1
try_first_pass
#
# rsh service (explicit because of pam_rhost_auth, # and pam_unix_auth
for meaningful
rsh auth required pam_unix_auth.so.1
#
# PPP service (explicit because of pam_dial_auth) #
ppp auth requisite pam_authtok_get.so.1
ppp auth required pam_dhkeys.so.1
ppp auth required pam_unix_auth.so.1
ppp auth required pam_dial_auth.so.1
#
# Default definitions for Authentication management # Used when
service
name is not #explicitly mentioned for authenctication #
other auth requisite pam_authtok_get.so.1
other auth sufficient pam_dhkeys.so.1
other auth sufficient pam_unix_auth.so.1
other auth sufficient /usr/lib/security/pam_winbind.so.1
try_first_pass
#
# passwd command (explicit because of a different authentication
module) #
passwd auth required pam_passwd_auth.so.1
#
# cron service (explicit because of non-usage of pam_roles.so.1)
#
cron account required pam_projects.so.1
cron account required pam_unix_account.so.1
#
# Default definition for Account management # Used when service
name is
not explicitly mentioned for account management #
other account requisite pam_roles.so.1
other account sufficient pam_projects.so.1
other account sufficient pam_unix_account.so.1
#
# Default definition for Session management # Used when service
name is
not explicitly mentioned for session management #
other session required pam_unix_session.so.1
other session sufficient /usr/lib/security/pam_winbind.so.1
#
# Default definition for Password management # Used when service
name
is not explicitly mentioned for password management #
other password required pam_dhkeys.so.1
other password requisite pam_authtok_get.so.1
other password requisite pam_authtok_check.so.1
other password required pam_authtok_store.so.1
#
# Support for Kerberos V5 authentication (uncomment to use Kerberos)
#
#rlogin auth optional pam_krb5.so.1 try_first_pass
#login auth optional pam_krb5.so.1 try_first_pass
#other auth optional pam_krb5.so.1 try_first_pass
#cron account optional pam_krb5.so.1
#other account optional pam_krb5.so.1
#other session optional pam_krb5.so.1
#other password optional pam_krb5.so.1 try_first_pass
#========END pam.conf Solaris 9 ==================
#========BEGIN pam.conf Solaris 10 ==================
#
#ident "@(#)pam.conf 1.28 04/04/21 SMI"
#
# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# PAM configuration
#
# Unless explicitly defined, all services use the modules
# defined in the "other" section.
#
# Modules are defined with relative pathnames, i.e., they are
# relative to /usr/lib/security/$ISA. Absolute path names, as
# present in this file in previous releases are still acceptable.
#
# Authentication management
#
# login service (explicit because of pam_dial_auth)
#
login auth requisite pam_authtok_get.so.1
#---- Begin Winbind -----#
#---- Notes: Pass, OK, stacked authtok_get first
login auth binding pam_winbind.so.1 try_first_pass
#---- End Winbind -------#
login auth required pam_dhkeys.so.1
login auth required pam_unix_cred.so.1
login auth required pam_unix_auth.so.1
login auth required pam_dial_auth.so.1
#
# rlogin service (explicit because of pam_rhost_auth)
#
rlogin auth sufficient pam_rhosts_auth.so.1
rlogin auth requisite pam_authtok_get.so.1
#---- Begin Winbind -----#
#---- Notes: OK
rlogin auth required pam_winbind.so.1 try_first_pass
#---- End Winbind -------#
rlogin auth required pam_dhkeys.so.1
rlogin auth required pam_unix_cred.so.1
rlogin auth required pam_unix_auth.so.1
#
# Kerberized rlogin service
#
krlogin auth required pam_unix_cred.so.1
krlogin auth binding pam_krb5.so.1
krlogin auth required pam_unix_auth.so.1
#
# rsh service (explicit because of pam_rhost_auth,
# and pam_unix_auth for meaningful pam_setcred)
#
rsh auth sufficient pam_rhosts_auth.so.1
rsh auth required pam_unix_cred.so.1
#
# Kerberized rsh service
#
krsh auth required pam_unix_cred.so.1
krsh auth binding pam_krb5.so.1
krsh auth required pam_unix_auth.so.1
#
# Kerberized telnet service
#
ktelnet auth required pam_unix_cred.so.1
ktelnet auth binding pam_krb5.so.1
ktelnet auth required pam_unix_auth.so.1
#
# PPP service (explicit because of pam_dial_auth)
#
ppp auth requisite pam_authtok_get.so.1
ppp auth required pam_dhkeys.so.1
ppp auth required pam_unix_cred.so.1
ppp auth required pam_unix_auth.so.1
ppp auth required pam_dial_auth.so.1
#
# Default definitions for Authentication management
# Used when service name is not explicitly mentioned for authentication
#
other auth requisite pam_authtok_get.so.1
#---- Begin Winbind -----#
#---- Notes: Pass, OK, but asks for password twice and passes on
the
scecond # try without the "try_first_pass"
other auth binding pam_winbind.so.1 try_first_pass debug
#---- End Winbind -------#
other auth required pam_dhkeys.so.1
other auth required pam_unix_cred.so.1
other auth required pam_unix_auth.so.1
other auth required pam_krb5.so.1 use_first_pass
#
# passwd command (explicit because of a different authentication
module)
#
#---- Begin Winbind -----#
#---- Notes: no problem for files users.
passwd auth required pam_winbind.so.1
#---- End Winbind -------#
passwd auth required pam_passwd_auth.so.1
#
# cron service (explicit because of non-usage of pam_roles.so.1)
#
cron account required pam_unix_account.so.1
#
# Default definition for Account management
# Used when service name is not explicitly mentioned for account
management
#
other account requisite pam_roles.so.1
other account required pam_unix_account.so.1
#---- Begin Winbind -----#
#---- Notes: Pass, OK
other account sufficient pam_winbind.so.1
#---- End Winbind -------#
#
# Default definition for Session management
# Used when service name is not explicitly mentioned for session
management
#
#---- Begin Winbind -----#
#---- Notes: Causes
other session required pam_winbind.so.1 try_first_pass
#---- End Winbind -------#
other session required pam_unix_session.so.1
#
# Default definition for Password management
# Used when service name is not explicitly mentioned for password
management
#
other password required pam_dhkeys.so.1
other password requisite pam_authtok_get.so.1
other password requisite pam_authtok_check.so.1
other password required pam_authtok_store.so.1
#---- Begin Winbind -----#
#---- Notes:
other password sufficient pam_winbind.so.1 try_first_pass
#---- End Winbind -----#
#
# Support for Kerberos V5 authentication and example configurations
can
# be found in the pam_krb5(5) man page under the "EXAMPLES" section.
#
#========END pam.conf Solaris 10 ==================
thanks
My email is thomas not tom.
The PAM framework has been changed to consist
of more modular, smaller shared object files. The PAM API
has not been changed. Isolation from naming services is
greater. Specifically, the framework has been enhanced to
allow customers to concentrate on developing their own solution
without needing to manipulate many of the naming service and authentication
details.
Our first goal was to install the operating systems and then
install openldap to fiddle around and understand how it works. Installing
the Solaris OS proved to be quite a challenge in itself as none
of us had prior experience working with it. Thus we decided to do
a parallel installation and configuration on the Linux platform
as well. Much of the documentation on the Internet was done on the
Linux platform, thus we can get a comparison between the Solaris
and Linux installation and configurations.
On the Linux platform, I used the
default RedHat 7.3 distribution with all packages added and then
patched them with the up2date program provided by RedHat.The package
versions for the main components are as follows:
openssl096-0.9.6-6
db3-3.3.11-6
cyrus-sasl-1.5.24-25
krb5-libs-1.2.4-1
krb5-server-1.2.4-1
openldap12-1.2.13-3
In case of broken links
please try to use Google search. If you find the page please notify
us about new location
PAM
information and experiences some Solaris information
UW-ID-AUTH Solaris PAM Authentication
The UWdir Identification and Authentication service can be used to
provide authentication services to PAM aware applications on the Solaris/Unix
platform. This note describes how to obtain and configure an xhier
package which will allow Solaris systems to authenticate against the
Uwaterloo.ca NT4 Domain. A basic configuration allows all
PAM aware applications to use the UW/ID-AUTH service; site specific
configurations are possible.
Copyright © 1996-2009 by Dr. Nikolai Bezroukov.
www.softpanorama.org was
created as a service to the UN Sustainable Development Networking Programme (SDNP)
in the author free time.
Submit
comments This document is an industrial compilation designed and created
exclusively for educational use and is placed under the copyright of the
Open Content License(OPL).
Site uses AdSense so you need to be aware of Google privacy policy. Original materials copyright belong to respective owners. Quotes are made
for educational purposes only in compliance with the fair use doctrine.
Disclaimer:
- The statements, views and opinions presented on
this web page are those of the author and are not endorsed by, nor do they necessarily
reflect, the opinions of the author present and former employers, SDNP or any other
organization the author may be associated with.
- We do not warrant the correctness of the information provided or its
fitness for any purpose
- In no way this site is associated with or endorse cybersquatters
using
the term "softpanorama" with other main or country domains (e.g. softpanorama.com) with
bad faith intent to profit from the goodwill belonging to
someone else.
Last modified:
January 26, 2010