# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" "POT-Creation-Date: 2026-02-22 15:58+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: YAML Front Matter: description #: documentation/content/en/articles/pam/_index.adoc:1 #, no-wrap msgid "A guide to the PAM system and modules under FreeBSD" msgstr "" #. Copyright (c) 2001-2003 Networks Associates Technology, Inc. #. All rights reserved. #. This software was developed for the FreeBSD Project by ThinkSec AS and #. Network Associates Laboratories, the Security Research Division of #. Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 #. ("CBOSS"), as part of the DARPA CHATS research program. #. Redistribution and use in source and binary forms, with or without #. modification, are permitted provided that the following conditions #. are met: #. 1. Redistributions of source code must retain the above copyright #. notice, this list of conditions and the following disclaimer. #. 2. Redistributions in binary form must reproduce the above copyright #. notice, this list of conditions and the following disclaimer in the #. documentation and/or other materials provided with the distribution. #. 3. The name of the author may not be used to endorse or promote #. products derived from this software without specific prior written #. permission. #. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND #. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE #. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #. ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE #. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS #. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) #. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT #. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY #. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF #. SUCH DAMAGE. #. type: Title = #: documentation/content/en/articles/pam/_index.adoc:1 #: documentation/content/en/articles/pam/_index.adoc:45 #, no-wrap msgid "Pluggable Authentication Modules" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:81 msgid "Abstract" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:83 msgid "" "This article describes the underlying principles and mechanisms of the " "Pluggable Authentication Modules (PAM) library, and explains how to " "configure PAM, how to integrate PAM into applications, and how to write PAM " "modules." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:85 msgid "'''" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:89 #, no-wrap msgid "Introduction" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:92 msgid "" "The Pluggable Authentication Modules (PAM) library is a generalized API for " "authentication-related services which allows a system administrator to add " "new authentication methods simply by installing new PAM modules, and to " "modify authentication policies by editing configuration files." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:96 msgid "" "PAM was defined and developed in 1995 by Vipin Samar and Charlie Lai of Sun " "Microsystems, and has not changed much since. In 1997, the Open Group " "published the X/Open Single Sign-on (XSSO) preliminary specification, which " "standardized the PAM API and added extensions for single (or rather " "integrated) sign-on. At the time of this writing, this specification has " "not yet been adopted as a standard." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:98 msgid "" "Although this article focuses primarily on FreeBSD 5.x, which uses OpenPAM, " "it should be equally applicable to FreeBSD 4.x, which uses Linux-PAM, and " "other operating systems such as Linux and Solaris(TM)." msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:100 #, no-wrap msgid "Terms and Conventions" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:103 #, no-wrap msgid "Definitions" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:110 msgid "" "The terminology surrounding PAM is rather confused. Neither Samar and Lai's " "original paper nor the XSSO specification made any attempt at formally " "defining terms for the various actors and entities involved in PAM, and the " "terms that they do use (but do not define) are sometimes misleading and " "ambiguous. The first attempt at establishing a consistent and unambiguous " "terminology was a whitepaper written by Andrew G. Morgan (author of Linux-" "PAM) in 1999. While Morgan's choice of terminology was a huge leap forward, " "it is in this author's opinion by no means perfect. What follows is an " "attempt, heavily inspired by Morgan, to define precise and unambiguous terms " "for all actors and entities involved in PAM." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:111 #, no-wrap msgid "account" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:113 msgid "The set of credentials the applicant is requesting from the arbitrator." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:114 #, no-wrap msgid "applicant" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:116 msgid "The user or entity requesting authentication." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:117 #, no-wrap msgid "arbitrator" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:119 msgid "" "The user or entity who has the privileges necessary to verify the " "applicant's credentials and the authority to grant or deny the request." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:120 #, no-wrap msgid "chain" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:123 msgid "" "A sequence of modules that will be invoked in response to a PAM request. " "The chain includes information about the order in which to invoke the " "modules, what arguments to pass to them, and how to interpret the results." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:124 #, no-wrap msgid "client" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:126 msgid "" "The application responsible for initiating an authentication request on " "behalf of the applicant and for obtaining the necessary authentication " "information from him." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:127 #, no-wrap msgid "facility" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:129 msgid "" "One of the four basic groups of functionality provided by PAM: " "authentication, account management, session management and authentication " "token update." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:130 #, no-wrap msgid "module" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:132 msgid "" "A collection of one or more related functions implementing a particular " "authentication facility, gathered into a single (normally dynamically " "loadable) binary file and identified by a single name." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:133 #, no-wrap msgid "policy" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:136 msgid "" "The complete set of configuration statements describing how to handle PAM " "requests for a particular service. A policy normally consists of four " "chains, one for each facility, though some services do not use all four " "facilities." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:137 #, no-wrap msgid "server" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:139 msgid "" "The application acting on behalf of the arbitrator to converse with the " "client, retrieve authentication information, verify the applicant's " "credentials and grant or deny requests." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:140 #, no-wrap msgid "service" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:143 msgid "" "A class of servers providing similar or related functionality and requiring " "similar authentication. PAM policies are defined on a per-service basis, so " "all servers that claim the same service name will be subject to the same " "policy." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:144 #, no-wrap msgid "session" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:147 msgid "" "The context within which service is rendered to the applicant by the " "server. One of PAM's four facilities, session management, is concerned " "exclusively with setting up and tearing down this context." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:148 #, no-wrap msgid "token" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:150 msgid "" "A chunk of information associated with the account, such as a password or " "passphrase, which the applicant must provide to prove his identity." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:151 #, no-wrap msgid "transaction" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:153 msgid "" "A sequence of requests from the same applicant to the same instance of the " "same server, beginning with authentication and session set-up and ending " "with session tear-down." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:155 #, no-wrap msgid "Usage Examples" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:158 msgid "" "This section aims to illustrate the meanings of some of the terms defined " "above by way of a handful of simple examples." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:159 #, no-wrap msgid "Client and Server Are One" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:162 msgid "This simple example shows `alice` man:su[1]'ing to `root`." msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:167 #, no-wrap msgid "" "% whoami\n" "alice\n" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:170 #, no-wrap msgid "" "% ls -l `which su`\n" "-r-sr-xr-x 1 root wheel 10744 Dec 6 19:06 /usr/bin/su\n" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:175 #, no-wrap msgid "" "% su -\n" "Password: xi3kiune\n" "# whoami\n" "root\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:178 msgid "The applicant is `alice`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:179 msgid "The account is `root`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:180 msgid "The man:su[1] process is both client and server." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:181 msgid "The authentication token is `xi3kiune`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:182 msgid "The arbitrator is `root`, which is why man:su[1] is setuid `root`." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:183 #, no-wrap msgid "Client and Server Are Separate" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:187 msgid "" "The example below shows `eve` try to initiate an man:ssh[1] connection to " "`login.example.com`, ask to log in as `bob`, and succeed. Bob should have " "chosen a better password!" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:192 #, no-wrap msgid "" "% whoami\n" "eve\n" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:200 #, no-wrap msgid "" "% ssh bob@login.example.com\n" "bob@login.example.com's password:\n" "% god\n" "Last login: Thu Oct 11 09:52:57 2001 from 192.168.0.1\n" "Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994\n" "\tThe Regents of the University of California. All rights reserved.\n" "FreeBSD 4.4-STABLE (LOGIN) 4: Tue Nov 27 18:10:34 PST 2001\n" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:203 #, no-wrap msgid "" "Welcome to FreeBSD!\n" "%\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:207 msgid "The applicant is `eve`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:208 msgid "The client is Eve's man:ssh[1] process." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:209 msgid "The server is the man:sshd[8] process on `login.example.com`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:210 msgid "The account is `bob`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:211 msgid "The authentication token is `god`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:212 msgid "Although this is not shown in this example, the arbitrator is `root`." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:213 #, no-wrap msgid "Sample Policy" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:216 msgid "The following is FreeBSD's default policy for `sshd`:" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:225 #, no-wrap msgid "" "sshd\tauth\t\trequired\tpam_nologin.so\tno_warn\n" "sshd\tauth\t\trequired\tpam_unix.so\tno_warn try_first_pass\n" "sshd\taccount\t\trequired\tpam_login_access.so\n" "sshd\taccount\t\trequired\tpam_unix.so\n" "sshd\tsession\t\trequired\tpam_lastlog.so\tno_fail\n" "sshd\tpassword\trequired\tpam_permit.so\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:228 msgid "" "This policy applies to the `sshd` service (which is not necessarily " "restricted to the man:sshd[8] server.)" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:229 msgid "`auth`, `account`, `session` and `password` are facilities." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:230 msgid "" "[.filename]#pam_nologin.so#, [.filename]#pam_unix.so#, " "[.filename]#pam_login_access.so#, [.filename]#pam_lastlog.so# and " "[.filename]#pam_permit.so# are modules. It is clear from this example that " "[.filename]#pam_unix.so# provides at least two facilities (authentication " "and account management.)" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:232 #, no-wrap msgid "PAM Essentials" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:235 #, no-wrap msgid "Facilities and Primitives" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:238 msgid "" "The PAM API offers six different authentication primitives grouped in four " "facilities, which are described below." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:239 #, no-wrap msgid "`auth`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:242 msgid "" "_Authentication._ This facility concerns itself with authenticating the " "applicant and establishing the account credentials. It provides two " "primitives:" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:244 msgid "" "man:pam_authenticate[3] authenticates the applicant, usually by requesting " "an authentication token and comparing it with a value stored in a database " "or obtained from an authentication server." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:245 msgid "" "man:pam_setcred[3] establishes account credentials such as user ID, group " "membership and resource limits." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:246 #, no-wrap msgid "`account`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:249 msgid "" "_Account management._ This facility handles non-authentication-related " "issues of account availability, such as access restrictions based on the " "time of day or the server's work load. It provides a single primitive:" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:251 msgid "man:pam_acct_mgmt[3] verifies that the requested account is available." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:252 #, no-wrap msgid "`session`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:255 msgid "" "_Session management._ This facility handles tasks associated with session " "set-up and tear-down, such as login accounting. It provides two primitives:" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:257 msgid "" "man:pam_open_session[3] performs tasks associated with session set-up: add " "an entry in the [.filename]#utmp# and [.filename]#wtmp# databases, start an " "SSH agent, etc." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:258 msgid "" "man:pam_close_session[3] performs tasks associated with session tear-down: " "add an entry in the [.filename]#utmp# and [.filename]#wtmp# databases, stop " "the SSH agent, etc." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:259 #, no-wrap msgid "`password`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:262 msgid "" "_Password management._ This facility is used to change the authentication " "token associated with an account, either because it has expired or because " "the user wishes to change it. It provides a single primitive:" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:264 msgid "" "man:pam_chauthtok[3] changes the authentication token, optionally verifying " "that it is sufficiently hard to guess, has not been used previously, etc." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:266 #, no-wrap msgid "Modules" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:271 msgid "" "Modules are a very central concept in PAM; after all, they are the \"M\" in " "\"PAM\". A PAM module is a self-contained piece of program code that " "implements the primitives in one or more facilities for one particular " "mechanism; possible mechanisms for the authentication facility, for " "instance, include the UNIX(R) password database, NIS, LDAP and Radius." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:273 #, no-wrap msgid "Module Naming" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:278 msgid "" "FreeBSD implements each mechanism in a single module, named " "`pam_mechanism.so` (for instance, `pam_unix.so` for the UNIX(R) mechanism.) " "Other implementations sometimes have separate modules for separate " "facilities, and include the facility name as well as the mechanism name in " "the module name. To name one example, Solaris(TM) has a " "`pam_dial_auth.so.1` module which is commonly used to authenticate dialup " "users." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:280 #, no-wrap msgid "Module Versioning" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:284 msgid "" "FreeBSD's original PAM implementation, based on Linux-PAM, did not use " "version numbers for PAM modules. This would commonly cause problems with " "legacy applications, which might be linked against older versions of the " "system libraries, as there was no way to load a matching version of the " "required modules." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:287 msgid "" "OpenPAM, on the other hand, looks for modules that have the same version " "number as the PAM library (currently 2), and only falls back to an " "unversioned module if no versioned module could be loaded. Thus legacy " "modules can be provided for legacy applications, while allowing new (or " "newly built) applications to take advantage of the most recent modules." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:289 msgid "" "Although Solaris(TM) PAM modules commonly have a version number, they are " "not truly versioned, because the number is a part of the module name and " "must be included in the configuration." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:291 #, no-wrap msgid "Chains and Policies" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:296 msgid "" "When a server initiates a PAM transaction, the PAM library tries to load a " "policy for the service specified in the man:pam_start[3] call. The policy " "specifies how authentication requests should be processed, and is defined in " "a configuration file. This is the other central concept in PAM: the " "possibility for the admin to tune the system security policy (in the wider " "sense of the word) simply by editing a text file." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:299 msgid "" "A policy consists of four chains, one for each of the four PAM facilities. " "Each chain is a sequence of configuration statements, each specifying a " "module to invoke, some (optional) parameters to pass to the module, and a " "control flag that describes how to interpret the return code from the module." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:302 msgid "" "Understanding the control flags is essential to understanding PAM " "configuration files. There are five different control flags:" msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:303 #, no-wrap msgid "`binding`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:306 msgid "" "If the module succeeds and no earlier module in the chain has failed, the " "chain is immediately terminated and the request is granted. If the module " "fails, the rest of the chain is executed, but the request is ultimately " "denied." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:308 msgid "" "This control flag was introduced by Sun in Solaris(TM) 9 (SunOS(TM) 5.9), " "and is also supported by OpenPAM." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:308 #, no-wrap msgid "`required`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:311 msgid "" "If the module succeeds, the rest of the chain is executed, and the request " "is granted unless some other module fails. If the module fails, the rest of " "the chain is also executed, but the request is ultimately denied." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:312 #, no-wrap msgid "`requisite`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:315 msgid "" "If the module succeeds, the rest of the chain is executed, and the request " "is granted unless some other module fails. If the module fails, the chain " "is immediately terminated and the request is denied." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:316 #, no-wrap msgid "`sufficient`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:319 msgid "" "If the module succeeds and no earlier module in the chain has failed, the " "chain is immediately terminated and the request is granted. If the module " "fails, the module is ignored and the rest of the chain is executed." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:321 msgid "" "As the semantics of this flag may be somewhat confusing, especially when it " "is used for the last module in a chain, it is recommended that the `binding` " "control flag be used instead if the implementation supports it." msgstr "" #. type: Labeled list #: documentation/content/en/articles/pam/_index.adoc:321 #, no-wrap msgid "`optional`" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:324 msgid "" "The module is executed, but its result is ignored. If all modules in a " "chain are marked `optional`, all requests will always be granted." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:327 msgid "" "When a server invokes one of the six PAM primitives, PAM retrieves the chain " "for the facility the primitive belongs to, and invokes each of the modules " "listed in the chain, in the order they are listed, until it reaches the end, " "or determines that no further processing is necessary (either because a " "`binding` or `sufficient` module succeeded, or because a `requisite` module " "failed.) The request is granted if and only if at least one module was " "invoked, and all non-optional modules succeeded." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:331 msgid "" "Note that it is possible, though not very common, to have the same module " "listed several times in the same chain. For instance, a module that looks " "up user names and passwords in a directory server could be invoked multiple " "times with different parameters specifying different directory servers to " "contact. PAM treat different occurrences of the same module in the same " "chain as different, unrelated modules." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:333 #, no-wrap msgid "Transactions" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:337 msgid "" "The lifecycle of a typical PAM transaction is described below. Note that if " "any of these steps fails, the server should report a suitable error message " "to the client and abort the transaction." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:339 msgid "" "If necessary, the server obtains arbitrator credentials through a mechanism " "independent of PAM-most commonly by virtue of having been started by `root`, " "or of being setuid `root`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:340 msgid "" "The server calls man:pam_start[3] to initialize the PAM library and specify " "its service name and the target account, and register a suitable " "conversation function." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:341 msgid "" "The server obtains various information relating to the transaction (such as " "the applicant's user name and the name of the host the client runs on) and " "submits it to PAM using man:pam_set_item[3]." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:342 msgid "The server calls man:pam_authenticate[3] to authenticate the applicant." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:343 msgid "" "The server calls man:pam_acct_mgmt[3] to verify that the requested account " "is available and valid. If the password is correct but has expired, " "man:pam_acct_mgmt[3] will return `PAM_NEW_AUTHTOK_REQD` instead of " "`PAM_SUCCESS`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:344 msgid "" "If the previous step returned `PAM_NEW_AUTHTOK_REQD`, the server now calls " "man:pam_chauthtok[3] to force the client to change the authentication token " "for the requested account." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:345 msgid "" "Now that the applicant has been properly authenticated, the server calls " "man:pam_setcred[3] to establish the credentials of the requested account. It " "is able to do this because it acts on behalf of the arbitrator, and holds " "the arbitrator's credentials." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:346 msgid "" "Once the correct credentials have been established, the server calls " "man:pam_open_session[3] to set up the session." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:347 msgid "" "The server now performs whatever service the client requested-for instance, " "provide the applicant with a shell." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:348 msgid "" "Once the server is done serving the client, it calls " "man:pam_close_session[3] to tear down the session." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:349 msgid "" "Finally, the server calls man:pam_end[3] to notify the PAM library that it " "is done and that it can release whatever resources it has allocated in the " "course of the transaction." msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:351 #, no-wrap msgid "PAM Configuration" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:354 #, no-wrap msgid "PAM Policy Files" msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:357 #, no-wrap msgid "The [.filename]#/etc/pam.conf#" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:362 msgid "" "The traditional PAM policy file is [.filename]#/etc/pam.conf#. This file " "contains all the PAM policies for your system. Each line of the file " "describes one step in a chain, as shown below:" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:366 #, no-wrap msgid "login auth required pam_nologin.so no_warn\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:370 msgid "" "The fields are, in order: service name, facility name, control flag, module " "name, and module arguments. Any additional fields are interpreted as " "additional module arguments." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:374 msgid "" "A separate chain is constructed for each service / facility pair, so while " "the order in which lines for the same service and facility appear is " "significant, the order in which the individual services and facilities are " "listed is not. The examples in the original PAM paper grouped configuration " "lines by facility, and the Solaris(TM) stock [.filename]#pam.conf# still " "does that, but FreeBSD's stock configuration groups configuration lines by " "service. Either way is fine; either way makes equal sense." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:376 #, no-wrap msgid "The [.filename]#/etc/pam.d#" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:381 msgid "" "OpenPAM and Linux-PAM support an alternate configuration mechanism, which is " "the preferred mechanism in FreeBSD. In this scheme, each policy is " "contained in a separate file bearing the name of the service it applies to. " "These files are stored in [.filename]#/etc/pam.d/#." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:384 msgid "" "These per-service policy files have only four fields instead of " "[.filename]#pam.conf#'s five: the service name field is omitted. Thus, " "instead of the sample [.filename]#pam.conf# line from the previous section, " "one would have the following line in [.filename]#/etc/pam.d/login#:" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:388 #, no-wrap msgid "auth required pam_nologin.so no_warn\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:392 msgid "" "As a consequence of this simplified syntax, it is possible to use the same " "policy for multiple services by linking each service name to a same policy " "file. For instance, to use the same policy for the `su` and `sudo` " "services, one could do as follows:" msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:397 #, no-wrap msgid "" "# cd /etc/pam.d\n" "# ln -s su sudo\n" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:400 msgid "" "This works because the service name is determined from the file name rather " "than specified in the policy file, so the same file can be used for multiple " "differently-named services." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:402 msgid "" "Since each service's policy is stored in a separate file, the " "[.filename]#pam.d# mechanism also makes it very easy to install additional " "policies for third-party software packages." msgstr "" #. type: Title ==== #: documentation/content/en/articles/pam/_index.adoc:404 #, no-wrap msgid "The Policy Search Order" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:408 msgid "" "As we have seen above, PAM policies can be found in a number of places. " "What happens if policies for the same service exist in multiple places?" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:410 msgid "" "It is essential to understand that PAM's configuration system is centered on " "chains." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:412 #, no-wrap msgid "Breakdown of a Configuration Line" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:415 msgid "" "As explained in crossref:pam[pam-config-file, PAM Policy Files], each line " "in [.filename]#/etc/pam.conf# consists of four or more fields: the service " "name, the facility name, the control flag, the module name, and zero or more " "module arguments." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:418 msgid "" "The service name is generally (though not always) the name of the " "application the statement applies to. If you are unsure, refer to the " "individual application's documentation to determine what service name it " "uses." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:420 msgid "" "Note that if you use [.filename]#/etc/pam.d/# instead of [.filename]#/etc/" "pam.conf#, the service name is specified by the name of the policy file, and " "omitted from the actual configuration lines, which then start with the " "facility name." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:423 msgid "" "The facility is one of the four facility keywords described in " "crossref:pam[pam-facilities-primitives, Facilities and Primitives]." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:428 #, no-wrap msgid "" "Likewise, the control flag is one of the four keywords described in\n" "\tcrossref:pam[pam-chains-policies, Chains and Policies], describing how to interpret the return code from the module. \n" "Linux-PAM supports an alternate syntax that lets you specify the action to associate with each possible return code, but this should be avoided as it is non-standard and closely tied in with the way Linux-PAM dispatches service calls (which differs greatly from the way Solaris(TM) and OpenPAM do it.) \n" "Unsurprisingly, OpenPAM does not support this syntax.\n" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:430 #, no-wrap msgid "Policies" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:433 msgid "" "To configure PAM correctly, it is essential to understand how policies are " "interpreted." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:436 msgid "" "When an application calls man:pam_start[3], the PAM library loads the policy " "for the specified service and constructs four module chains (one for each " "facility.) If one or more of these chains are empty, the corresponding " "chains from the policy for the `other` service are substituted." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:440 msgid "" "When the application later calls one of the six PAM primitives, the PAM " "library retrieves the chain for the corresponding facility and calls the " "appropriate service function in each module listed in the chain, in the " "order in which they were listed in the configuration. After each call to a " "service function, the module type and the error code returned by the service " "function are used to determine what happens next. With a few exceptions, " "which we discuss below, the following table applies:" msgstr "" #. type: Block title #: documentation/content/en/articles/pam/_index.adoc:441 #, no-wrap msgid "PAM Chain Execution Summary" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:446 #, no-wrap msgid "PAM_SUCCESS" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:447 #, no-wrap msgid "PAM_IGNORE" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:449 #, no-wrap msgid "other" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:450 #, no-wrap msgid "binding" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:451 #: documentation/content/en/articles/pam/_index.adoc:466 #, no-wrap msgid "if (!fail) break;" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:452 #: documentation/content/en/articles/pam/_index.adoc:456 #: documentation/content/en/articles/pam/_index.adoc:457 #: documentation/content/en/articles/pam/_index.adoc:461 #: documentation/content/en/articles/pam/_index.adoc:462 #: documentation/content/en/articles/pam/_index.adoc:467 #: documentation/content/en/articles/pam/_index.adoc:469 #: documentation/content/en/articles/pam/_index.adoc:471 #: documentation/content/en/articles/pam/_index.adoc:472 #: documentation/content/en/articles/pam/_index.adoc:473 #, no-wrap msgid "-" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:454 #: documentation/content/en/articles/pam/_index.adoc:459 #, no-wrap msgid "fail = true;" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:455 #, no-wrap msgid "required" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:460 #, no-wrap msgid "requisite" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:464 #, no-wrap msgid "fail = true; break;" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:465 #, no-wrap msgid "sufficient" msgstr "" #. type: Table #: documentation/content/en/articles/pam/_index.adoc:470 #, no-wrap msgid "optional" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:477 msgid "" "If `fail` is true at the end of a chain, or when a \"break\" is reached, the " "dispatcher returns the error code returned by the first module that failed. " "Otherwise, it returns `PAM_SUCCESS`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:479 msgid "" "The first exception of note is that the error code `PAM_NEW_AUTHTOK_REQD` is " "treated like a success, except that if no module failed, and at least one " "module returned `PAM_NEW_AUTHTOK_REQD`, the dispatcher will return " "`PAM_NEW_AUTHTOK_REQD`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:481 msgid "" "The second exception is that man:pam_setcred[3] treats `binding` and " "`sufficient` modules as if they were `required`." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:483 msgid "" "The third and final exception is that man:pam_chauthtok[3] runs the entire " "chain twice (once for preliminary checks and once to actually set the " "password), and in the preliminary phase it treats `binding` and `sufficient` " "modules as if they were `required`." msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:485 #, no-wrap msgid "FreeBSD PAM Modules" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:488 #, no-wrap msgid "man:pam_deny[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:492 msgid "" "The man:pam_deny[8] module is one of the simplest modules available; it " "responds to any request with `PAM_AUTH_ERR`. It is useful for quickly " "disabling a service (add it to the top of every chain), or for terminating " "chains of `sufficient` modules." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:494 #, no-wrap msgid "man:pam_echo[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:498 msgid "" "The man:pam_echo[8] module simply passes its arguments to the conversation " "function as a `PAM_TEXT_INFO` message. It is mostly useful for debugging, " "but can also serve to display messages such as \"Unauthorized access will be " "prosecuted\" before starting the authentication procedure." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:500 #, no-wrap msgid "man:pam_exec[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:504 msgid "" "The man:pam_exec[8] module takes its first argument to be the name of a " "program to execute, and the remaining arguments are passed to that program " "as command-line arguments. One possible application is to use it to run a " "program at login time which mounts the user's home directory." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:506 #, no-wrap msgid "man:pam_ftpusers[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:509 msgid "The man:pam_ftpusers[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:511 #, no-wrap msgid "man:pam_group[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:515 msgid "" "The man:pam_group[8] module accepts or rejects applicants on the basis of " "their membership in a particular file group (normally `wheel` for " "man:su[1]). It is primarily intended for maintaining the traditional " "behavior of BSD man:su[1], but has many other uses, such as excluding " "certain groups of users from a particular service." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:517 #, no-wrap msgid "man:pam_guest[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:522 msgid "" "The man:pam_guest[8] module allows guest logins using fixed login names. " "Various requirements can be placed on the password, but the default behavior " "is to allow any password as long as the login name is that of a guest " "account. The man:pam_guest[8] module can easily be used to implement " "anonymous FTP logins." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:524 #, no-wrap msgid "man:pam_krb5[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:527 msgid "The man:pam_krb5[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:529 #, no-wrap msgid "man:pam_ksu[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:532 msgid "The man:pam_ksu[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:534 #, no-wrap msgid "man:pam_lastlog[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:537 msgid "The man:pam_lastlog[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:539 #, no-wrap msgid "man:pam_login_access[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:542 msgid "" "The man:pam_login_access[8] module provides an implementation of the account " "management primitive which enforces the login restrictions specified in the " "man:login.access[5] table." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:544 #, no-wrap msgid "man:pam_nologin[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:548 msgid "" "The man:pam_nologin[8] module refuses non-root logins when [.filename]#/var/" "run/nologin# exists. This file is normally created by man:shutdown[8] when " "less than five minutes remain until the scheduled shutdown time." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:550 #, no-wrap msgid "man:pam_passwdqc[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:553 msgid "The man:pam_passwdqc[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:555 #, no-wrap msgid "man:pam_permit[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:559 msgid "" "The man:pam_permit[8] module is one of the simplest modules available; it " "responds to any request with `PAM_SUCCESS`. It is useful as a placeholder " "for services where one or more chains would otherwise be empty." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:561 #, no-wrap msgid "man:pam_radius[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:564 msgid "The man:pam_radius[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:566 #, no-wrap msgid "man:pam_rhosts[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:569 msgid "The man:pam_rhosts[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:571 #, no-wrap msgid "man:pam_rootok[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:575 msgid "" "The man:pam_rootok[8] module reports success if and only if the real user id " "of the process calling it (which is assumed to be run by the applicant) is " "0. This is useful for non-networked services such as man:su[1] or " "man:passwd[1], to which the `root` should have automatic access." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:577 #, no-wrap msgid "man:pam_securetty[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:580 msgid "The man:pam_securetty[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:582 #, no-wrap msgid "man:pam_self[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:586 msgid "" "The man:pam_self[8] module reports success if and only if the names of the " "applicant matches that of the target account. It is most useful for non-" "networked services such as man:su[1], where the identity of the applicant " "can be easily verified." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:588 #, no-wrap msgid "man:pam_ssh[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:594 msgid "" "The man:pam_ssh[8] module provides both authentication and session " "services. The authentication service allows users who have passphrase-" "protected SSH secret keys in their [.filename]#~/.ssh# directory to " "authenticate themselves by typing their passphrase. The session service " "starts man:ssh-agent[1] and preloads it with the keys that were decrypted in " "the authentication phase. This feature is particularly useful for local " "logins, whether in X (using man:xdm[8] or another PAM-aware X login manager) " "or at the console." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:596 #, no-wrap msgid "man:pam_tacplus[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:599 msgid "The man:pam_tacplus[8] module" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:601 #, no-wrap msgid "man:pam_unix[8]" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:606 msgid "" "The man:pam_unix[8] module implements traditional UNIX(R) password " "authentication, using man:getpwnam[3] to obtain the target account's " "password and compare it with the one provided by the applicant. It also " "provides account management services (enforcing account and password " "expiration times) and password-changing services. This is probably the " "single most useful module, as the great majority of admins will want to " "maintain historical behavior for at least some services." msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:608 #, no-wrap msgid "PAM Application Programming" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:611 #: documentation/content/en/articles/pam/_index.adoc:616 msgid "This section has not yet been written." msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:613 #, no-wrap msgid "PAM Module Programming" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:621 #, no-wrap msgid "Sample PAM Application" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:628 msgid "" "The following is a minimal implementation of man:su[1] using PAM. Note that " "it uses the OpenPAM-specific man:openpam_ttyconv[3] conversation function, " "which is prototyped in [.filename]#security/openpam.h#. If you wish build " "this application on a system with a different PAM library, you will have to " "provide your own conversation function. A robust conversation function is " "surprisingly difficult to implement; the one presented in crossref:pam[pam-" "sample-conv, Sample PAM Conversation Function] is a good starting point, but " "should not be used in real-world applications." msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:632 #, no-wrap msgid "include::{include-path}su.c[]\n" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:638 #, no-wrap msgid "Sample PAM Module" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:642 msgid "" "The following is a minimal implementation of man:pam_unix[8], offering only " "authentication services. It should build and run with most PAM " "implementations, but takes advantage of OpenPAM extensions if available: " "note the use of man:pam_get_authtok[3], which enormously simplifies " "prompting the user for a password." msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:646 #, no-wrap msgid "include::{include-path}pam_unix.c[]\n" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:652 #, no-wrap msgid "Sample PAM Conversation Function" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:657 msgid "" "The conversation function presented below is a greatly simplified version of " "OpenPAM's man:openpam_ttyconv[3]. It is fully functional, and should give " "the reader a good idea of how a conversation function should behave, but it " "is far too simple for real-world use. Even if you are not using OpenPAM, " "feel free to download the source code and adapt man:openpam_ttyconv[3] to " "your uses; we believe it to be as robust as a tty-oriented conversation " "function can reasonably get." msgstr "" #. type: delimited block . 4 #: documentation/content/en/articles/pam/_index.adoc:661 #, no-wrap msgid "include::{include-path}converse.c[]\n" msgstr "" #. type: Title == #: documentation/content/en/articles/pam/_index.adoc:666 #, no-wrap msgid "Further Reading" msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:668 #, no-wrap msgid "Papers" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:671 msgid "" "Making Login Services Independent of Authentication Technologies Vipin " "Samar. Charlie Lai. Sun Microsystems." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:673 msgid "" "_link:https://pubs.opengroup.org/onlinepubs/8329799/toc.htm[X/Open Single " "Sign-on Preliminary Specification]_. The Open Group. 1-85912-144-6. June " "1997." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:675 msgid "" "_link:https://mirrors.kernel.org/pub/linux/libs/pam/pre/doc/draft-morgan-" "pam-07.txt[Pluggable Authentication Modules]_. Andrew G. Morgan. 1999-10-06." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:676 #, no-wrap msgid "User Manuals" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:679 msgid "" "_link:https://docs.oracle.com/cd/E26505_01/html/E27224/pam-1.html[PAM " "Administration]_. Sun Microsystems." msgstr "" #. type: Title === #: documentation/content/en/articles/pam/_index.adoc:680 #, no-wrap msgid "Related Web Pages" msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:683 msgid "" "_link:https://www.openpam.org/[OpenPAM homepage]_ Dag-Erling Smørgrav. " "ThinkSec AS." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:685 msgid "" "_link:http://www.kernel.org/pub/linux/libs/pam/[Linux-PAM homepage]_ Andrew " "Morgan." msgstr "" #. type: Plain text #: documentation/content/en/articles/pam/_index.adoc:686 msgid "_Solaris PAM homepage_. Sun Microsystems." msgstr ""