APP下载

等保测评主机安全之centos密码长度

消息来源:baojiabao.com 作者: 发布时间:2026-05-20

报价宝综合消息等保测评主机安全之centos密码长度

密码长度,作为等级保护主机测评项里中密码复杂度要求之一,是必须要查的。

在《等级测评师初级教程》里,对于密码长度的设定指向了/etc/login.defs里的PASS_MIN_LEN字段。

# PASS_MIN_LEN Minimum acceptable password length.PASS_MIN_LEN5简单明了,对新密码的长度最小值做出了限制。

不过,实际上这个引数是无效的,至少在centos6以及以上版本里,这个引数对新密码长度没有一点点的制约。

比如大家可以试一试,给PASS_MIN_LEN设一个值,再用 非root账户去改改密码,看看对新密码长度有没有影响。甚至,还可以直接删除login.defs档案,试一试。反正,我的测试结果是:这个引数没有起到作用。

结果是出来了,至于原因,我没找到,网上也没有相关的资料。或许该引数在centos以前的某个老版本里是有作用的,但随着版本更新,特别估计是开始使用PAM认证机制后,该引数就无效化了,仅仅作为一个迷惑人的引数放置在login.defs档案里。实际上真正起作用的,是一个pam模组,具体点,也就是pam_cracklib.soPAM认证机制个人感觉就是一个模组化、元件化的机制,一些人把一些认证、验证以及其他功能实现好了,然后上层的应用去呼叫配置档案(界面),而配置档案呢再呼叫底层的实现,大概就是下图这个样子:

所谓的应用程序,就包括在linux里使用的命令,好,回到密码长度这个话题。

修改密码时对于密码的一系列验证由pam_cracklib.so模组实现,那么谁去呼叫?那当然就是passwd了(修改密码的命令)。passwd怎么呼叫的?是通过配置档案(界面)做到的。

在centos6以及以上版本中,这个配置档案就是/etc/pam.d中与passwd同名的档案,也就是[[email protected] ~]# ls /etc/pam.datd fingerprint-auth-ac password-auth smtp system-config-authenticationauthconfig gdm password-auth-ac smtp.postfix system-config-dateauthconfig-gtk gdm-autologin polkit-1 smtp.sendmail system-config-kdumpauthconfig-tui gdm-fingerprint poweroff sshd system-config-keyboardchfn gdm-password ppp sshd~ system-config-networkchsh gnome-screensaver reboot ssh-keycat system-config-network-cmdconfig-util halt remote su system-config-userscrond ksu run_init sudo vmtoolsdcups login runuser sudo-i xservercvs login~ runuser-l su-ldovecot newrole setup system-autheject other smartcard-auth system-auth~fingerprint-auth passwd smartcard-auth-ac system-auth-ac[[email protected] ~]# cat /etc/pam.d/passwd#%PAM-1.0auth include system-authaccount include system-authpassword substack system-auth-password optional pam_gnome_keyring.so对于配置档案,具有一定的规范,第一列代表模组型别,型别分为4种:

auth: 用来对使用者的身份进行识别.如:提示使用者输入密码,或判断使用者是否为root

account:对账号的各项属性进行检查.如:是否允许登入,是否达到最大使用者数,或是root使用者是否允许在这个终端登入等

session:这个模组用来定义使用者登入前的,及使用者退出后所要进行的操作.如:登入连线资讯,使用者资料的开启与关闭,挂载档案系统等.

passwd:使用使用者资讯来更新.如:修改使用者密码.

这里,由于是修改密码,所以会使用passwd型别的模组。

配置档案是可以互相呼叫的,passwd档案里的第三行

password substack system-auth就呼叫了system-auth配置档案。这里的substack和include都是引用的意思,只是稍微有点区别(具体百度就知道了)。

然后这个system-auth档案也在的资料夹中,内容为[[email protected]~]# cat /etc/pam.d/system-auth#%PAM-1.0# This file is auto-generated.# User changes will be destroyed the next time authconfig is run.authrequired pam_env.soauthsufficient pam_fprintd.soauthsufficient pam_unix.so nullok try_first_passauthrequisite pam_succeed_if.so uid >= 500 quietauthrequired pam_deny.soaccountrequired pam_unix.soaccountsufficient pam_localuser.soaccountsufficient pam_succeed_if.so uid accountrequired pam_permit.sopasswordrequisite pam_cracklib.so try_first_pass retry=3 type=passwordsufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtokpasswordrequired pam_deny.sosessionoptional pam_keyinit.so revokesessionrequired pam_limits.sosession[success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uidsessionrequired pam_unix.so其中,具体被引用(使用)到的是:

