在基于Debian的Linux服务器上部署密码质量检查可以帮助确保您的用户为其帐户分配合理的安全密码,但设置本身可能有点误导。
例如,设置最小密码长度为12个字符并不一定意味着您所有用户的密码实际上都有12个或更多字符。
让我们漫步复杂的大道,看看设置如何工作,并检查一些值得考虑的东西。
包含我们将要查看的设置的文件将是:
- /etc/pam.d/common-password.在Debian-Base系统上
- /etc/security/pwquality.conf.conf.在Redhat.
复杂性设置
这是它的工作原理。您可以设置最小密码长度以确保实力,但这可能无法与您的期望完全相同。实际上,具有最多字符的密码不一定是最安全或更容易使用和记住。事实上,您的用户可以使用较短的密码来设置,如果它们包含某些限制和类别的字符类别,这使得它们更加安全地破解并获得信用。
以下是您可以需要的复杂性设置:
- 大写字符
- 小写字符
- 数字
- 其他角色(例如,标点符号)
- 一个上面的混合物
- 对任何特定类中字符数(大写,小写等)的字符数的限制
- 对可以使用相同角色的倍增的限制
- 必须与上一个密码中使用的字符数量不同
- 限制密码重新使用
设置包括:
- Minlen.=最小密码长度
- MINCLASS.=必须使用的最小字符类型数(即,大写,小写,数字,其他)
- maxrepeat.=可以重复单个字符的最大次数
- maxclassrepeat.=可以在同一类中的行中的最大字符数
- lcredit.=将产生信用的最大小写字符数
- ucredit.=将产生信用的最大大写字符数
- dcredit.=将生成信用的最大数字数
- 焦点=将产生信用的最大数量
- 缺少=必须与旧密码不同的字符数
- 记得=系统记住的密码数,以便不能再次使用它们
- Gecoscheck.=是否从用户的passwd条目GECOS字符串中检查单词(如果值不是0,则启用)
- dictcheck.=是否检查CrackLib字典中的单词(如果值不是0,则启用)
- usercheck.=是否检查密码是否包含某种表单中的用户名(如果值不是0,则启用)
- 强制执行=如果失败检查,则拒绝新密码,并且该值不是0
- dictpath.= cracklib词典的路径。默认是使用CrackLib默认值。
红色帽子系统上的这些设置可能是这样的。该信用设置意味着您的用户将获得使用可以减少密码长度要求的字符类型混合的信用。
$ grep“=”/etc/security/pwquality.conf
#difok = 1
Minlen = 12.
dcredit = -1
Ucredit = 1
Lcredit = 1
ocredit = 1
#minclass = 0
#maxrepeat = 0
#maxclassrepeat = 0
#gecoscheck = 0
#dictcheck = 1
#usercheck = 1
#Enforcing = 1
#dictpath =.
Debian系统上的相同设置可能如下所示:
$ grep ^ password common-password
密码必需pam_pwquality.so retry = 3 minlen = 12 difok = 1记住= 3 lcredit = 1 ucredit = 1 ocredit = 1 dcredit = -1
请注意,无论您设置的值如何Minlen.,密码不能超过六个字符。也就是说,即使你设置了Minlen.等于4并为许多类型的字符提供信用,将拒绝少于六个字符的密码。
获得复杂性的信誉
“积分”的想法(例如,lcredit.和ucredit.)非常有趣。基本上,如果对于字符混合更复杂,则可能是较短的密码。
作为一个例子,像“hijlmqrazp”这样的密码可能会通过一个Minlen = 10.测试。如果dcredit.另一方面设置为2,密码“HijlMQ99”也将通过。为什么?因为你得到了数字的两个学分。因此,八个字符加积分在没有信用的情况下高达10个字符。如果dcredit.设置为1,您需要一个额外的角色。但是,我们还可以授予大写,小写和非字母数字字符等信用,如标点符号。
但是,请注意,您只能为许多不同的字符获得信誉。也许你只会获得一位数或两个大写字符的信用。也许你没有为小写字符获得任何信用。这一切都取决于您的设置。
混合字符课程
播放的另一个设置是MINCLASS.设置,确定必须使用多少类字符来接受密码。如果MINCLASS.设置为2,密码包含所有小写,全部大写,所有数字,或所有其他类别的字符都无法正常工作。如果设置为2,MINCLASS.需要您使用来自两个类的字符,如大写和小写,或小写和数字。
借MINCLASS.设置为4,密码必须包含所有四种类型的字符 - 就像“howzit2b?” - 而且,如果我们获得大写,数字或其他字符的信用,即使与之相同Minlen.设置为12。
您还可以在任何特定类的字符数上放一个帽子。设定maxclassrepeat.设置为4和密码不能连续包含超过四个小写,大写,数字或其他字符。
负值的含义
设置任何一个lcredit.那ucredit.那dcredit., 要么焦点设置为负数意味着您必须具有用于可接受的密码的一些类型的字符。设置dcredit.例如,至-1将意味着您必须至少包含一个数字。
其他远程力量检查
Linux的密码质量检查包括许多其他检查,有助于确保密码相当安全。它可以检查密码是否是parindrome,如“racecar”,新密码是否与旧密码相同,但只有旧密码的变化,如果旧密码彼此过于相似或旋转,以及密码是否包含用户的名称。(它达到了它实际上很难为自己分配一个非常糟糕的密码可能很难。)
例如,如果用户不符合所有指定的条件,则更改密码更改尝试可能如下所示:
$ passwd.
更改SHS的密码。
当前密码:
新密码:
密码错误:密码是palindrome
新密码:
密码错误:密码包含少于1个大写字母
新密码:
密码错误:密码包含少于1个非字母数字字符
passwd:为服务耗尽了最大的重试次数
passwd:密码不变
密码质量测试
如果更改以下Perl脚本的顶行中的设置,则会为将通过您的优质测试的密码进行感觉。在此示例中,密码的最小长度已设置为12.给出一个信用卡为小写和大写字母,但对于特殊字符无,无需(仅用于演示差异)。另外,一个数字必须包括(设置-1)。
#!/ usr / bin / perl -w
# - 在此处设置复杂性偏好 -
$ minlen = 12;
$ lcredit = 1;
$ ucredit = 1;
$ dcredit = -1;
$ ocredit = 0;
# - 初始化计数器 -
$得分= 0;
$ lcase = 0;
$ Ucase = 0;
$ digits = 0;
$其他= 0;
# - set无法虚假 -
$ fall = 0;
# - 检查参数 -
if($#argv <0){
打印“参数预期\ n”;
出口;
} else {
$ password = $ argv [0];
}
# - 确定是否是任何字符设置是必需的(如果是负面的)
if($ lcredit <0){#所需的小写字符#
$ lneeded = -1 * $ lcredit;
$ lextra = $ lneeded;
} else {
$ lneeded = 0;
$ lextra = $ lcredit;
}
if($ ucredit <0){#需要的大写字符#
$ uneeded = -1 * $ ucredit;
$ uextra = $ uneeded;
} else {
$ uneeded = 0;
$ uextra = $ ucredit;
}
if($ dcredit <0){#需要的数字#
$ dneeded = -1 * $ dcredit;
$ oxtra = $ dneeded;
} else {
$ dneeded = 0;
$ dextra = $ dcredit;
}
if($ ocredit <0){#所需的特殊字符#
$ Oneeded = -1 * $ ocredit;
$ oextra = $ odeed;
} else {
$ Oneeded = 0;
$ oextra = $ ocredit;
}
$得分=长度($密码);#1点为每个字符
# - 密码必须至少包含6个字符
if($ score <6){
打印“密码必须包含至少6个字符\ n”;
出口;
}
# - 计算每种类型的字符 -
forach $ char(splet //,$ password){
if($ char =〜/ d /){
$ digits ++;#数字
} elsif($ char!〜/ \ w /){
$其他++;# 特殊的角色
elsif($ char eq lc($ char)){
$ lcase ++;#小写
elsif($ char eq uc($ char)){
$ Ucase ++;#大写
} else {
打印“错误:无法识别的角色。请修复此脚本!\ n”;
}
}
if($ lcase <$ lneeded){
打印“密码失败:需要$ lneeded小写字符\ n”;
$ fall = 1;
}
if($ ucase <$ uneeded){
打印“密码失败:需要$ UNEEDED大写字符(s)\ n”;
$ fall = 1;
}
if($ digits <$ dneeded){
打印“密码失败:需要$ DNEEDED DIGIT(s)\ n”;
$ fall = 1;
}
if($其他<$ oneeded){
打印“密码失败:需要$ odeed特殊字符\ n”;
$ fall = 1;
}
if($ fall> 0){
出口;
}
# - 减少允许的号码 -
if($ lcase> $ lextra){
$ lcase = $ lextra;
}
if($ ucase> $ uextra){
$ Ucase = $ uextra;
}
if($ digits> $ dextra){
$ digits = $ $ dextra;
}
if($其他> $ oextra){
$其他= $ oExtra;
}
打印“$得分+ $ lcase + $ ucase + $数字+ $其他\ n”;
$得分= $ score + $ lcase + $ ucase + $ digits + $其他;
if($ score> = $ minlen){
打印“密码传递得分$ score \ n”;
} else {
打印“密码失败,得分$ score \ n”;
}
请注意,密码“2good4me?”即使它长度只有9个字符也是通过。这是因为我们为大写g提供了一个荣誉,一个是用于使用小写字母和一个用于数字的信用。如果我们获得了“?”,我们已经通过了13次也是。“9 + 1 + 1 + 1 + 0”行显示Credits列表:
$ pwquality 2good4me?
9 + 1 + 1 + 1 + 0
密码传递得分为12
密码复杂性和PAM
通过可插拔身份验证模块(PAM)提供对密码复杂性的支持。如果您有一个名为的文件/etc/pam.d/system-auth.在Redhat系统上,寻找看起来像下面所示的线条。
$ grep password /etc/pam.d/system-auth
密码必需pam_pwquality.so try_first_pase local_users_only
密码足够的pam_unix.so sha512 shadow nullok try_first_pass use_authttok
密码足够的pam_sss.so使用_ authtok
密码需要pam_deny.so
在像Ubuntu这样的Debian系统上,此命令将显示PAM是否已安装并准备好使用:
$ apt-cache策略* pam-pwquality *
libpam-pwquality:
安装了:1.4.2-1Build1.
候选人:1.4.2-1Build1.
版本表:
*** 1.4.2-1Build1 500.
500 http://us.archive.ubuntu.com/ubuntu focal / main amd64包
100 / var / lib / dpkg / status
如果您的系统上的响应显示“已安装:(无)”,则可以使用此命令安装它:
$ sudo apt安装libpam-pquality