我们在使用linux系统设置密码的时候,经常遇到这样的问题,系统提示:您的密码太简单,或者您的密码是字典的一部分。那么系统是如何实现对用户的密码的复杂度的检查的呢?
系统对密码的控制是有两部分(我知道的)组成:
1 cracklib
2 login.defs
声明:login.defs主要是控制密码的有效期。对密码进行时间管理。此处不细谈。
login.defs --shadow password suite configuration
pam_cracklib.so 才是控制密码复杂度的关键文件。
redhat公司专门开发了cracklib这个安装包来判断密码的复杂度。
可以rpm -ql cracklib查看。
密码的复杂度的判断是通过pam模块控制来实现的,具体的模块是pam_cracklibpam_cracklib 的参数介绍:
debug
该选项使用模块将信息写入到日志(3)来指示组件的行为(这个选项不会记录密码信息到日志文件)。
type=XXX
默认的操作是为模块,当请求密码时,该模块默认操作是使用以下提示:“新的UNIX密码:”和“重新输入密码UNIX”。此选项就是替换默认单词的UNIX。
retry=N
提示用户最多N次会返回错误。默认值是1
difok=N
此参数会改变默认新密码中必须有5个字符不同于旧密码中字符,此外,如果新密码中有一半字符不同于旧密码,那么就可以使用新密码。
difignore=N
密码在少于多少个字符时,difok将被忽略,默认是23。
minlen=N
新密码可接受的最小长度。
dcredit=N
(N < 0) 新密码最小数字长度。
ucredit=N
(N < 0) 新密码最小大写字母长度。
lcredit=N
(N < 0) 新密码最小小写字母长度。
ocredit=N
(N < 0) 新密码最小其他字符长度。
use_authtok
此参数用于强制不提示用户输入新的密码而由以前堆积的密码模块所提供。
dictpath=/path/to/dict
Path to the cracklib dictionaries.
dictpath=/path/to/dict //注:密码字典,这个是验证用户的密码是否是字典一部分的关键。
Path to the cracklib dictionaries.
例子:
在linux下设置密码复杂度办法:
(1)修改/etc/login.defs文件
PASS_MAX_DAYS 90 #密码最长过期天数
PASS_MIN_DAYS 80 #密码最小过期天数
PASS_MIN_LEN 10 #密码最小长度
PASS_WARN_AGE 7 #密码过期警告天数
(2)修改/etc/pam.d/system-auth文件
找到 password requisite pam_cracklib.so这么一行替换成如下:
password requisite pam_cracklib.so retry=5 difok=3 minlen=10 ucredit=-1 lcredit=-3 dcredit=-3 dictpath=/usr/share/cracklib/pw_dict
参数含义:
尝试次数:5 最少不同字符:3 最小密码长度:10 最少大写字母:1 最少小写字母:3 最少数字:3 密码字典:/usr/share/cracklib/pw_dict
注意:以上设置对root用户无效。修改后你可能会立即测试,会发现以上设置无效。你可以新建账户,并进入该账户。
useradd test
passwd test
su - test
此时你发现设置起作用了。