Linux-PAM简介
http://www.linuxsir.org/bbs/showthread.php?t=211899


[原创文档]
作者:yongjian (i3dmaster@gmail.com)

注: PAM的implementation在不同的*Nix系统上稍有不同,这里我以RedHat Enterprise Linux 4为蓝本。如果你系统的PAM配置有不同,请安实际情况配置。

Linux-PAM(Pluggable Authentication Modules). 有人翻译成“可插拔式认证模块”, 或是“可插入式认证模块”. 它表示一种性能健硕而且灵活方便的用户级认证方式。目前,PAM已经成为了Linux, BSD和其他一些*Nix操作系统的首选认证方式。特别是在Linux上,几乎所有的daemon和一些与授权有关的命令都通过PAM来进行验证。他们在 编译时都无一例外的加入了对PAM的支持。PAM可以说是Linux系统的安全守护神。那么,PAM到底是怎样运作的呢?

PAM主要是由一组共享库文件(share libraries, 也就是.so文件)和一些配置文件组成的。当你在请求服务的时候,具有PAM认证功能的应用程序将与这些.so文件进行交互,以便得知是否可以授权给发起 请求的用户来使用服务,比如su, vsftp, httpd,等。如果认证成功了,那么这个用户便可以使用服务或完成命令,如果认证失败了,那么这个用户将不能使用服务,同时,PAM将向指定的log文 件写入警告信息。我们可以将PAM看作是一个中间裁判,它不依赖于任何应用或服务。你完全可以升级这些应用或服务而不必管PAM的共享库的更新或升级,反 之亦然。所以它非常的灵活。

PAM的认证过程是通过对一些服务或应用的配置文件来控制的。通常,这些配置文件在/etc/pam.d目录下。cd到这个目录,你会看到很多你很熟悉的 应用或服务的名称。比如说login. 那么当用户login的时候,PAM到底做了什么呢?我们看看这个login的PAM配置文件:
代码: #%PAM-1.0
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
#session required pam_selinux.so close
session required pam_stack.so service=system-auth
session optional pam_console.so
# pam_selinux.so open should be the last session rule
#session required pam_selinux.so multiple open 这里有些PAM的术语:
首先是配置文件的格式:
代码: service module-type control_flag module_path args service - 由于现代的PAM配置文件都是以服务程序的名字分开配置,所以基本上service这个项已经省去了。但在有些还使用一个pam.conf大文件配置所有的PAM服务的BSD上,还有这一项。

module_type – 控制使用什么类型的管理机制。
auth – 认证管理。做两件事:1.检验用户是否是真正声称的那个用户,比如,要求用户输入用户名和密码来声明自己。2.这个模块可以通过PAM自身的印证机制赋予用户一些特权,或是加入组。
account – 用户管理。 是非认证式的对用户赋予/阻止使用一些系统资源。比如说,用户登录的时间限制,密码的期限等。
password – 密码认证管理。是用来管理用户的密码认证标记(token)的。比如,用户密码的尝试次数等。
session – 会话管理。比如在会话前中后所要执行的一些事情,如记录会话信息, 对如可展开会话的控制等。

control_flag – 可以理解成对PAM认证的流程控制。比如说如果成功,下一步应该怎么办?如果不成功,又应该怎么办?还有就是按怎样的顺序来进行认证,等等。
required – 表示这一模块的认证是必须成功的,但如果失败,认证过程不会即刻终止,PAM将继续下一个同类型的模块认证。
requisite – 和required类似,只是如果失败,认证过程将立即终止。
sufficient – 表示如果认证成功,那么对这一类的模块认证是充足的了,其他的模块将不会再检验。
optional – 表示这一模块认证是可选的,也不会对认证成功或失败产生影响。我没怎么用过这个。
include - 有点类似于DNS或xinetd的include。表示将包括其他的一些认证,这样就可以建立一个分离式的配置文件管理机制。

module_path
使用的认证模块的位置,最为保险的是使用绝对路径。不过PAM有自己的PATH环境,在RHEL4中,大部分是使用的相对路径。如果你是缺省安装,有没有挪动过那些.so文件的位置,使用相对路径是没问题的。(缺省路径一般是:/lib/security)

