---- 可插拔的认证模块(Pluggable Authentication Modules,即PAM)技术用于实现应用程序的认证机制。在 PAM出现之前,认证工作是由程序员来完成的,如果管理员需要改变认证的方式只有通过修改源程序才能完成。PAM 的出现彻底改变了这种局面,它提供了一个框架和一套编程接口,并且基于PAM应用程序的认证过程是通过配制文件来定义的,这样不仅将决定权交给了管理员,而且大大提高了使用灵活性。

----目前,PAM 技术已广泛应用于各种Unix系统,Linux中也使用了它。

一、PAM 的体系结构
---- 1.PAM的特点
---- 管理员可以选择从简单的密码到智能卡系统的认证方式,还可以为不同的程序配置不同的认证机制。PAM支持程序显示方式的需求,也支持为一个程序配置同时使用多种认证的机制。PAM让用户在使用多种认证机制时,不用为同一个口令敲入多次,并且还可在认证时输入多个口令,特别是当底层认证机制改变时,上层软件不需要修改;此外,PAM 提供一个可插拔的模型,能满足现有服务的需要。

----2.PAM的框架

---- PAM的核心实际上是一些库函数。PAM为用户提供一套调用应用程序的入口,即如果用户调用一个函数,告诉它您要认证即可,至于用哪一种机制认证由配置文件确定。用户通过查看返回值了解认证是否成功。

---- PAM有认证管理、账号管理、对话管理和密码管理4项功能。

---- 下面我们通过实例看看用PAM如何配置用户系统。

  /etc/pam.d/login
  #模块类型  控制标志  模块的名字   选项
#------- -  --
   auth  required    /lib/security/pam_securetty.so
   auth   required    /lib/security/pam_pwdb.so
                 shadow nullok
   auth   required    /lib/security/pam_nologin.so
 
account required  /lib/security/pam_pwdb.so
password  required  /lib/security/pam_cracklib.so
password required  /lib/security/pam_pwdb.so
        nullok use_authtok shadow md5
sessionrequired  /lib/security/pam_pwdb.so
session optional  /lib/security/pam_console.so

---- 一个模块类型可以指定多个模块,通过依次被调用来验证用户的身份,这种工作方式叫做 Stacked Modules (堆迭模块)。上例中的 “控制标志”是指更改模块的工作方式。它可取的值如下:

---- required:必须的,该模块的认证必须通过,否则立即返回错误。

---- optional:可选的,表示可以忽略它的错误而继续下面一个模块。

---- sufficient:足够的,表示如果该模块认证成功,下面的模块不用调用,并立即返回认证成功,否则同optional。

---- 接下来,我们再来研究一下 login的 auth部分:

  auth  required  /lib/security/pam_securetty.so
  auth  required  /lib/security/pam_pwdb.so  shadow nullok
  auth  required  /lib/security/pam_nologin.so

---- 第1行指定使用pam_securetty.so,该模块的作用是让root只能在/etc/securetty中定义的tty 上登录;第2行指定使用pam_pwdb.so,它是一个用于处理标准的Unix口令用的模块,其参数shadow表明使用/etc/shadow,nullok是指允许空口令。第3行指定使用pam_nologin,该模块记录在/etc/nologin中,用户无法login。上述3个模块都是required,任何一个失败都会使得登录失败。

---- 3.口令的映射

---- 多层模块认证可能需要多个口令,用户可以使用同一个口令透过 mapping机制加强安全性,即通过一个口令来产生另一个口令,使一个口令可被多个模块使用。auth模块一般有下列选项:

---- use_first_pass:使用第一个模块要求输入的口令;

---- try_first_pass:先试着使用第一个模块要求输入的口令,若不对,需要用户重新输入;
---- use_mapped_pass:使用 password-mapping 得到口令,不再向用户提示要口令;
---- try_mapped_pass:先试着使用 password-mapping 得到口令,不再向用户提示要口令。

