RHEL6: PAM

PAM可用于各种认证、授权。
下面做两个简单的实验,看看pam_cracklib和pam_tally2的简单用法。

参考文档

1. Linux-PAM page http://www.linux-pam.org/
2. Linux可插拔认证模块的基本概念与架构 http://www.infoq.com/cn/articles/wjl-linux-pluggable-authentication-module
3. Linux可插拔认证模块(PAM)的配置文件、工作原理与流程 http://www.infoq.com/cn/articles/linux-pam-one

Control Flag 控制位

控制位有四种取值:required、requisite、sufficient、optional。
required - 该行必须通过才算成功,但无论是否成功通过,验证过程都会继续往下跑;
requisite - 这一行必须通过才算成功,但如果该行失败,就自己返回失败,不往下执行;
sufficient - 如果这一行通过了,就直接返回成功,如果失败还是继续往下走;这一行失败不会影响其他验证;
optional - 即便该行所涉及的模块验证失败用户仍能通过认证;

pam_cracklib

(控制本地修改密码,在/etc/pam.d/system-auth中修改pam_cracklib参数)
pam_cracklib可用于限制密码复杂度,用户修改密码必须要达到复杂度的要求。
常用的有min_len, dcredit, ocredit, ucredit, lcredit.
min_len用于控制密码最小长度,当然它会受到dcredit, ocredit, ucredit, lcredit的影响。
dcredit, ocredit, ucredit, lcredit如果设置成>=0时,分别表示数字、其他字符、大写字母、小写字母的上限credit值。
比如,如果dcredit, ocredit, ucredit, lcredit都设置成1(默认值),min_len=12,对于【nxyNXY12&】这个密码,有大小写字母数字和其他字符,一共能得到4个credit,于是密码长度只要满足12-4=8就能通过了。

password    requisite     pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=1 ocredit=1 ucredit=1 lcredit=1

如果上面dcredit, ocredit, ucredit, lcredit都设置成0,那么密码必须要有12个或以上字符才能通过。

pam_tally2

tally2可以统计登录的成败次数。
可以实现例如,用户登录时密码错误超过2次,就锁定用户120秒(无论再次输入密码正确与否,这120秒内都无法登入系统)。

修改/etc/pam.d/system-auth
在auth上面加上一行

auth    required        pam_tally2.so   deny=2 onerr=fail unlock_time=120

在account上面加上一行

account required        pam_tally2.so

搞定啦。

pam_succeed_if

pam_succeed_if可以做一些逻辑跳转。
例如,我想让uid大于1000的用户,密码必须有10位或以上;uid不超过1000的用户,密码必须有8位或以上。
于是可以这么写

password        [default=1 success=ignore] pam_succeed_if.so uid > 1000
password        requisite       pam_cracklib.so try_first_pass retry=3 minlen=10 dcredit=0 ocredit=0 ucredit=0 lcredit=0
password        [default=1 success=ignore] pam_succeed_if.so uid <= 1000
password        requisite       pam_cracklib.so try_first_pass retry=3 minlen=8 dcredit=0 ocredit=0 ucredit=0 lcredit=0

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

success=ignore 表示,满足判断条件则正常往下执行;
default=1 表示,不满足判断条件则跳过下面1行,再往下执行。