[转]浅谈linux pam体系结构
1.PAM工作流程
2.PAM 配置文件语法
module-type control-flag module_path optional
在/etc/pam.d/下的文件中,与服务名称相对应的文件,为该服务的pam验证文件,例如服务为sshd,则在/etc/pam.d下存在sshd这个文件,里面包含sshd验证规则。其中有个一特殊的文件为other,如果有的服务与之没有向对应的文件,则对应other。
module-type
服务类型,即 auth、account、session 或 password。
验证模块(auth)用于验证用户或设置/销毁凭证。
帐户管理模块(account)将执行与访问、帐户及凭证有效期、密码限制/规则等有关的操作。
会话管理模块(session)用于初始化和终止会话。
密码管理模块(passwd)将执行与密码更改/更新有关的操作。
control-flag
用于指明在确定服务的集成成败值过程中模块所起的作用。有效的控制标志包括 include、optional、required、requisite 和 sufficient。
required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。
requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必要条件。
sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。
optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
控制值 | 模块执行结果 | 动作 | 最终结果 |
requisite | 成功 | 继续检查下一个 | 取决于其他模块 |
失败 | 失败 | ||
required | 成功 | 继续检查下一个 | 取决于其他模块 |
失败 | Stop | 失败 | |
sufficient | 成功 | Stop | 成功 |
失败 | 继续检查下一个 | 取决于其他模块 | |
optional | 成功 | 继续检查下一个 | 取决于其他模块 |
失败 | |||
include | 无关 | 执行包含文件中的验证 | 取决于其他模块 |
module-path
用于实现服务的库对象的路径,一般都只写库名,库的路径一般为/lib/security(32位),/lib64/security(64位)
module-options
传递给服务模块的选项,可选。
几个公用的参数:
debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。
no_warn 表明该模块不应把警告信息发送给应用程序。
use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。
try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。
expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。
3.PAM 堆栈工作原理
图1:PAM形成堆栈的过程(solaris,有的linux不包含)
图2:PAM如何确定最终的返回值(solaris)
su的PAM处理过程:
1.auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the ”wheel” group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the ”wheel” group.
#auth required pam_wheel.so use_uid
2.auth include system-auth
3.account sufficient pam_succeed_if.so uid = 0 use_uid quiet
4.account include system-auth
5.password include system-auth
6.session include system-auth
7.session optional pam_xauth.so
1. 用户验证,如果pam_rootok.so验证通过,直接返回成功。否则,验证2
2. 用户验证Include system-auth,转去执行system-auth中的验证。
3. 账户信息的是否满足 pam_success_if.so uid=0 use_uid quiet,满足则直接返回成功,否则,执行4
4. 账户信息验证Include system-auth,转去执行system-auth中的验证。
5. 账户密码验证 Include system-auth,转去执行system-auth中的验证。
6. 会话验证 Include system-auth,转去执行system-auth中的验证。
7. 会话验证,pam_xauth.so的验证成功与否,都不会影响到最终的结果。
如果中间没有应为sufficient直接成功,或者requisite直接失败,则根据图2的过程进行判断,并得到最终的结果。
4.常用PAM模块
1. pam_securetty.so
类型:auth
作用:只对root有限定,限定root登陆的终端,系统默认的“安全”中断保存在/etc/securetty中。
pam_access.so
类型:account
作用:基于登录名,主机名或者所属域,ip地址或者网络,终端编号(类似于/etc/securetty)。默认的配置文件为/etc/security
/access.conf
2.pam_tally2.so
类型:auth
作用:当用户输入密码的错误次数超过指定次数时,锁定账户
参数:
onerr=[fail|succeed]:
file=/path/to/counter:当登陆超过允许次数时,日志保存的地方。默认的为/var/log/tallylog。当开启的时候,每当登陆失败一次,则会写入一次,使用pam_tally2 可以读出
audit:如果用户找不到,则把此用户名记录到日志中
silent:不输出任何信息
no_log_info:不进行日志记录
deny=N:当用户连续输错n次是,在第n+1次锁定该用户,没有设定解锁解锁时间,则锁定之后需要手工解锁。
pam_tally.so -u username –reset
lock_time=n:当输入密码错误一次时,在N秒内不能再次登陆该账户。
unlock_time=n:解锁时间,当账户被锁定时,过n秒时,该账户被接触锁定(清空/var/log/tallylog中的相关信息),配合deny参数使用
magic_root:当uid=0时,不会往/var/log/tallylog中写入计数,即这个PAM不生效
even_deny_root:对root用户生效(不加magic_root参数,对root也是不处理的)
root_unlock_time=n:是针对even_deny_root的,root用户的解锁时间
每当用户成功登陆过一次后,/var/log/tallylog中关于这个用户的记录就会清空
3.pam_cracklib
类型:password
作用:限定更改密码的长度,复杂度等等。
参数:
dubug:把修改密码的行为记录到日志中
retry=N:修改密码时,允许错误的次数,默认是1次
difok=N:新密码与旧密码不同的位数。如果超过一半不同,则通过验证,则忽略difok的设置
minlen=N:密码的最短长度
dcredit=N:至少有N的数字
ucredit=N:至少有N的大写字码
lcredit=N:至少有N个小写字母
ocredit=N:至少有N个特殊字符
minclass=N:密码组成的范围(数字,大小写字母,特殊字符)
maxrepeat=N:最多与上一个密码重复
4.pam_limits.so
类型:session
作用:限制资源的使用,默认的配置文件为/etc/security/limits.conf是全局的,/etc/security/limits.d/下存放各个子文件
pam_listfile
类型:auth
作用:验证用户是否能够登陆
参数:
item=[tty|user|rhost|ruser|group|shell]:控制的对象
sense=[allow|deny]:控制的方法
file=/path/filename:文件的路径,每个占一行
onerr=[succeed|fail]:指定某类事件发生时的返回值。
实例:
auth required pam_listfile.so \onerr=succeed item=user sense=deny file=/etc/ftpusers
保存在/etc/ftpusers中的用户,是不允许的。
5.pam_nologin.so
类型:auth
作用:用于拒绝除root外的不同用户的登陆(当/etc/nologin存在,或者重新制定file的情况下)
参数:auth
file=/path/nologin:如果文件存在,当拒绝用户登陆的时候,同时会输出该文件中保存的内容。默认文件为/etc/nologin。
转自:http://www.nxadmin.com/system/linux-system/1063.html