args – 在认证时传给模块的一些变量。比如用什么文件,对于什么uid, 失败的处理等等。类似于赋给一个命令一些参数。

好了,对于PAM的结构有了基本的了解,我们来看看PAM是如果控制login的。从上至下对于login的PAM配置文件的翻译可以为:
1.用pam_stack.so这个认证模块检测system-auth服务的每一项,看这个请求用户是否能通过认证。这一项是必须检验成功的。 system-auth可以理解为一个 “systemwide“全局性的PAM配置文件,也就是说所有的PAM文件都将首先检测system-auth。这就是通过pam_stack.so service=system-auth这一语句来完成的。
2.如果第一项失败了,则整个认证将失败,但无论认证是否成功失败,继续检测第二项,pam_nologin.so.看看系统是否有nologin文件存在。一般在/etc/nologin.如果这个文件存在,则只有root才能登录,其他任何用户都不能。
3.继续检测第三项,用system-auth来检测对用户的管理。
4.继续检测第四项,用system-auth来检测对密码的管理。
5.继续检测第五项,用system-auth来检测会话的控制。
6.继续检测第六项,用pam_console.so来检测用户的登录来源,如果从console,则配置一些console下的资源。这一项是可选的。

按照这个认证过程,我们可以举个例子: userA 和userB。UserA是系统用户而userB是个虚拟用户,只给vsftp用的。那么当userA和userB登录的时候,PAM将利用 pam_unix.so来检测用户是否在/etc/passwd和/etc/shadow中。显然userA将成功,而userB将失败。成功的用乎将继 续检测其诸如password已经retry的次数,是否sync了passwd和shadow文件,是否是nis 用户,password的加密方式,登录后的系统资源利用情况(pam_limits.so)等等。最后是pam_console.so,如果用户是从 vt或本地的X 会话登录,PAM将如何配置文件权限...

几个常用的PAM认证模块的介绍
1.pam_access.so – 缺省配置文件是/etc/security/access.conf (当然,通过“accessfile=/path/to/file” argument, 还可以自行指定配置文件。 通过加入这个认证模块到你想要控制的服务器PAM配置文件,你可以实现对某些服务的userbase级控制。如vsftp, samba,等。编辑/etc/security/access.conf文件,加入你想要控制的用户,可以赋予/阻止他们从特定的来源登录服务器。
2.pam_cracklib.so – 用字典方式检测password的安全性。有一些很有用的arguments, 比如准许retry的次数,多少个字符可以和上次的密码重复,最小的密码长度等等。
3.pam_deny.so – 一个特殊的PAM模块,这个模块将永远返回否。类似大多数的安全机制配置准则,一个严谨的安全规则的最后一项永远是否。
4.pam_limits.so – 类似Linux的ulimit命令,赋给用户登录某个会话的资源限度。如core文件的大小,memory的用量,process的用量,等等。
5.pam_listfile.so – 高度自定义的一个认证模块。理论上你可以用这个模块来控制任何服务。Arguments有:
代码: item=[tty|user|rhost|ruser|group|shell]
sense=[allow|deny]
file=/path/to/the/file
apply=[usre|@group] 比如,我想在pop3服务的PAM配置文件中加入:
代码: auth required pam_listfile.so item=user sense=deny file=/etc/security/dovecot.deny onerr=fail 然后我建立/etc/security/dovecot.deny文件,在里面我加上userA的用户名。这样,userA就无法登录 pop3服务器了。原因是“sense=deny“。当然,你也可以配置成“sense=allow“,这样在这个文件里的用户就成了可以登录的用户了, 不过你得加入所有你想赋予登录权限的用户,因为不在这个文件中的用户将被DENY!
6.pam_permit.so – 和pam_deny.so正好相反,这个模块将永远返回真。自己从没用过,也许你可以告诉我为什么我需要这个模块?!
7.pam_rootok.so – root用户将通过认证。
8.pam_securetty.so – 将用/etc/securetty文件来检测root用户的登录来源,不在securetty文件中的来源一律禁止!
9.pam_tally.so – 主要用来记录,重置,和阻止失败的登录(次数)。
10.pam_wheel.so – 如果有这个模块,那个只有在wheel组里的用户可以得到root权限。
11.pam_xauth.so – 如果有这个模块,那么在su, sudo的时候,xauth的cookies将同时传到那个用户。(是不是想起来什么了?)

好了,冰山的一脚就到此结束了。希望这一脚能帮助你踏上PAM的高山。如果本文有什么错误,请多多指出。还有就是有什么配置PAM方面的经验,也希望大家 一起来分享。更多,更详细的关于PAM的配置,请参看PAM的manpage和PAM模块的介绍,在/usr/share/doc/pam- version/txts, 同时,网上资料:
The Linux-PAM System Administrators' Guide






__________________
15" C2D MBP.
有简单的,不用复杂的!看到复杂的,尽量简单化!
Unix/Linux Philosophy: Be small! Be concentrated! One program does one thing and do it perfectly!
∞ years - 宇宙中最后的物质 Proton heat death. 之后,宇宙将以纯能量的形式永远存在。。。一切皆空 Linux-PAM简介[转自SIR]_#常用命令 Linux-PAM简介[转自SIR]_#常用命令_02 yongjian 查看公开信息 查找 yongjian 发表的更多帖子 Linux-PAM简介[转自SIR]_#常用命令_03 05-08-02, 16:14 第 2 帖 kissingwolf Linux-PAM简介[转自SIR]_#常用命令_04 Linux-PAM简介[转自SIR]_#常用命令_05
Linux-PAM简介[转自SIR]_#常用命令_06


PAM入门介绍
2004-04-23 15:18 pm
作者:netguy (netguy@nsfocus.com)
来自:Linux知识宝库
现载:http://www.douzhe.com/linuxtips/1118.html
地址:无名

作者:netguy (netguy@nsfocus.com)
主页:http://www.nsfocus.com
日期:2000-10-07

PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些
动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理
员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于
向系 统中添加新的认证手段。
PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。

一、PAM的结构

PAM的整个框架结构如下图所示:


系统管理员通过PAM配置文件来制定认证策略,即指定什么服务该采用什么样的认证方法;应
用程序开发者通过在服务程序中使用PAM API而实现对认证方法的调用;而PAM服务模块(se
rvice module)的开发者则利用PAM SPI(Service Module API)来编写认证模块(主 要是
引出一些函数pam_sm_xxxx( )供libpam调用),将不同的认证机制(比如传统的UNIX认证方
法、Kerberos等)加入到系统中;PAM核 心库(libpam)则读取配置文件,以此为根据将服
务程序和相应的认证方法联系起来。
二、PAM支持的四种管理界面:

1、认证管理(authentication management)
主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密
信息。
2、帐户管理(account management)
主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的
限制等等。
3、密码管理(password management)
主要是用来修改用户的密码。
4、会话管理(session management)
主要是提供对会话的管理和记账(accounting)。

三、PAM的文件:

/usr/lib/libpam.so.* PAM核心库
/etc/pam.conf或者/etc/pam.d/ PAM配置文件
/usr/lib/security/pam_*.so 可动态加载的PAM service module
对于RedHat,其目录不是/usr/lib,而是/lib。

四、PAM的配置:

PAM的配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式,即通过配
置目录/etc/pam.d/,且这种的优先级要高于单 个配置文件的方式。

1、使用配置文件/etc/pam.conf

该文件是由如下的行所组成的:
service-name module-type control-flag module-path arguments

service-name 服务的名字,比如telnet、login、ftp等,服务名字“OTHER”代表所有没有
在该文件中明确配置的其它服务。
module-type 模块类型有四种:auth、account、session、password,即对应PAM所支持的
四种管理方式。同一个服务可以调用多个 PAM模块进行认证,这些模块构成一个stack。
control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四
种可能的 值:required,requisite,sufficient,optional。
required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败
结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果
返回给应用程序。可以认为是一个必要条件。
requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回
失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必
要条件。注:这种只有RedHat支持,Solaris不支持。
sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack
内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。
optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回
值一般被忽略。
对于control-flag,从Linux-PAM-0.63版本起,支持一种新的语法,具体可参看Linux
PAM文档。
module-path 用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出
绝对路径,默认该文件在目录/usr/lib/security下 面。
arguments 是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块
的开发者自己定义,但是也有以下几个共同 的参数:
debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。
no_warn 表明该模块不应把警告信息发送给应用程序。
use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里
得到的密码。
try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该
密码验证不通过,再提示用户输入新的密码。
use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。
expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用
,因为泄漏用户名会对安全造成一定程度的威 胁。

2、使用配置目录/etc/pam.d/(只适用于RedHat Linux)

该目录下的每个文件的名字对应服务名,例如ftp服务对应文件/etc/pam.d/ftp。如果名为x
xxx的服务所对应的配置文件/etc/pam.d/xxxx不存 在,则该服务将使用默认的配置文件/et
c/pam.d/other。每个文件由如下格式的文本行所构成:
module-type control-flag module-path arguments
每个字段的含义和/etc/pam.conf中的相同。

3、配置的例子

例一:用/etc/pam.conf配置默认的认证方式。

下面的例子将拒绝所有没有在/etc/pam.conf中明确配置的服务。OTHER代表没有明确配置的
其它所有服务,pam_deny模块的作用只是简 单地拒绝通过认证。
OTHER auth required /usr/lib/security/pam_deny.so
OTHER account required /usr/lib/security/pam_deny.so
OTHER password required /usr/lib/security/pam_deny.so
OTHER session required /usr/lib/security/pam_deny.so


例二:通过/etc/pam.d/rsh文件配置rsh服务的认证方式。

rsh服务认证用户时,先使用/etc/hosts.equiv和.rhosts文件的认证方式,然后再根据/etc
/nologin文件的存在与否来判断是否允许该用户使用 rsh,最后使用password database来认
证用户。

auth required /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so


例三:通过/etc/pam.conf配置ftpd的认证方式。

下面是ftpd服务利用PAM模块进行用户认证的三个步骤。首先用pam_ftp模块检查当前用户是
否为匿名用户,如果是匿名用户,则 sufficient控制标志表明无需再进行后面的认证步骤,
直接通过认证;否则继续使用pam_unix_auth模块来进行标准的unix认证,即用/etc/ passw
d和/etc/shadow进行认证;通过了pam_unix_auth模块的认证之后,还要继续用pam_listfil
e模块来检查该用户是否出现在文件/etc/ ftpusers中,如果是则该用户被deny掉。
ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so
onerr=succeed item=user sense=deny file=/etc/ftpuser
s

五、密码映射(password-mapping)

密码映射允许用户在不同的认证机制下使用不同的密码,其中有一个主密码(primary pass
word),其它密码为次密码(secondary passwords,可能有多个)。主密码用来对次密码进
行加密。在主密码认证通过后,认证模块利用主密码将加密过的次密码(也称为 mapped pa
ssword)解密,并对次密码进行认证。
注:如果使用了一次性密码的机制,就不使用密码映射。

所有服务模块必须支持如下4个映射选项(在第四部分已经简单解释过):

1、use_first_pass

这个选项指示本模块不能提示用户输入密码,而是使用已有的密码,即从第一个向用户提示
输入密码的模块那里取得密码,并对该密码进 行认证。

2、try_first_pass

这个选项指示本模块首先尝试使用已有的密码,即从第一个向用户提示输入密码的模块那里
取得密码,并对该密码进行认证。如果密码认 证失败,则再提示用户输入密码。

3、use_mapped_pass

这个选项指示本模块不能向用户提示输入密码,而应使用映射过的密码,即利用主密码将加
密过的次密码解密出来并进行认证。

4、try_mapped_pass

这个选项指示本模块首先尝试使用映射过的密码,即利用主密码将加密过的次密码解密出来
并进行认证。如果密码认证失败,则再提示用 户输入密码。

密码映射的例子:

下面是/etc/pam.conf中关于login服务的配置。这里login共有3种认证机制:Kerberos、UN
IX和RSA认证,两个required控制标志表明用户必 须通过Kerberos认证和UNIX认证才能使用
login服务,optional选项则说明RSA认证是可选的。首先用户输入主密码进行Kerberos认 证
;use_mapped_pass选项指示UNIX认证模块利用主密码将用于UNIX认证的次密码解密出来并对
该次密码进行认证;try_first_pass选项 指示RSA认证模块先使用第一个模块(即Kerberos
模块)的密码作为进行认证的密码,当对该密码认证失败时才提示用户输入用于RSA认 证的
次密码。
login auth required pam_kerb_auth.so debug
login auth required pam_unix_auth.so use_mapped_pass
login auth optional pam_rsa_auth.so try_first_pass

六、PAM API

1、框架API:

任何一个支持PAM的服务程序在进行认证时必须以pam_start( )开始进行初始化,最后以pam
_end( )结束以便进行清理工作。

2、认证管理API:

pam_authenticate( )对用户名/密码进行认证。
pam_setcred( )用来修改用户的秘密信息。

3、帐户管理API:

pam_acct_mgmt( )检查帐户本身是否有权限登录系统、帐户是否过期、帐户是否有登录时间
限制等。

4、密码管理API:

pam_chauthtok( )修改用户的密码。

5、会话管理API:

一个会话以pam_open_session( )开始,最后以pam_close_session( )结束。

6、其它:

pam_get_item( )、pam_set_item( )用来读写PAM事务(transaction)的状态信息。
pam_get_data( )、pam_set_data( )用来取得和设置PAM模块及会话的相关信息。
pam_putenv( )、pam_getenv( )、pam_getenvlist( )用来读写环境变量。
pam_strerror( )返回相关的错误信息。
例子程序(摘自Sun的白皮书):

下面的例子使用PAM API写了一个简单的login服务程序(注:这不是个完整的程序,所以省
略了对pam_close_session的调用)。

#include <security/pam_appl.h>

/* 回调函数 */
static int login_conv(int num_msg, struct pam_message **msg, struct pam_response
**response, void *appdata_ptr);
struct pam_conv pam_conv = {login_conv, NULL};
pam_handle_t *pamh; /* 进行认证的PAM句柄 */

void main(int argc, char *argv[], char **renvp)
{
/* 初始化,并提供一个回调函数 */
if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)
login_exit(1);

/* 设置一些参数 */
pam_set_item(pamh, PAM_TTY, ttyn);
pam_set_item(pamh, PAM_RHOST, remote_host);

while (!authenticated && retry < MAX_RETRIES)
{
status = pam_authenticate(pamh, 0); /* 密码认证管理,检查用户输入
的密码是否正确 */
authenticated = (status == PAM_SUCCESS);
}

if (status != PAM_SUCCESS)
{
fprintf(stderr,"error: %s ", pam_strerror(pamh, status)); /* 显示错误原
因 */
login_exit(1);
}

/* 通过了密码认证之后再调用帐户管理API,检查用户帐号是否已经过期 */
if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
{
if (status == PAM_AUTHTOK_EXPIRED)
{
status = pam_chauthtok(pamh, 0); /* 过期则要求用户更改密码 */
if (status != PAM_SUCCESS)
login_exit(1);
}
}

/* 通过帐户管理检查之后则打开会话 */
if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)
login_exit(status);

/* 设置用户组 */
setgid(pwd->pw_gid);

/*
* Initialize the supplementary group access list before
* pam_setcred because PAM modules might add groups
* during the pam_setcred call
*/
initgroups(user_name, pwd->pw_gid);

status = pam_setcred(pamh, PAM_ESTABLISH_CRED);
if (status != PAM_SUCCESS)
login_exit(status);

/* 设置真实的用户ID(或者有效的用户ID)*/
setuid(pwd->pw_uid);

pam_end(pamh, PAM_SUCCESS); /* PAM事务的结束 */


/*
此处可用来实现与login有关的其它内容
*/
}

/* 出错则清理现场并退出 */
static void login_exit(int exit_code)
{
if (pamh)
pam_end(pamh, PAM_ABORT);
exit(exit_code);
}


/* 这个回调函数被PAM认证模块调用以便显示错误信息或者或者用来取得用户输入,采用图
形界面的服务程序则应使用图形界面来取得 用户输入或显示提示信息*/
int login_conv(int num_msg, struct pam_message **msg, struct pam_response **resp
onse, void *appdata_ptr)
{
while (num_msg--)
{
switch (m->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
r->resp = strdup(getpass(m->msg));
break;
case PAM_PROMPT_ECHO_ON:
(void) fputs(m->msg, stdout);
r->resp = malloc(PAM_MAX_RESP_SIZE);
fgets(r->resp, PAM_MAX_RESP_SIZE, stdin);
/* add code here to remove from fputs */
break;
case PAM_ERROR_MSG:
(void) fputs(m->msg, stderr);
break;
case PAM_TEXT_INFO:
(void) fputs(m->msg, stdout);
break;
default:
log_error();
break;
}
}
return (PAM_SUCCESS);
}

