linux密码复杂度修改

PAM,即Pluggable Authentication Modules(可插入式身份验证模块)最初是由Sun公司发明的,Sun把它做为一种验证用户身份的灵活方法。多年以来,UNIX环境下的身份验证机制一直就是简单地把用户同他们在/etc/passwd文件里的配置项关联起来而已。后来,由于须要有更强的安全性,并且要支持更大范围的验证机制(像智能卡),因此对灵活性更好的验证方法的需求也就应运而生。某些PAM LDAP模块对全局的验证目录集中执行验证。
全部完善的Linux发行版本都带Linux-PAM,它和Sun公司PAM标准目前的实现没有关系。PAM的概念很简单:须要验证功能的程序只须要知道有一个模块能够用来替它们执行验证功能就好了。PAM的设置保证了模块能够随时添加、删除和从新配置—对于编译工具程序的时候就被连接进来(甚至本来就有)的模块来讲,不必这样作。这种结构的效果就是,PAM已经成为系统管理员极其强大的工具。
PAM模块是经过/etc/pam.d目录下的文件来进行配置的。这个目录下针对每种服务的文件所包含的配置项都有以下形式:
 
module-type control-flag module-path arguments
 
module-type字段能够取的值有auth、account、session或者password。auth肯定用户是谁,还可能肯定他是哪个组的成员。account实行不基于身份验证的决策,好比根据一天中的时间来访问。session实现了在提供给用户服务的先后须要完成的任务。最后,password用于要求用户提供验证信息(好比口令)的状况。
control-flag字段有4个可能的取值:required、requisite、sufficient和optional。required和optional最经常使用,它们分别表示:为了程序继续执行模块必须取得成功,或者模块成功与否没有关系。
第3个和第4个字段是动态加载模块对象的路径和参数。若是路径的第1个字符是/,它就被看成是一个绝对路径。不然,这个字段的内容就被追加到默认路径/lib/security的后面。
PAM是上述口令复杂性难题的解决方案之一。pam_cracklib模块可以强制要求口令符合最低强度要求。具体要求则变化无穷,因此要使用grep找到正确的配置文件。例如,要保证用户口令不能被John the Ripper破解(参考20.10.3节了解有关它的更多知识),Fedora上的/etc/pam.d/system-auth应该包括:
 
password required pam_cracklib.so retry=3 minlen=12 difok=4
 
有了这几行,PAM就会把用户提出的新口令同破解字典和规则集进行对照(这要求有系统库libcrack,还有一个系统字典/usr/lib/cracklib_dict.*)。若是用户的口令不符合cracklib的要求,那么屏幕上就会出现像“The password is too simple(口令太简单)”这样的出错信息。
cracklib的参数规则很复杂,不过下面是对上述特定配置的解释。
—  参数retry=3指出用户在输入一个强口令的时候必须输入三遍。
—  参数minlen=12指出口令的最短长度。大写字母、数字和标点符号由库特殊处理,从而减少了这个最短长度。参数为minlen=12时,用户能有的最短口令实际为8个字符,不是12个字符,可是用户设定一个8字符口令时必须包括全部4种字符类型。
—  参数difok=4指出新口令至少要有4个字符不会出如今老口令中。
现代Linux发行版本包含而且默认使用pam_cracklib模块,但一般不启用口令复杂性规则。
PAM模块有数十种。您能够从www.kernel.org/pub/linux/libs/pam下载专门的模块以及它们的文档。 linux

系统版本:
Red Hat Enterprise Linux AS release 4
Linux用户密码策略
    Linux用户密码的有效期,是否能够修改密码能够经过login.defs文件控制.对login.defs文件修只影响后续创建的用户,若是要改变之前创建的用户的有效期等可使用chage命令.
    Linux用户密码的复杂度能够经过pam pam_cracklib module或pam_passwdqc module控制,二者不能同时使用. 我的感受pam_passwdqc更好用.
 
/etc/login.defs密码策略
PASS_MAX_DAYS   99999     #密码的最大有效期, 99999:永久有期
PASS_MIN_DAYS   0          #是否可修改密码,0可修改,非0多少天后可修改
PASS_MIN_LEN    5          #密码最小长度,使用pam_cracklib module,该参数再也不有效
PASS_WARN_AGE   7         #密码失效前多少天在用户登陆时通知用户修改密码
pam_cracklib主要参数说明:
    tretry=N:重试多少次后返回密码修改错误
    difok=N:新密码必需与旧密码不一样的位数
    dcredit=N: N >= 0:密码中最多有多少个数字;N < 0密码中最少有多少个数字.
    lcredit=N:小宝字母的个数
    ucredit=N大宝字母的个数
    credit=N:特殊字母的个数
    minclass=N:密码组成(大/小字母,数字,特殊字符)
 
pam_passwdqc主要参数说明:
mix:设置口令字最小长度,默认值是mix=disabled。
max:设置口令字的最大长度,默认值是max=40。
passphrase:设置口令短语中单词的最少个数,默认值是passphrase=3,若是为0则禁用口令短语。
atch:设置密码串的常见程序,默认值是match=4。
similar:设置当咱们重设口令时,从新设置的新口令可否与旧口令类似,它能够是similar=permit容许类似或similar=deny不容许类似。
random:设置随机生成口令字的默认长度。默认值是random=42。设为0则禁止该功能。
enforce:设置约束范围,enforce=none表示只警告弱口令字,但不由止它们使用;enforce=users将对系统上的全体非根用户实行这一限制;enforce=everyone将对包括根用户在内的全体用户实行这一限制。
non-unix:它告诉这个模块不要使用传统的getpwnam函数调用得到用户信息,
retry:设置用户输入口令字时容许重试的次数,默认值是retry=3
 
 
密码复杂度经过/etc/pam.d/system-auth实施
如:
要使用pam_cracklib将注释去掉,把pam_passwdqc.so注释掉便可.
#password    requisite     /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
password    requisite     /lib/security/$ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
 
#password    requisite     /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
新密码至少有一位与原来的不一样. 安全