password requisite pam_cracklib.so try_first_pass retry=3 type=password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtokpassword required pam_deny.sopam_cracklib.sominlen=N:最小密码长度。dcredit=N:当N>=0时,N代表新密码最多可以有多少个阿拉伯数字。当Nucredit=N:和dcredit差不多,但是这里说的是大写字母。lcredit=N:和dcredit差不多,但是这里说的是小写字母。ocredit=N:和dcredit差不多,但是这里说的是特殊字元。似乎到这里就差不多了,因为都找到了实际控制新密码最小长度的地方了,但其实还没完呢。

因为网上关于pam_cracklib模组中这几个引数的解释,可以说,基本上都是不准确的。

那当然,我都这么说了,我这里自然会给一个准确的解释(我觉得这应该是全网唯一清楚且准确的中文解释了,因为我自己在查询资料的时候完全没有搜到,有些资料比较接近,但实际还是没说清楚)。

准确的解释来man命令输出的说明文件:https://linux.die.net/man/8/pam_cracklib

其实写得还是比较清楚的,但是还是有点抽象,我稍微解释下。

minlen确实有最小长度的意思,但是当dcredit、ucredit、lcredit、ocredit的值(N)大于等于零的时候,情况就不同了。

N大于零的时候,完全不是网上说的“最多可以有多少个数字或大小写字母或特殊字元”的意思,而是计算长度的时候会有变化。

比如ocredit(特殊字元)的值是2的时候,就代表有最多有2个特殊字元的长度额外能加1。

当你设定的密码是:@#¥,它的长度被算作是5,而不是3。因为有2个特殊字元的长度被看做是2(额外加了个1),而第3个特殊字元没有此类变化,长度仍被视作是1,所以总共长度时(2+2)+1=5。

所以,如果ocredit的值是4,那么@#¥%&的长度就是(4+4)+1=9。

其余的大小写字母和数字的值大于零时,也是这个意思。而他们的预设值都是1,也就是会有1个字元的长度额外加1。

所以如果你什么都不设定,就设定minlen=8的话,理论上你的新密码只要4类字元都包含,那么4个字元就够了,比如:[email protected]

当然,如果你真这么设定,实际上是不行的,因为除了minlen对长度有限制,cracklib内部有程式码对其有限制,而且优先级高于minlen。

解释如下:Note that there is a pair of length limits in Cracklib itself, a “way too short” limit of 4 which is hard coded in and a defined limit (6) that will be checked without reference to minlen。

大概的程式码如下:

#define MINLEN 6char *FascistLook(pwp, instring) PWDICT *pwp; char *instring;{ int ii; char *ptr; char *jptr; char junk[STRINGSIZE]; char *password; char rpassword[STRINGSIZE]; int32 notfound; notfound = PW_WORDS(pwp); /* already truncated if from FascistCheck */ /* but pretend it wasn\'t ... */ strncpy(rpassword, instring, TRUNCSTRINGSIZE); rpassword[TRUNCSTRINGSIZE - 1] = \'\'; password = rpassword; if (strlen(password) { return ("it\'s WAY too short"); } if (strlen(password) { return ("it is too short"); } jptr = junk; *jptr = \'\'; for (ii = 0; ii { if (!strchr(junk, password[ii])) { *(jptr++) = password[ii]; *jptr = \'\'; } } if (strlen(junk) 所以说,如果长度小于4,会输出it’s WAY too short,如果大于4小于6,会输出it is too short。

当然,超过了6之后,就是由minlen控制了。

嗯……扯了这么久,大概把修改密码时密码长度的事情说完了。

正如前言所说,和等保关系不大。

不过如果在检查的时候看到PASS_MIN_LEN 8 的时候,是给这1分还是不给分呢?

我想大家在心里都是有答案的,嘿嘿。

另外,这个pam认证机制还是经常会碰到的,比如在登入失败处理功能中,是用pam_tally或者pam_tally2模组去实现。

所以聪明的你一定知道具体应该去哪个配置档案里检视是否进行设定了。

比如远端ssh连线的登入失败处理功能,自然就是去pam.d资料夹中的sshd档案检视,sshd又引用passwd-auth,所这两个档案都可以实现失败处理(所以初级教程让你去system-auth里检视配置,其实是管不了ssh远端连线登入的,实际上管的是本地tty终端登入)。

而本地tty终端登入,也就是使用login命令,是去pam.d资料夹中的login档案检视,login则引用system-auth档案,同理,这两个档案都可以实现。

至于su命令和图形化界面视窗登入(比如gdm-password)也是按照这种方法去检视有效配置档案在哪儿。

就先写到这了,以后有空再写一写其他的。

*本文原创作者:起于凡而非于凡,本文属FreeBuf原创奖励计划,未经许可禁止转载

精彩推荐

2019-12-29 11:51:00

相关文章