资讯动态

Linux密码策略解析:如何放行六位纯数字密码及安全代价

发布时间:2026/10/15 5:51:45 来源:尧图企业网站定制
说实话第一次被 Linux 系统拒绝六位纯数字密码的时候我差点以为是终端卡了输入passwd敲了一串123456系统回了一句BAD PASSWORD: The password is shorter than 8 characters。这个提示第一次见会有点懵但搞清楚之后你会发现它并不是 Linux 在故意给你找别扭而是 PAM可插拔认证模块在背后执行了一套默认的密码复杂度策略。这篇文章给你讲明白一条完整的链路是谁拦下你的纯数字短密码怎么修改配置把它放开放开了之后又会带来哪些安全代价以及万一改出问题怎么快速收场。1. 默认策略到底是谁在执行PAM 密码检查链路拆解1.1 你执行 passwd 之后发生了什么在大多数 Linux 发行版上普通用户执行passwd、管理员执行passwd 用户名时真正去改/etc/shadow的操作并不会立刻发生。passwd命令会先走一遍 PAM 堆栈堆栈里堆着一串认证或策略模块这些模块全部认可之后密码才会落盘到/etc/shadow。PAM 的配置文件一般放在/etc/pam.d/下跟passwd这个服务对应的文件就叫/etc/pam.d/passwd。你可以执行下面这个命令看一下cat /etc/pam.d/passwd比较常见的内容结构类似这样#%PAM-1.0 include common-password或者在某些发行版上会直接写password requisite pam_pwquality.so retry3 password sufficient pam_unix.so obscure use_authtok sha512 shadow这两行是核心第一行是“密码质量检查”第二行才是真正把密码写入 shadow 文件的模块。如果你的系统上有include common-password这种写法那就说明passwd服务把公共的密码策略文件引了进来真正设规则的地方是那个被引用的公共文件比如/etc/pam.d/common-password或/etc/pam.d/system-auth。1.2 pwquality 和 cracklib到底是谁在管复杂度不同发行版的密码策略模块有两个名字pam_pwquality.so和pam_cracklib.so。你可以理解成pam_pwquality是较新、功能更完整的一版pam_cracklib是老一代的替代品。大部分系统现在用的是pam_pwquality但早期系统或者精简系统里依然能看到pam_cracklib的身影。这两个模块主要负责检查新密码的长度、字符种类、连续重复、字典词匹配等风险项。默认参数通常包括minlen8最少 8 位dcredit0默认不强制数字个数ucredit0默认不强制大写字母个数lcredit0默认不强制小写字母个数ocredit0默认不强制特殊字符个数difok3新密码与旧密码至少要有几个字符不同dictcheck拒绝明显的字典词和数字序列。所以当你输入123456时首先是minlen8这一关就把你挡死了。即使你把minlen调低123456这种连续数字序列也有可能被词典检查那一关拦下来。这些都是后面配置时要一起处理的问题。1.3 配置文件与 PAM 参数谁说了算pam_pwquality模块的规则有两个来源一是/etc/security/pwquality.conf这个专门放策略参数的配置文件二是写在 PAM 堆栈里那一行pam_pwquality.so后面的参数。优先级的规则是PAM 堆栈里显式写的参数优先于pwquality.conf里的同名参数。比如你在堆栈里写minlen8那配置文件里写minlen 6也不会生效。因此排查“我改了配置怎么还是不能设短密码”时第一件事就得去翻 PAM 堆栈那一行而不是只盯着配置文件。2. 动手前的盘查检查模块、认清入栈文件、做好备份2.1 先确认系统用的是哪一套策略模块在改任何配置之前先用一条组合命令把当前系统所有涉及密码策略的文件和模块位置打印出来grep -R pam_pwquality\|pam_cracklib /etc/pam.d/这条命令会帮你定位到所有引用了密码质量模块的文件。不同发行版结果不太一样有的只在/etc/pam.d/common-password里出现有的集中在/etc/pam.d/system-auth和/etc/pam.d/password-auth还有一些可能散落在login、sshd、gdm-password等具体服务文件里。接着确认模块文件本身是否存在ls -l /lib/security/pam_pwquality.so 2/dev/null || ls -l /lib/*/security/pam_pwquality.so 2/dev/null如果提示找不到文件说明系统里根本没有装密码质量检查模块那你需要先安装对应包。Debian 系一般叫libpam-pwqualityRed Hat 系一般叫pam_pwquality或pam。没有这个模块PAM 堆栈里的pam_pwquality.so配置行会直接报错导致passwd根本无法使用。2.2 别被“改 passwd 文件”这句话带偏很多人搜资料时会看到“修改 /etc/pam.d/passwd”然后照着改了结果发现根本不生效。原因很简单很多发行版的/etc/pam.d/passwd里写的只是include common-password真正起作用的规则在公共堆栈文件里。所以在改之前你要做的是先cat /etc/pam.d/passwd确认引用关系再打开被引用的common-password或system-auth如果同时存在system-auth和password-auth建议两个都改因为图形登录、控制台登录、SSH 登录各自走的文件不一样但在多数系统里都会归到这两套公共堆栈上。打开之后重点看两样东西pam_pwquality.so这一行带了哪些参数以及pam_unix.so后面有没有obscure这个选项。obscure会让pam_unix自己也做一些简单的弱口令判断有时候pam_pwquality都放行了结果又被它拦一道。2.3 修改前备份三个文件这一步不能省。密码策略文件一旦写错轻则改不了密码重则整个系统无法登录特别是你人在远程操作的时候更危险。我习惯这样备份cp /etc/security/pwquality.conf /etc/security/pwquality.conf.bak cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak 2/dev/null || true cp /etc/pam.d/common-password /etc/pam.d/common-password.bak 2/dev/null || true备份完成后再开始改。如果后续改崩了直接拷贝备份文件回去就能恢复这是最稳妥的保底方案。3. 真正放开六位纯数字密码完整配置与验证流程3.1 用 pwquality.conf 实现“一次放开”大多数发行版都默认配置了/etc/security/pwquality.conf模块会在加载时读取它。在文件末尾追加以下内容minlen 6 dcredit 0 ucredit 0 lcredit 0 ocredit 0 difok 0 minclass 0 maxrepeat 0 maxclassrepeat 0 dictcheck 0逐个解释这些参数的意义参数值作用minlen6允许的最短密码长度为 6 位dcredit0不要求必须包含数字也不把数字当作长度奖励ucredit0不要求大写字母lcredit0不要求小写字母ocredit0不要求特殊字符difok0新密码可以不和旧密码有差异minclass0不要求密码涵盖多少种字符类别maxrepeat0允许连续重复字符比如111111maxclassrepeat0允许整串密码都是同一类别字符dictcheck0不检查密码是否命中字典词或常见序列这里最容易被忽略的是dictcheck 0。如果你只把minlen改成 6不加这一行输入123456时有可能会被词典检查拦截报错提示变成BAD PASSWORD: it is based on a dictionary word之类的信息。还容易踩坑的是dcredit的正负号。我见过不少人从网上拷贝配置看到的是dcredit -1那个值是“至少包含 1 位数字”的意思。你想放行纯数字密码应该用0不是-1。3.2 如果系统不支持配置文件直接改 PAM 行有些精简系统或者自定义 PAM 堆栈的系统里pam_pwquality.so那一行参数是写死的配置文件里写了也不读。这时就需要直接编辑 PAM 堆栈把模块参数加在那一行上。找到pam_pwquality.so那一行改成password requisite pam_pwquality.so retry3 minlen6 dcredit0 ucredit0 lcredit0 ocredit0 minclass0 difok0 maxrepeat0 maxclassrepeat0 dictcheck0如果你用的是老系统模块是pam_cracklib.so就把模块名换成对应的password requisite pam_cracklib.so retry3 minlen6 dcredit0 ucredit0 lcredit0 ocredit0 difok0cracklib没有dictcheck参数它内部会直接调用词典检查所以老系统想放行123456可能会有反复。这种情况下最有效的办法是换用pam_pwquality或者在pwquality.conf里把dictcheck关掉同时确保 PAM 行里没有覆盖dictcheck的显式参数。3.3 改完配置后实测验证两个层面配置改完不需要重启机器PAM 配置是每次调用时重新读取的。但“能设置成功”和“能登进去”是两回事所以我建议按下面的顺序验证第一步设置密码passwd # 或者在管理员权限下 sudo passwd testuser输入两次六位纯数字密码如果系统没有再弹BAD PASSWORD说明策略这一关已经放行。但看到passwd: password updated successfully才算真正成功。第二步退出当前登录用刚设置的纯数字密码重新登录一次su - testuser如果是从远程 SSH 测试建议先保持当前的 root 会话不要断开另开一个终端测试新密码登录确认没问题再继续后续操作。第三步我还会顺便看一下/etc/shadow里对应用户的哈希是否更新了grep ^testuser: /etc/shadow只要看到第二个字段不是空的哈希串比如以$6$或$y$开头就说明密码确实写进去了。这一步主要用于排查“系统提示成功但实际没写入”的异常情况。4. 六位纯数字的安全账熵值、破解速度和应用边界4.1 先算一笔概率账密码强度本质上是一个数学问题。六位纯数字每一位有 10 种可能组合总数就是 10 的 6 次方也就是 100 万种。100 万这个数字听起来不小但在密码破解的场景里真的不算多。举个直观例子如果攻击者每秒能尝试 10 次登录理论上最坏情况只需要大约 28 小时就能把所有组合试完如果每秒能尝试 100 次几个小时就够。而本地拿到/etc/shadow哈希后现代普通硬件跑哈希的速度早就超过每秒百万次100 万种组合可能不到一秒就算完了。所以六位纯数字密码本质上只适合安全性要求很低的场景不能拿它硬扛暴力破解更不能把这种配置用在暴露在公网的服务器上。4.2 什么场景下才适合放开六位数字根据我实际接触过的项目比较合理的应用场景有这几类局域网内部测试机物理环境可控没有外人能接触嵌入式开发板、树莓派这类临时设备主要为了方便调试批量初始化设备的临时账号配合“首次登录必须改密”机制使用完全没有联网、只在本机控制台使用的环境。不符合这些前提的场景我不建议放开。尤其是根账号密码、SSH 登录密码、数据库账号密码这些一旦用了六位纯数字风险是非常明确的。4.3 即便要放行也建议保留最后一道保险如果你确实需要在生产环境或者准生产环境暂时放行六位数字密码我建议至少保证一点这个密码只能一次性使用用户下一次登录后必须强制修改。实现方式很简单chage -d 0 用户名执行这条命令后该用户下次登录会被强制要求先设置新密码。这样你既完成了初始密码的下发又不会让弱密码长期留在系统里。这个做法在批量开账号时很实用既能照顾运维习惯也能给安全审计一个交代。5. 放行后容易翻车的细节不生效、图形界面和应急恢复5.1 改了半天还是不生效按优先级排查这几处第一次改这种配置的人十个里有七八个会碰到“我改了但passwd还是拒绝”。按我踩过的坑最常见的原因排序如下第一PAM 堆栈里的显式参数把配置文件顶掉了。比如system-auth里写的是pam_pwquality.so minlen8配置文件里写了minlen 6也没用。解决办法就是直接改 PAM 行把minlen8改成minlen6。第二改错了文件。passwd服务引用的公共堆栈和你跑去改的某个无关配置文件不匹配。所以每次改完我都用grep -R pam_pwquality /etc/pam.d/再扫一遍确认改的位置确实在passwd引用的链路上。第三pam_unix.so后面的obscure参数没有处理。如果你在common-password或system-auth里看到这一行password sufficient pam_unix.so obscure use_authtok sha512 shadow里面的obscure会让pam_unix自己做一轮旧式复杂度检查效果和pam_cracklib的检查部分重合。要彻底放行可以把obscure从这一行去掉。这类问题很隐蔽因为错误提示里不会告诉你具体是哪个模块拦下来的。第四系统里同时有多个公共堆栈。system-auth和password-auth各有一份你只改了一个但登录或改密时走的是另一个。两边都要检查。5.2 命令行可以了图形界面还不行还有一类情况比较烦passwd命令已经能成功设置六位数字密码了但用户到图形登录界面点“修改密码”或者通过系统设置里的“用户”面板去改还是会被拒绝。这通常是因为桌面的“用户”管理走的是账户管理服务它在改密时又套了一层自己的策略判断这个策略依赖/etc/security/pwquality.conf。你前面只改了 PAM 堆栈没改这个配置文件桌面端自然不认。对策很简单桌面端也统一在pwquality.conf里做一遍同样的放行设置两边保持一致。如果实在搞不定桌面这条链路我的建议是干脆让用户统一用命令行passwd修改或者管理员用sudo passwd 用户名直接帮他改。策略上允许放行之后命令行方式是可控且稳定的。5.3 配置改崩了远程无法登录怎么救这是最不希望碰到但必须提前准备的情况。PAM 文件里语法错误、模块参数非法轻则改密失败重则 SSH 登录时直接被拒。我的应急预案只有两条原则第一改文件前保证手里已经打开了一个 root 终端并且这个终端不是靠密码登录的最好是通过密钥登录的 SSH 会话第二备份文件要放在手边一旦发现有问题立刻把备份覆盖回去。如果系统已经被 PAM 问题锁在门外而你还有物理控制台或者带外管理口登录后执行cp /etc/pam.d/system-auth.bak /etc/pam.d/system-auth然后重启相关服务或重新登录即可。没有带外条件的时候整台机器就只能强制重启进入单用户模式恢复成本会高很多所以备份和双会话是绝对不能省的。6. 如果一定要用六位数字这些配套措施能挽回一点安全分6.1 给登录过程加上失败锁定弱密码最怕的是被暴力破解那就给暴力破解加一道闸。比较直接的办法是用失败锁定模块在认证堆栈里加一行类似下面的配置auth required pam_faillock.so preauth silent audit deny5 unlock_time300 auth required pam_faillock.so authfail audit deny5 unlock_time300具体加入的位置和系统认证堆栈有关不同发行版差别很大这里只摆出最核心的思路同一用户连续登录失败 5 次后锁定 5 分钟。这个机制能把在线暴力破解的效率压得非常低。即使不知道完整堆栈配置长什么样用fail2ban这类工具也可以实现类似效果看护 SSH 登录日志并自动封禁来源 IP。6.2 能不用密码登录的服务就不要用密码这句话听起来有点绕但放在这里特别实际。如果你的服务器主要服务是 SSH并且你担心六位数字密码太弱最简单的做法是把 SSH 改成只允许密钥登录PermitRootLogin prohibit-password PubkeyAuthentication yes PasswordAuthentication no这样密码只作为本地控制台的一种备用认证方式外部网络攻击面就大大缩小了。纯数字密码再弱只要它不出现在网络登录流程里风险就可控很多。6.3 我个人的经验放行策略要写进部署脚本不要靠手改最后说一个我自己的习惯。这种“放行六位数字密码”的配置往往不是只改一台机器而是要给一批设备做统一初始化。与其每次手动去改文件不如把改配置、设密码、强制首次改密写成一条命令或者一个部署脚本保持每一台设备的行为一致。脚本大概长这样#!/bin/bash set -e PWQ/etc/security/pwquality.conf cp $PWQ $PWQ.bak cat $PWQ EOF minlen 6 dcredit 0 ucredit 0 lcredit 0 ocredit 0 difok 0 minclass 0 maxrepeat 0 maxclassrepeat 0 dictcheck 0 EOF # 设置初始密码并强制首次登录修改 echo testuser:123456 | chpasswd chage -d 0 testuser注意chpasswd在很多系统上同样会走 PAM 策略检查所以它必须放在pwquality.conf修改完成之后执行。脚本跑完以后我再手动执行一次passwd验证一下确认输出里不再有BAD PASSWORD整套流程才算真正收工。六位纯数字密码这件事关键不在于系统允不允许而在于你要清楚自己正在用它换什么。放行了方便省了复杂度就要提前想好防暴力破解的补丁打在哪个环节上。把这些配套措施都安排明白了再用它我心里才算踏实。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