浅谈linux pam体系结构

1.PAM工作流程

浅谈linux 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 堆栈工作原理

浅谈linux pam体系

图1:PAM形成堆栈的过程(solaris,有的linux不包含)

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。

作者:sky link:http://www.nxadmin.com/system/linux-system/1063.html

本文由网络安全攻防研究室(www.91ri.org)信息安全小组收集整理,转载请注明出处。