PAM
1.工作原理
2.PAM配置文件
2.1 /etc/pam.conf文件
格式:service-name module-type control-flag module-path arguments
其中:
service-name:指定服务/应用程序的名称(默认值为 OTHER)
module-type:为 Service_name 字段中的相应服务指定模块类型(auth|account|session|passwd)
control-flag:指定模块的堆栈行为。它可以获取诸如 requisite、required、sufficient 和 optional 之类的值
module-path:指定实现模块的库对象的路径名称。默认情况下,它将被设为 /lib/security
arguments:指定可以传递给服务模块的选项或实参(可选字段)
2.2 /etc/pam.d/下文件
格式:module-type control-flag module-path arguments(和上面的一样,只不过服务名是文件名了)
2.3 /etc/pam.d/other
定义默认规则,如果有的服务与之没有向对应的文件,则使用other的默认定义;
3. 说明:
3.1 module-type
指明程序所用PAM底层模块的类型;
PAM模块分为认证管理、账号管理、会话管理、口令管理4种类型:
auth:主要是接受用户名和密码,进而对该用户的密码进行认证
account:主要是让程序检查账户是否被允许登录系统,口令有效期或访问时间的限制等
password:主要是更新用户的认证标志时需要即当用户密码修改后登陆时,审核该密码是否是允许的;
session:定义会话属性,实现从用户登录成功到退出的会话控制
3.2 control-flag
规定如何处理模块的成功和失败情况如一个模块类型有多个条目时;
模块将按照在配置文件中列出的顺序被调用,这取决于每个条目允许的 Control_flag 的值,这些值包括:
required:
表示该行以及所涉及模块的成功是用户通过鉴别的必要条件;换句话说,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用他的程序。说白了,就是必须将所有的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务;
requisite:
与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行后面的其他模块并且鉴别过程到此结束,同时也会立即返回错误信息;
sufficient:
表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果,而不必尝试任何其他模块。当标记为sufficient的模块失败时,sufficient模块会当做 optional对待;
optional:
即便该行所涉及的模块验证失败,用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一个模块(即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务);
include:
表示在验证过程中调用其他的PAM配置文件;
简单点就是:
控制值 模块执行结果 动作 最终结果
requisite 成功 继续检查下一个 取决于其他模块
失败 失败
required 成功 继续检查下一个 取决于其他模块
失败 Stop 失败
sufficient 成功 Stop 成功
失败 继续检查下一个 取决于其他模块
optional 成功 继续检查下一个 取决于其他模块
失败
include 无关 执行包含文件中的验证 取决于其他模块
补充:
另外还有一种比较复杂的格式来设置control-flag
格式: value1 = action1 value2 = action2 ...标志之间会以空格分开
其中:
其中value可以是以下Linux PAM库的返回值:
success、open_err、symbol_err、service_err、 system_err、buf_err、perm_denied、auth_err、cred_insufficient、authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、
acct_expired、 session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、 authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、 try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default
actionX可以是一个非负整数,如果是非负整数X,就表示需要忽略后面个同样类型的模块;
同样也可以是下面ignore、ok、done、bad、die和reset这些记号之一;
记号的解释:
1)ignore:如果使用层叠模块,那么这个模块的返回值将被忽略,不会被应用程序知道
2)bad:表示这个返回码应该被看作是模块验证失败的标志。如果这个模块是层叠模块的第一个验证失败的模块,那么他的状态值就是整个层叠模块验证的状态值和结果
3)die:终止层叠模块验证过程,立刻返回到应用程序
4)ok:告诉PAM这个模块的返回值将直接作为所有层叠模块的返回值。也就是说,如果这个模块前面的模块返回状态是PAM_SUCCESS,那这个返回值就会覆盖前面的返回状态。注意:如果前面的模块的返回状态表示模块验证失败,那么不能使用这个返回值再加以覆盖。
5)done:终止后续层叠模块的验证,把控制权立刻交回应用程序
6)reset:清除所有层叠模块的返回状态,从下一个层叠模块重新开始验证
3.3 module_path
指明该PAM模块的库对象路径,库的默认路径是:32位/lib/security/ 64位/lib64/security/
3.4 options
用于向特定模块传递相关的选项,然后由模块分析解释这些选项;
几个常用的参数:
debug:该模块应当用syslog( )将调试信息写入到系统日志文件中。
no_warn:表明该模块不应把警告信息发送给应用程序。
use_first_pass:表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。
try_first_pass:表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
use_mapped_pass:该模块不能提示用户输入密码,而是使用映射过的密码。
expose_account:允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁;
实例:
当login程序执行时先用pam_unix.so模块即传统的UNIX口令方式鉴别用户,然后再调用pam_kerb.so模块即Kerberos对用户进行鉴别,最后用pam_rsa.so模块即RSA方式鉴别用户。在按上述顺序鉴别用户的过程中,如果pam_unix.so模块鉴别失败,它将继续调用下面的模块进行鉴别而非立刻向login程序返回错误消息;pam_kerb.so模块也按同样方式处理,直到顺序处理完最后一个pam_rsa.so模块后,PAM才将前面出现的错误信息返回给login程序。对于该配置,即使pam_rsa.so模块顺利通过,只要pam_unix.so模块和pam_kerb.so模块中有一个出现错误,用户就不能通过鉴别;相反,即使pam_rsa.so模块失败,只要pam_unix.so模块和pam_kerb.so模块都通过了,用户也能通过鉴别。
阅读(1110) | 评论(0) | 转发(0) |