二、PAM 的应用
---- 下面, 我们结合实际配置来看看最常用的模块及其参数。
----1./etc/pam.d/passwd

  auth  required /lib/security/pam_pwdb.so shadow nullok
  account required  /lib/security/pam_pwdb.so
  password required  /lib/security/pam_cracklib.so retry=3
  password required  /lib/security/pam_pwdb.so
      use_authtok nullok md5 shadow

---- 第2行指用于标准的Unix帐号管理,第3行和第4行表示修改口令。其中,pam_cracklib 用于检查新旧口令之间是否有足够的差别, retry=3 表示用户可以重试3次;最后一行是指pam_pwdb如何存储口令,use_authok是指让pam_pwdb使用pam_cracklib传进来的口令, md5 是指用md5算法进行处理,而shadow表示使用/etc/shadow。

---- Unix/Linux中的口令保存和验证方法是怎样的呢?最早的系统只简单地保存一份明文,后来只保存用单向算法处理过的口令。所谓单向算法通常是指分析一段信息产生一个长度固定的数据块,这个数据块通常称为报文分解值,其长度依所用算法而变化。这一过程是可重复但不可逆的,即用这段信息重复处理会产生相同的报文分解值,而根据一个报文分解值是无法反推出原信息的。所以,Unix保存的实际上是一个报文分解值。DES算法实际上是一个对称加密算法,它以用户的口令为密钥,使用一串0作为明文反复加密处理。受 DES密钥长度的限制,用户的口令不能超过 8个字符。需要指出的是,用户若使用2个随机产生的字符作为“盐粒”(salt)参与计算,可以避免有人事先算好一大堆密文进行比较而猜出口令。

---- 在 PAM中,缺省的加密算法是bigcrypt,它允许口令的最大长度为256个字符。用户也可以指定使用md5,md5的口令理论上是可以无限长的。请看md5处理过的口令:$1 $Z0I6bWw7$ypseV9VdQdyQ5h5ejTcbk1,其中,$1$ 表示它用 md5处理,Z0I6bWw7 是盐粒,第3个$后面的内容才是报文分解值。

----2./etc/pam.d/ftp

  auth required /lib/security/pam_listfile.so item=user
  sense=deny file=/etc/ftpusers onerr=succeed
  auth required /lib/security/pam_pwdb.so shadow nullok
  auth required /lib/security/pam_shells.so
  account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so

---- 第1行是一个很常用的pam_listfile模块。其参数解释如下:

---- onerr=succeed | fail:指明在文件不存在或参数错误时如何处理; sense=allow | deny:指明满足所有条件时,是失败还是成功;

---- file=filename:指定一个列表文件;

---- item=user | tty | rhost | ruser | group | shell:指定文件中的每一行代表的含义、用户名和tty等;
 
----apply=user|@group:指明只对某个用户或某个组有效,即仅在item为tty、rhost 或 shell 时才有效。/etc/ftpusers 中的每一行是一个用户名,这些用户是不能通过认证的。如果文件不存在,则忽略这一行。第3行的含义是要求用户的shell列在/etc/shells中。

----3./etc/pam.d/reboot

---- auth sufficient /lib/security/pam_rootok.so
----auth required /lib/security/pam_console.so
----auth required /lib/security/pam_pwdb.so
----account required /lib/security/pam_permit.so

----第1行表示如果是root,那么用户不仅可以在本机操作,还可进行远程操作;第2行要求在控制台上操作;第3行要求用户必须知道自己所用账号的口令;第4行使用的pam_permit表示返回成功。

----/etc/pam.d/shutdown
----auth sufficient /lib/security/pam_rootok.so
----auth required /lib/security/pam_console.so
----auth required /lib/security/pam_pwdb.so
----account required /lib/security/pam_permit.so

----它同reboot用的是一样的。用户可以看一看 halt和 poweroff的配制,也是这样。

----上面,我们解释了一些最常用的模块。如果用户用的是 RedHat,可以参照/usr/doc/pam下的说明文件。事实上,还有许多模块是很有用的,它们在文档中都有说明。