在使用Linux的过程中,使用一个复杂的口令是十分有必要的,口令的安全性作为等保的一部分也是需要被严格审计的,今天我们就来聊聊有关密码长度的问题.
网上非常多的教程都把对于密码长度的设置指向了配置文件 /etc/login.defs中的PASS_MIN_LEN参数和配置文件 /etc/pam.d/system-auth文件中pam_cracklib.so模块的min_len参数,首先我们来看一看配置文件 /etc/login.defs
是无效的!!!至少我所实验的centos6、7版本都是无效的!!不信的话大家可以自己实验一下,把PASS_MIN_LEN这个参数改成一个你想实验的值,再使用非root用户来更改密码测试一下,测试后都会发现,这个参数是不生效的.至于实际原因,我查阅了很多资料也是没有找到答案,可能这个参数在centos6之前的版本是有效的,但是随着centos的更新,使用了PAM验证后,这个参数仅仅是一个摆设罢了.
接下来我们聊一聊 /etc/pam.d/system-auth文件中pam_cracklib.so,实际上对密码长度起到作用的是pam机制里的pam_cracklib.so模块!修改密码时,通过命令passwd去调用,那具体是怎么调用的呢?通过查阅资料,是通过 /etc/pam.d/passwd这个配置文件做到的,配置文件是可以互相调用的,passwd文件里的第三行password substack system-auth就调用了system-auth配置文件,其中主要调用的就是system-auth配置文件中的pam_cracklib.so模块,平时主要用的有如下参数:
- minlen=数字
- ucredit=数字
- lcredit=数字
- dcredit=数字
- ocredit=数字
minlen为最小密码的长度;
ucredit<0时,最少包含n个大写字母,ucredit>0时,最多包含n个大写字母;
lcredit同理,只不过代表的是小写字母;
dcredit同理,只不过代表的是数字;
ocredit同理,只不过代表的是特殊符号;
不准确!再经过长时间的资料搜索,终于找到了一个准确的解释,来自https://linux.die.net/man/8/pam_cracklib(man命令的说明文档),得出:
参数ucredit、lcredit、dcredit、ocredit大于0时和没有这些参数只有minlen时,完全不是上面所说那样“最多要包含多少个数字或最少包含多少个数字”,而是minlen的长度的变化,比如ocredit=2时,就代表有2个特殊字符的长度额外能加1,当你设置密码@#$$,它的长度被算作6而不是4,因为有2个特殊字符的长度被看做是2(额外加了个1),而从第3个特殊字符开始没有此类变化,长度仍被视作是1,所以长度被算作6而不是4,其余的大小写字母和数字的值大于零时,也是这个意思,而他们的默认值都是1(不设置时),也就是会有1个字符的长度额外加1,所以如果你什么都不设置,就设置minlen=8的话,理论上你的新密码只要4类字符都包含,那么4个字符就够了,比如:1Qq!,理论上是可以的,但是!!!!会提示是密码过短,因为除了minlen参数对长度有限制,还有个优先级大于minlen参数的存在,那就是cracklib内部代码对其有限制!代码就不贴了,代码写的是:当长度小于4,会输出it’s WAY too short,如果大于4小于6,会输出it is too short.所以当密码小于6时,实际是由cracklib内部代码控制,超过6之后,就由minlen控制了!这次大家终于明白了吧!