七、PAM SPI

当服务程序(ftpd、telnetd等)调用PAM API函数pam_xxx( )时,由PAM 框架(libpam)根
据该服务在/etc/pam.conf文件中的配置调用指 定的PAM模块中对应的SPI函数pam_sm_xxx(
)。如下:




API函数的名字为pam_xxx( ),对应的SPI函数的名字为pam_sm_xxx( ),即每个服务模块需要
引出相应的函数以供libpam调用。为方便对 照,再列一下。


API 对应的 SPI

帐号管理 pam_acct_mgmt( ) pam_sm_acct_mgmt( )

认证管理 pam_authenticate( ) pam_ sm_authenticate( )

密码管理 pam_chauthtok( ) pam_ sm_chauthtok( )

会话管理 pam_open_session( ) pam_ sm_open_session( )

会话管理 pam_close_session( ) pam_ sm_close_session( )

认证管理 pam_setcred( ) pam_ sm_setcred( )




八、常用的PAM服务模块

下面是Linux提供的PAM模块列表(只是其中一部分):

模块文件 模块功能描述 相关配置文件

pam_access 提供logdaemon风格的登录控制 /etc/security/access.conf

pam_chroot 提供类似chroot命令的功能


pam_cracklib 对密码的强度进行一定的检查 库文件libcrack和字典文件
/usr/lib/cracklib_dict

