赞
踩
如何在Linux系统中限制密码长度的同时对密码的复杂程度也进行管理,最近发现有人的密码符合长度规则,可是却很简单很容易被猜出来,查了相关资料后发现了PAM中的pam_cracklib模块就是用来作密码复杂度检测的。 session
先简单的介绍一下PAM,PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它经过提供一些动态连接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员能够灵活地根据须要给不一样的服务配置不一样的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。 PAM模块是一种嵌入式模块,修改后即时生效。 ui
pam的重要文件以下: 加密
/usr/lib/libpam.so.* ## PAM核心库 spa
/etc/pam.conf ## PAM配置文件 debug
/etc/pam.d/* ## PAM各个模块的配置文件 unix
/lib/security/pam_*.so ## 可动态加载的PAM模块 日志
PAM配置文件的每一行的格式:Module-type Control-flag Module-path Arguments 接口
模块类型 控制字符 模块路径 模块参数 md5
Module-type: ci
auth:肯定有关用户认证的两方面。第一,他确认用户就是他们本身,这经过应用程序提示用户输入密码或者其余正式身份的办法。第二,这类模块会赋予成员资格。
account:处理非认证级的帐号管理。典型的用法是基于一天的不一样时间来限制、容许访问某服务。限制当前可用的系统资源(最大用户数)或者限制特定用户—root只能从控制台登录。
session:一系列有关动做,只在用户获得/失去服务时要作的事。这包括记录用户的登陆/退出、挂载必要 的目录等。
password:设置密码。
Control-flag:
required:表示本模块必须返回成功才能经过认证,可是若是该模块返回失败的话,失败结果也不会当即 通知用户,而是要等到同一stack中的全部模块所有执行完毕再将失败结果返回给应用程序。能够认为是一个必要条件。
requisite:与required相似,该模块必须返回成功才能经过认证,可是一旦该模块返回失败,将再也不执行 同一stack内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件。注:Solaris不支持。
sufficient:代表本模块返回成功已经足以经过身份认证的要求,没必要再执行同一stack内的其它模块,可是 若是本模块返回失败的话能够忽略。能够认为是一个充分条件。
optional:代表本模块是可选的,它的成功与否通常不会对身份认证起关键做用,其返回值通常被忽略。
include,从字面就知道什么意思了。包含另一个配置文件。
Module-path:
Debian的PAM module存放目录默认是在/lib/security。在各个模块的配置文件里,不用写绝对路径,直接写这个默认目录下面的模块名就能够了。固然,也能够写绝对路径。
Arguments:
各个模块的参数都不同,具体的要开发者的man手册。无效参数不会对结果有影响,可是会被日志记录 下来。首先,看看/lib/security有没有这个模块,再:man 模块名
下面开始介绍cracklib模块
pam_cracklib是一个PAM模块,用来检查密码是否违反密码字典,这个验证模块能够经过插入password堆 栈,为特殊的应用提供可插入式密码强度性检测。它的工做方式就是先提示用户输入密码,而后使用一个系统字典和一套规则来检测输入的密码是否不能知足强壮性要求。密码的强度检测分二次进行,第一次只是检测密码是不是提供的对比字典中的一部分,若是检测结果是否认的,那么就会提供一些附加的检测来进一步检测其强度,例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写情况,以及是否使用了特殊字符等等。(libpam-cracklib)
下面是cracklib模块的一些参数:
debug:将debug信息写入syslog
type=XXX:提示输入密码的文本内容。默认是"New UNIX password: " and "Retype UNIX password: ",可自定
retry=N:用户最多能够几回输入密码后报错。默认是1次。
difok=N:新密码有几个字符不能和旧密码相同,默认是5个。另外若是新密码有1/2的字符于旧不一样,也会被接受。
diginore=N:默认当新密码有23个字符时,difok选项会被忽略。
minlen=N:最小密码长度。
dcredit=N:当N>=0时,N表明新密码最多能够有多少个阿拉伯数字。当N<0时,N表明新密码最少要有多少个阿拉伯数字。
ucredit=N:和dcredit差很少,可是这里说的是大写字母。
lcredit=N:和dcredit差很少,可是这里说的是小写字母。
ocredit=N:和dcredit差很少,可是这里说的是特殊字符。
use_authtok:在某个与密码相关的验证模块后使用此选项,例如pam_unix.so验证模块
pam_cracklib 模块式PAM配置接口的基本模块,在Debian系统中配置文件是 /etc/pam.d/common-password 可是在Redhat系统中配置文件是 /etc/pam.d/system-auth 他的配置看起来像如下这样:
password required pam_cracklib.so retry=3 minlen=6 difok=3
password required pam_unix.so md5 use_authtok
第一行是 pam_cracklib模块和设置的几个模块参数
第二行是 pam_unix模块,MD5表示采用MD5加密
pam_cracklib能够记录用户使用的历史密码,而且不容许用户重复使用旧的密码,实际上存储用户旧密码的是经过pam_unix模块实现的。
第一步是创建一个空文件用来存储旧密码/etc/security/opasswd,若是你没有创建文件却使用了历史密码记录功能的话,全部的密码更新都会失败,由于pam_unix模块会报错。
opasswd就像/etc/shadow文件,由于他记录用户密码的哈希
touch /etc/security/opasswd
chown root:root /etc/security/opasswd
chmod 600 /etc/security/opasswd
一旦创建了opasswd文件,就能够在pam_unix模块后面加上参数remember=N来开始记录旧密码,remember参数记录你想记录多少旧密码,他的最大值是400,若是你设置的值超过400会当作400来对待,例如:
password required pam_cracklib.so retry=3 minlen=12 difok=4
password required pam_unix.so md5 remember=12 use_authtok
opasswd文件内容格式以下:
hal:1000::,,...,
以‘:’分割,第一列是用户名,第二列是用户ID,第三列是目前记录了该用户多少个旧密码,hashN是每次密码的MD5值,opasswd在某些系统安装PAM模块时会自动创建。
密码字典检查
pam_cracklib 也能够检查用户设置的密码是否是违反系统内部的密码字典,在Debian系统中pam_cracklib的密码字典在/var/cache/cracklib目录下,并且天天晚上update-cracklib脚本会自动的rebuild密码字典。
/etc/login.defs 文件设置密码过时时间等一系列参数,注意login.defs中设置的参数只有是用系统的useradd程序新建的一个用户时才会有login.defs中设置的属性,若是是用其余机器新建的用户,则没有以上属性,不过能够试用chage命令手动添加相关属性。
chage参数以下:
-m 密码可更改的最小天数。 为零时表明任什么时候候均可以更改密码。
-M 密码保持有效的最大天数。
-W 用户密码到期前,提早收到警告信息的天数。
-E 账号到期的日期。过了这天,此账号将不可用。
-d 上一次更改的日期
-i 停滞时期。若是一个密码已过时这些天,那么此账号将不可用。
-l 例出当前的设置。由非特权用户来肯定他们的密码或账号什么时候过时。
在密码管理方面one time password(OTP)也颇有效果,动态密码管理,有兴趣的同窗能够研究一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。