接前一篇文章:PAM从入门到精通(一)
本文参考以下博文:
PAM模块详解及sudo命令
PAM 的应用开发和内部实现源码分析
PAM详解(一)PAM介绍
百度百科 —— PAM
Oracle Solaris 10 开发者安全性指南 —— PAM 框架介绍
特此致谢!
前一篇文章中给出了PAM框架以及PAM体系结构,再来重温一下:
PAM框架由以下四部分组成:
(1)PAM应用程序,也称为消费方;
(2)PAM库;
(3)PAM配置文件;
(4)PAM服务模块,也称为提供者。
PAM体系结构如下图所示:
PAM服务模块是一个共享库(动态链接库),用于为系统登录应用程序(如 login、rlogin 和 telnet)提供验证和其它安全服务。四种类型的PAM服务是:
用于授予用户访问帐户或服务的权限。提供此服务的模块可以验证用户并设置用户凭证。
对应函数:pam_authenticate()、pam_setcred ()。
用于确定当前用户的帐户是否有效。提供此服务的模块可以检查口令或帐户的失效期以及限时访问。
对应函数:pam_acc_mgmt()。
用于设置和终止登录会话。
对应函数:pam_open_session()、pam_close_session()。
用于强制实施口令强度规则并执行验证令牌更新。
对应函数:pam_chauthok()。
PAM 模块可以实现其中的一项或多项服务。将简单模块用于明确定义的任务可以增加配置灵活性。因此,应该在不同的模块中实现PAM服务。然后,可以按照 pam.conf 文件中定义的方式根据需要使用这些服务。
PAM库libpam是PAM体系结构中的中心元素:
(1)相关文件
PAM核心库。
PAM配置文件。
可动态加载的PAM service module。
(2)配置管理
1)配置文件的语法
配置文件的语法如下所示:
2)/etc/pam.conf文件的语法
/etc/pam.conf文件的语法如下:
service type control module-path module-arguments
3)/etc/pam.d/目录下的配置文件的语法
/etc/pam.d/目录下的配置文件的语法和/etc/pam.conf文件的语法相似,形式如下:
module-type control-flag module-path arguments
从Linux-PAM 5.6版开始引入了一种基于目录的配置方式,通过/etc/pam.d/目录下的文件对PAM进行配置。目录下的所有配置文件都以某个服务名命名(小写)。 两种配置方式不能同时起作用,也就是说,你只能使用其中一种对Linux-PAM进行配置,一般/etc/pam.d/优先。
这种配置方式与单一配置文件相比,具有很大的优越性:
(3)配置选项
语法中的各配置选项说明如下:
1)service-name(service)
应用的名字,比如telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务。
PAM模块类型有四种:auth、account、session、password,即对应PAM所支持的四种管理方式。同一个服务可以调用多个PAM模块进行认证,这些模块构成一个stack。
接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。
检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等等。
主要是用来修改用户的密码。
主要是提供对会话的管理和记账(accounting)。
3)conflag-flag(control)
表示本模块必须返回成功才能通过认证。但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。
与required类似,该模块必须返回成功才能通过认证。但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必 要条件。
注:这种只有RedHat支持,Solaris不支持。
表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以忽略。可以认为是一个充分条件。
表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
4)module-path
用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出绝对路径,默认该文件在目录/usr/lib/security下面。
5)arguments(module-arguments)
此处的参数传递给SPI,对应着SPI参数中的argc和argv,是用来传递给该模块的参数。一般来说,每个模块的参数都不相同,可以由该模块的开发者自己定义,但是也有以下几个共同 的参数:
该模块应当用syslog()将调试信息写入到系统日志文件中。
表明该模块不应把警告信息发送给应用程序。
表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。
表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
该模块不能提示用户输入密码,而是使用映射过的密码。
允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。
如果对于该服务的操作(如验证或帐户管理),/etc/pam.conf 仅包含一个模块,则该模块的结果将确定操作的结果;如果为服务操作定义了多个模块,那么这些模块就堆叠起来,即对于该服务存在一个PAM 堆栈。
下图说明如何为每种类型的控制标志记录成败信息: