PAM(3PAM) PAM Library Functions PAM(3PAM)

NAME


pam - PAM (Pluggable Authentication Module)

SYNOPSIS


#include <security/pam_appl.h>
cc [ flag... ] file ... -lpam [ library ... ]


DESCRIPTION


The PAM framework, libpam, consists of an interface library and
multiple authentication service modules. The PAM interface library
is the layer implementing the Application Programming Interface
(API). The authentication service modules are a set of dynamically
loadable objects invoked by the PAM API to provide a particular type
of user authentication. PAM gives system administrators the
flexibility of choosing any authentication service available on the
system to perform authentication. This framework also allows new
authentication service modules to be plugged in and made available
without modifying the applications.

Interface Overview


The PAM library interface consists of six categories of functions,
the names for which all start with the prefix pam_.


The first category contains functions for establishing and
terminating an authentication activity, which are pam_start(3PAM) and
pam_end(3PAM). The functions pam_set_data(3PAM) and
pam_get_data(3PAM) maintain module specific data. The functions
pam_set_item(3PAM) and pam_get_item(3PAM) maintain state information.
pam_strerror(3PAM) is the function that returns error status
information.


The second category contains the functions that authenticate an
individual user and set the credentials of the user,
pam_authenticate(3PAM) and pam_setcred(3PAM).


The third category of PAM interfaces is account management. The
function pam_acct_mgmt(3PAM) checks for password aging and access-
hour restrictions.


Category four contains the functions that perform session management
after access to the system has been granted. See
pam_open_session(3PAM) and pam_close_session(3PAM)


The fifth category consists of the function that changes
authentication tokens, pam_chauthtok(3PAM). An authentication token
is the object used to verify the identity of the user. In UNIX, an
authentication token is a user's password.


The sixth category of functions can be used to set values for PAM
environment variables. See pam_putenv(3PAM), pam_getenv(3PAM), and
pam_getenvlist(3PAM).


The pam_*() interfaces are implemented through the library libpam.
For each of the categories listed above, excluding categories one and
six, dynamically loadable shared modules exist that provides the
appropriate service layer functionality upon demand. The functional
entry points in the service layer start with the pam_sm_ prefix.
The only difference between the pam_sm_*() interfaces and their
corresponding pam_ interfaces is that all the pam_sm_*() interfaces
require extra parameters to pass service-specific options to the
shared modules. Refer to pam_sm(3PAM) for an overview of the PAM
service module APIs.

Stateful Interface


A sequence of calls sharing a common set of state information is
referred to as an authentication transaction. An authentication
transaction begins with a call to pam_start(). pam_start() allocates
space, performs various initialization activities, and assigns a PAM
authentication handle to be used for subsequent calls to the library.


After initiating an authentication transaction, applications can
invoke pam_authenticate() to authenticate a particular user, and
pam_acct_mgmt() to perform system entry management. For example, the
application may want to determine if the user's password has
expired.


If the user has been successfully authenticated, the application
calls pam_setcred() to set any user credentials associated with the
authentication service. Within one authentication transaction
(between pam_start() and pam_end()), all calls to the PAM interface
should be made with the same authentication handle returned by
pam_start(). This is necessary because certain service modules may
store module-specific data in a handle that is intended for use by
other modules. For example, during the call to pam_authenticate(),
service modules may store data in the handle that is intended for use
by pam_setcred().


To perform session management, applications call pam_open_session().
Specifically, the system may want to store the total time for the
session. The function pam_close_session() closes the current session.


When necessary, applications can call pam_get_item() and
pam_set_item() to access and to update specific authentication
information. Such information may include the current username.


To terminate an authentication transaction, the application simply
calls pam_end(), which frees previously allocated space used to store
authentication information.

Application-Authentication Service Interactive Interface
The authentication service in PAM does not communicate directly with
the user; instead it relies on the application to perform all such
interactions. The application passes a pointer to the function,
conv(), along with any associated application data pointers, through
a pam_conv structure to the authentication service when it initiates
an authentication transaction, via a call to pam_start(). The service
will then use the function, conv(), to prompt the user for data,
output error messages, and display text information. Refer to
pam_start(3PAM) for more information.

Stacking Multiple Schemes


The PAM architecture enables authentication by multiple
authentication services through stacking. System entry applications,
such as login(1), stack multiple service modules to authenticate
users with multiple authentication services. The order in which
authentication service modules are stacked is specified in the
configuration file, pam.conf(5). A system administrator determines
this ordering, and also determines whether the same password can be
used for all authentication services.

Administrative Interface


The authentication library, /usr/lib/libpam.so.1, implements the
framework interface. Various authentication services are implemented
by their own loadable modules whose paths are specified through the
pam.conf(5) file.

RETURN VALUES


The PAM functions may return one of the following generic values, or
one of the values defined in the specific man pages:

PAM_SUCCESS
The function returned successfully.


PAM_OPEN_ERR
dlopen() failed when dynamically loading a service
module.


PAM_SYMBOL_ERR
Symbol not found.


PAM_SERVICE_ERR
Error in service module.


PAM_SYSTEM_ERR
System error.


PAM_BUF_ERR
Memory buffer error.


PAM_CONV_ERR
Conversation failure.


PAM_PERM_DENIED
Permission denied.


ATTRIBUTES


See attributes(7) for description of the following attributes:


+---------------+-------------------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+-------------------------+
|MT Level | MT-Safe with exceptions |
+---------------+-------------------------+

SEE ALSO


login(1), pam_authenticate(3PAM), pam_chauthtok(3PAM),
pam_open_session(3PAM), pam_set_item(3PAM), pam_setcred(3PAM),
pam_sm(3PAM), pam_start(3PAM), pam_strerror(3PAM), pam.conf(5),
attributes(7)

NOTES


The interfaces in libpam(3LIB) are MT-Safe only if each thread within
the multithreaded application uses its own PAM handle.

August 19, 2023 PAM(3PAM)

tribblix@gmail.com :: GitHub :: Privacy