一.可插入验证模块(PAM)
在过去,每个程序都会使用自己的方法来对用户身份进行验证.在红帽企业Linux中,多数程序被配置使用一个集中化的用户身份验证方法叫作可插入验证模块(Pluggable Authentication Modules)(PAM).
PAM使用一个可插入式的,模块化的结构.它为系统管理员设置用户身份验证政策提供了很大的灵活性.
在多数情况下,一个支持PAM的应用程序的默认PAM配置文件就可以满足一般的要求.但是在一些情况下,还是需要对PAM配置文件进行特殊的配置.因为如果对PAM进行了错误的配置可能会导致系统的安全性被破坏,所以在对这些文件进行配置前必须对这些文件的结构有一定的了解.
二.PAM的优越性
PAM 提供了以下优越性:
1.可以被多种应用程序使用的常用用户身份验证计划.
2.为系统管理员和应用程序开发者在进行用户身份验证处理时提供了极大的灵活性.
3.包括了一个有详细记录的,单一的程序库,这个程序库使开发者们不需要再开发自己的用户身份验证系统.
三.PAM配置文件
以前的PAM版本使用/etc/pam.conf文件,但现在这个文件已经过时,只在/etc/pam.d/目录不存在时才被使用.每个支持PAM的应用程序或服务都在/etc/pam.d/目录中有一个相应的文件.而这个目录中的每个文件的名称与它们所控制访问的服务名称相同.支持 PAM 的应用程序需要定义它们的服务名并在/etc/pam.d/目录中安装它们自己的PAM配置文件.例如,login程序定义了它的服务名为login,并安装/etc/pam.d/login配置文件.
每个PAM配置文件都包括一组如下格式的命令:
具体解释如下:
A.模块接口(Module Interface)
当前有四类可用的PAM模块接口,每类接口分别代表了用户身份验证的不同方面:
auth,这个模块接口被用来验证.例如,它需要一个密码并验证密码是否正确.带有这个接口的模块也可以设置许可证,如组群成员或Kerberos令牌.
account,这个模块接口被用来验证所允许的访问.例如,检查一个用户帐号是否已经过期;或一个用户是否被允许在一天的某个特定的时间进行登录.
password,这个模块接口被用来改变用户的密码.
session,这个模块接口被用来配置并管理用户会话.带有这个接口的模块也可以进行允许访问所需的额外任务,如挂载用户的主目录,使用户的邮箱有效.
B.控制标识旗(Control Flag)
所有的PAM模块在被调用后都会产生一个成功或失败的结果.控制标识旗会指示PAM根据结果下一步怎么办.模块可以以特定的顺序进行堆积排列,控制标识旗决定一个特定模块对用户验证成功或失败整个过程的重要性.
有四个预先定义好的控制标识旗:
required,要使验证过程继续,这个模块的结果必须是成功.如果这一步的测试失败,用户不会马上被通知,他们会在所有模块的测试都完成后才会被通知.
requisite,要使验证可以继续进行,这个模块的结果必须是成功.然而,如果这一步测试失败,用户会被马上通知,而通知的信息中包括了第一个失败了的required或requisite模块测试.
sufficient,如果模块验证失败,其结果就不会被理会.但是,如果一个被标识为sufficient的模块成功并且前面没有任何标识为required的模块验证失败,那么用户就通过验证可以使用这个服务,无需其它任何验证结果.
optional,模块结果不被理会.被标识为optional的模块只有在这个界面中没有引用其它模块时才成为验证成功所必须的.
C.模块名(Module Name)
模块名为PAM提供了包括特定模块界面的可插入模块的名称.在较老版本的红帽企业Linux中,PAM配置文件包括模块的完全路径.但自从使用了multilib系统(它把64位的PAM模块存储在/lib64/security/中),目录名就可以被省略,应用程序会被连接到适当的libpam版本,它可以定位这个模块的正确版本.
D.模块参数(Module Arguments)
在为一些模块进行验证时,PAM使用参数来把信息传递给一个可插入模块.
例如,pam_userdb.so模块使用存储在一个Berkeley DB文件中的信息来验证用户.Berkeley DB是一个开源的数据库系统,被内置于许多应用程序中.这个模块使用一个db参数,从而使Berkeley DB知道所请求的服务使用哪个数据库.以下是在一个 PAM 配置中一个典型的pam_userdb.so行.是到 Berkeley DB 数据库文件的完全路径:
auth required pam_userdb.so db=
无效的参数通常会被忽略,它不会影响到PAM模块验证的结果.但在一些模块中,无效的参数可能会导致模块验证失败.多数模块都会把错误写入/var/log/secure文件.
以下是一个PAM应用配置文件实例:
#%PAM-1.0
auth required pam_securetty.so
auth required pam_unix.so nullok
auth required pam_nologin.so
account required pam_unix.so
password required pam_cracklib.so retry=3
password required pam_unix.so shadow nullok use_authtok
session required pam_unix.so
第一行是注释行,由该行行首的井字号(#)标示.
auth required pam_securetty.so,这个模块保证:如果用户试图以根用户登录,这个用户所登录的tty需要在/etc/securetty文件中列出,如果这个文件存在的话.如果tty没有在这个文件中列出,任何以根用户身份登录的企图都会失败,并显示一个Login incorrect信息.
auth required pam_unix.so nullok,这个模块要求用户输入密码,然后使用存储在/etc/passwd和/etc/shadow文件(如果这个文件存在的话)中的信息来检查用户输入的密码.nullok 参数告诉pam_unix.so模块允许一个空密码.
auth required pam_nologin.so,这是验证的最后一步.这一步检查/etc/nologin文件是否存在.如果这个文件存在,而用户并不是一个根用户,那么用户身份验证会失败.
(注:在这个例子中,所有三个auth都被检查,即使第一个auth模块失败.这可以防止用户知道是哪一步导致了验证失败.如果一个恶意的网络用户知道了这个信息,则可以利用这个信息来进行网络攻击.)
account required pam_unix.so,这个模块执行所有需要的帐号验证.例如,如果启用shadow密码,pam_unix.so的帐号接口就会检查这个帐号是否已经过期,或用户在允许的过渡期期间是否已经修改密码.
password required pam_cracklib.so retry=3,如果一个密码已经过期,pam_cracklib.so模块的密码部分会要求输入一个新密码.然后,它会检查新创建的密码是否能够被密码字典破解系统轻易地破解.retry=3参数指定如果第一次测试失败,用户会有另外两次机会来创建一个更安全的密码.
password required pam_unix.so shadow nullok use_authtok,这一行指定如果程序要修改用户的密码,应该使用pam_unix.so模块的password接口来进行.shadow参数告诉模块在更新一个用户的密码时创建shadow密码.nullok参数告诉模块允许用户把他们的密码从空密码改为其它的密码,否则的话,无密码状态会被认为是一个帐号锁.use_authtok提供了一个很好的实例来说明堆积PAM模块时顺序的重要性.这个参数告诉模块不向用户要求输入一个新密码,它会使用前一个密码模块获得的密码.在这种情况下,所有新密码在被接受前都必须通过pam_cracklib.so的检查.
session required pam_unix.so,最后一行告诉pam_unix.so模块的会话接口来管理会话.这个模块会在每个会话的开始和结束阶段把用户名和服务类型记录到/var/log/secure文件中.这个模块可以和其它会话模块堆积在一起来实现其它的功能.
四.创建PAM模块
可以随时为支持PAM的应用程序创建或添加新的PAM模块.
例如,一个程序开发人员可以创建一个一次性密码的产生方法,并编写一个PAM模块来支持它.支持PAM的应用程序可以马上使用这个新模块而不用重新进行编译.这可以让程序开发人员和系统管理员在不需要重新编译的情况下为不同的应用程序测试各种用户身份验证方法.
编写模块的文档包括在/usr/share/doc/pam-/目录中,其中,是系统上的PAM的版本号.
五.PAM和管理用户身份缓存(Administrative Credential Caching)
红帽企业Linux中包括的一组图形化的管理工具通过pam_timestamp.so模块为用户提供了一段时间(最长为5分钟)的管理权限.了解它们的工作原理是非常重要的,如果一个用户暂时离开他们的终端时,pam_timestamp.so没有被关闭,那么任何可以使用这个终端的人都可以利用它来操纵系统.
在PAM时间戳(timestamp)规划中,图形化的管理程序会在启动时要求用户输入根用户密码.当用户被验证后,pam_timestamp.so模块会创建一个时间戳文件.默认情况下,它会在 /var/run/sudo/目录中被创建.如果时间戳文件已经存在,图形化的管理程序不会再要求输入密码.pam_timestamp.so模块会更新时间戳文件,这个用户可以重新获得额外5分钟的管理访问权限.
可以通过查/var/run/sudo/文件来确认时间戳文件的实际状态.对于台式机来说,相关的文件是unknown:root.如果这个文件存在而且它的时间戳不长于5分钟的话,用户身份是有效的.
当时间戳文件存在时,一个验证图标会出现在系统面板的通知区域中.
关闭一个时间戳处于活动状态的PAM的控制台前,最好销毁时间戳文件.要在图形化环境中执行这个任务,点击面板中的验证图标.一个对话框会出现,点击"Forget Authorization"来销毁活动的时间戳文件.
在处理 PAM 时间戳文件时应注意以下问题:
1,如果是通过使用ssh远程登录到系统,请使用/sbin/pam_timestamp_check -k root命令来销毁时间戳文件.
2,应该在发出使用这一特权应用程序的同一个终端视窗下运行/sbin/pam_timestamp_check -k root命令.
3,要使用/sbin/pam_timestamp_check -k命令,必须以最初启动pam_timestamp.so模块的用户身份登录.不要以根用户身份登录来使用这个命令.
4,如果要销毁桌面上的用户身份信息(而不想运行图标中的Forget Authorization),可使用以下命令:
/sbin/pam_timestamp_check -k root /dev/null 2>/dev/null
如果使用这个命令失败,只会从所运行这个命令的pty中删除用户身份信息.
常用pam_timestamp命令
timestamp_timeout,指定时间戳文件的有效期(以秒为单位).默认值是 300 秒(5分钟).
timestampdir,指定时间戳文件保存在哪个目录中.默认值是/var/run/sudo/.
六.PAM和设备拥有者
在红帽企业Linux中,第一个通过物理控制台登录的用户可以控制特定的设备并可以执行一些通常只有根用户才可以执行的任务.这是由名为pam_console.so的PAM模块所控制的.
当一个用户登录到红帽企业Linux系统时,pam_console.so模块会被login或图形化的登录程序(gdm,kdm和xdm)调用.如果这个用户是第一个通过物理控制台登录的用户——称为控制台用户——模块会把一些通常的拥有者是根用户的设备的所有权分配给这个用户.这个控制台用户会拥有这些设备,直到这个用户的最后一个本地会话结束.在这个用户退出系统后,这些设备的拥有者身份则被交回给根用户.
这些设备包括,但不限于,声卡,软驱和 CD-ROM 驱动器.
这个设施允许一个本地用户在不需要获得根权限的情况下来使用这些设备,因此可以简化控制台用户完成一些常用任务的程序.
可以通过编辑以下文件来修改由pam_console.so控制的设备列表:
1./etc/security/console.perms
2./etc/security/console.perms.d/50-default.perms
可以修改在以上文件中列出的不同设备的访问权限,或覆盖已经指定的默认设置.可以创建一个新文件(如xx-name.perms)并输入需要修改的值,而最好不要直接修改50-default.perms文件.新的默认文件的文件名必须以一个大于50的数值开始,如51-default.perms.这样会覆盖50-default.perms文件的默认值.
如果gdm,kdm或xdm的配置文件已经被修改来允许远程用户登录,而且主机被配置为使用运行级别5,建议把/etc/security/console.perms文件的和命令项的值改为:
=tty[0-9][0-9]* vc/[0-9][0-9]* :0\.[0-9] :0
=:0\.[0-9] :0
这将防止远程用户获得设备的访问权,并限制他们在该机器上对应用程序的使用.
如果gdm,kdm或xdm的配置文件被修改为允许远程用户登录,并且主机被配置为使用运行级别5以外的运行级别,建议删除整个命令,并把命令改为:
=tty[0-9][0-9]* vc/[0-9][0-9]*
七.PAM和应用程序访问
该控制台用户也可以使用一些/etc/security/console.apps/目录下为用户配置的程序.
这个目录中包括允许控制台用户使用/sbin和/usr/sbin中的某些应用程序的配置文件.
这些配置文件和它们所设置的应用程序享有相同名称.
控制台用户可以使用的一组重要应用程序程序包括三个可以用来关闭或重新启动系统的程序:
/sbin/halt
/sbin/reboot
/sbin/poweroff
因为这些都是支持PAM的应用程序,因此需要时都可以调用pam_console.so 模块.
八.附加资源信息
与PAM相关的man page.
pam,介绍PAM的重要信息,包括PAM配置文件的结构和目的.
注意:这一页讨论了/etc/pam.conf和/etc/pam.d/目录中的各种单个配置文件.在默认情况下,红帽企业Linux使用/etc/pam.d/目录下的各种单个配置文件,而不使用/etc/pam.conf,即使这个文件存在也使用.
pam_console,介绍pam_console.so模块的目的,也描述PAM配置文件中应该使用的适当语法.
console.apps,描述/etc/security/console.apps配置文件的格式和可用的选项,这个配置文件规定哪些应用程序可以被PAM分配的控制台用户访问.
console.perms,描述/etc/security/console.perms配置文件的格式和可用的选项,而且指定由PAM分配的控制台用户权限.
pam_timestamp,描述pam_timestamp.so模块.