----目前,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等;
----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下的说明文件。事实上,还有许多模块是很有用的,它们在文档中都有说明。