pam_deny 总是无条件地使认证失败

pam_env 设置或取消环境变量 /etc/security/pam_env.conf

pam_filter 对输入输出流进行过滤 filters

pam_ftp.so 对匿名ftp用户进行认证

pam_group 当用户在指定的终端上请求指定的 /etc/security/group.conf
服务时赋予该用户相应的组权限

pam_issue 在提示用户输入用户名之前显示 /etc/issue
/etc/issue文件的内容

pam_krb4 对用户密码进行Kerberos认证 相应的Kerberos库文件

pam_lastlog 在用户登录成功后显示关于 /var/log/lastlog
用户上次登录的信息,并维护
/var/log/lastlog文件。

pam_limits 限制用户会话所能使用的系统资源 /etc/security/limits.conf

pam_listfile 根据指定的某个文件决定是否 例如/etc/ftpusers
允许或禁止提供服务

pam_mail 检查用户的邮箱中是否有新邮件 /var/spool/mail/xxxx

pam_mkhomedir 为用户建立主目录 /etc/skel/

pam_motd 显示/etc/motd文件的内容 /etc/motd

pam_nologin 根据/etc/nologin文件的存在与否 /etc/nologin
来决定用户认证是否成功

pam_permit 总是无条件地使认证成功


pam_pwdb 作为pam_unix_xxxx模块的一个替代。/etc/pwdb.conf
使用Password Database通用接口
进行认证。

pam_radius 提供远程身份验证拨入用户服务
(RADIUS)的认证


pam_rhosts_auth 利用文件~/.rhosts和 /etc/hosts.equiv和~/.rhosts
/etc/hosts.equiv对用户进行认证。

pam_rootok 检查用户是否为超级用户,如果
是超级用户则无条件地通过认证。


pam_securetty 提供标准的Unix securetty检查 /etc/securetty

pam_time 提供基于时间的控制,比如限制 /etc/security/time.conf
用户只能在某个时间段内才能登录

pam_unix 提供标准的Unix认证 /etc/passwd和 /etc/shadow

pam_userdb 利用Berkeley DB数据库来检查 Berkeley DB
用户/密码

pam_warn 利用syslog( )记录一条告警信息


pam_wheel 只允许wheel组的用户有超级用户
的存取权限

参考资料:

1、DCE/OSF-RFC 86.0
2、Linux-PAM documentation & source code
3、Sun Solaris PAM documentation

--


全文结束