当前位置: 首页 > news >正文

Linux 检查口令策略设置是否符合复杂度要求

废话

有没有同学配置过Linux下的密码复杂度策略?

肯定有配置过的,这个配置是不是不算复杂?

其实倒不算复杂,但是,如果让你去检查一台Linux中是否配置了“口令复杂度策略”呢?

细心的同学,可能已经发现了“坑”;很可能会反问一句:

请问你说的Linux是什么发型版本?也就是说你说的Linux是redhat呢?还是Ubuntu呢?是redhat9呢?还是redhat5呢?

操作系统跟我们开发的应用系统一样,同样存在迭代生命周期!相同的功能特性,在不同的版本中是存在代际差异的!甚至于出现推翻重来的地方。

幸好~~Linux下的密码复杂度配置是通过PAM(Pluggable Authentication Modules,可插拔认证模块)。插件嘛~~就是谁用谁集成了,所以通用性很高。但是,不同的Linux发行版在使用PAM的时候也存在偏好。

就“密码复杂度策略”,大致上存在“pam_passwdqc、pam_cracklib、pam_pwquality”这三种model,然后它们三个从左至右,大抵上有一个继承取代的关系:

pam_cracklib最老,pam_passwdqc次之,后被pam_pwquality逐渐取代,目前的主流。

目前,老而弥坚的pam_cracklib和pam_pwquality仍然活跃在大量Linux发行版中。pam_passwdqc可能是因为配置稍显复杂,以及pam_cracklib的使用惯性,没有普及开来。pam_pwquality是在pam_cracklib的基础上发展而来的,它不仅兼容 pam_cracklib 的选项,还提供了更多检查选项,如对连续相同字符、单调字符序列、包含用户名或 GECOS 信息等的检查。从 Red Hat Enterprise Linux 7 开始,pam_pwquality 成为了默认的密码复杂度检查模块。

pam_pwquality这玩意一开始的时候,和pam_cracklib同时存在于CentoS、Redhat7上,6及以前只有pam_cracklib,但是7及以前默认的密码复杂度检查模块是pam_cracklib;pam_pwquality在Redhat7上时,功能还在迭代,有些功能并不完善比如:早期版本通过pwquality.conf配置enforce_for_root无效。但是,随着pam_pwquality越来越完善和稳定,则建议使用pam_pwquality,在pwquality.conf中进行密码复杂度配置。毕竟key-value的配置方式更加简单易懂,维护也方便。比PAM配置要好很多(不同Linux的PAM配置文件都不一样)。

需要说明的是,pwquality.conf中的配置优先级要低于PAM配置(除非PAM上没有配)。如下是通过AI总结的各个模块的详细介绍和配置举例。比咱自己写的条理很多,哈哈~~

密码复杂度相关model介绍

1. pam_cracklib

  • 功能:通过与系统字典和规则集对照来检查密码强度,防止用户设置弱密码,如包含字典单词、与旧密码相似度过高、过短等。

  • 适用场景:适用于需要对密码进行基础强度检查的 Linux 系统,尤其在使用传统 UNIX 密码加密方式时较为常用,但也可与 md5 加密结合使用。

  • 特点

    • 能检查密码是否为字典单词。

    • 提供多种规则检查,如是否为回文、是否只是旧密码改变大小写、与旧密码相似度、密码长度等。

    • 可通过参数灵活配置检查规则,如允许的最小长度、字符种类限制等。

    • 对于 root 用户默认不强制限制,可通过参数修改。

  • 配置举例

    • 要求密码长度至少为 8,必须包含数字、大写字母、小写字母和特殊字符各至少 1 个,且与旧密码至少有 3 个字符不同,强制对root账号生效(早期版本enforce_for_root配置无效)

      password requisite pam_cracklib.so retry=3 minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 difok=3 enforce_for_root
    • 适用于 md5 加密,要求密码至少 14 个字符,额外为数字和特殊字符各增加 2 个长度信用:

      password required pam_cracklib.so difok=3 minlen=15 dcredit=2 ocredit=2
      password required pam_unix.so use_authtok nullok md5

2. pam_pwquality

  • 功能:对密码进行质量检查,与 pam_cracklib 类似,但在功能上更强大、配置更灵活,支持更多检查选项,并且与 pwquality.conf 配置文件结合使用,便于统一管理密码策略。

  • 适用场景:适用于对密码复杂度有较高要求的 Linux 系统,尤其在使用较新的密码加密方式时,如 sha256、sha512 等,能更好地满足现代密码安全需求。

  • 特点

    • 兼容 pam_cracklib 的选项。

    • 提供更多检查选项,如对连续相同字符、单调字符序列、包含用户名或 GECOS 信息等的检查。

    • 可通过 pwquality.conf 配置文件集中管理密码策略,方便统一修改和维护。

    • 可选择是否对 root 用户强制执行密码策略。

  • 配置举例

    • 在 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 中配置

      password requisite pam_pwquality.so retry=3 minlen=10 minclass=3 enforce_for_root
    • 在 /etc/security/pwquality.conf 中配置

      minlen = 10
      minclass = 3
      enforce_for_root
    • 要求密码至少包含 1 个数字、1 个大写字母和 1 个特殊字符,长度至少为 8

      password requisite pam_pwquality.so dcredit=-1 ucredit=-1 ocredit=-1 lcredit=0 minlen=8

3. pam_passwdqc

  • 功能:提供密码强度检查,支持对常规密码和短语密码的检查,并且可以生成随机密码,为用户设置密码提供更多选择和安全保障。

  • 适用场景:适用于对密码类型有多种需求的场景,如允许用户使用短语密码或需要系统提供随机密码的场景,同时也适用于对密码长度和复杂度有明确分级要求的环境。

  • 特点

    • 支持短语密码,允许用户使用由多个单词组成的密码,并可设置短语密码的最小单词数。

    • 可生成随机密码,并可设置随机密码的位数范围。

    • 对不同种类的密码(如纯单类字符密码、多类字符密码、短语密码等)分别设置不同的最小长度要求。

    • 可检查新密码与旧密码的相似性,防止用户简单修改旧密码后继续使用。

    • 可配置是否对 root 用户强制执行密码策略。

  • 配置举例

    • 要求短语密码至少 3 个单词,常规密码根据不同复杂度设置不同最小长度,且禁止与旧密码相似:(如果对如下配置参数感到陌生,参看下一章节“4 pam_passwdqc帮助文档翻译”)

      password requisite pam_passwdqc.so min=disabled,disabled,12,8,8 max=40 passphrase=3 match=4 similar=deny enforce=everyone retry=3
    • 要求密码至少 14 个字符,并且提供 64 位的随机密码选项

      password requisite pam_passwdqc.so min=disabled,disabled,14,14,14 max=40 random=64

pam_passwdqc帮助文档翻译

可以传递以下选项给模块:

min=N0,N1,N2,N3,N4不同种类的密码/短语密码允许的最小长度。可以用disabled禁用某类密码。后续数值不大于前一个。

  • N0用于仅包含一种字符类的密码。字符类包括:数字、小写字母、大写字母和其他字符,非ASCII字符视为特殊类(非数字)。

  • N1用于包含两种字符类且不符合短语密码要求的密码。

  • N2用于短语密码,要满足单词数要求(见passphrase选项)。

  • N3N4用于包含三种和四种字符类的密码。

计算字符类时,首字母大写和末尾数字不计入字符类。密码需足够长且字符类足够多,满足检查的最小长度。

max=N密码最大长度(默认40),防止密码过长影响系统服务。若设为8,超过8字符的密码会被截断为8字符进行强度检查并警告用户,适用于传统DES密码哈希。

passphrase=N短语密码所需单词数(默认3),0则禁用用户选择的短语密码。

match=N判断密码与字符串部分基于信息的公共子串长度(默认4),0则禁用子串搜索。找到弱子串后,密码仍需满足强度要求(去除弱子串后)。

similar=permit|deny是否允许新密码与旧密码相似(默认deny)。有足够长的公共子串且去除后密码弱,则视为相似。

random=N[,only]随机生成的短语密码位数(24至72位,默认42),0则禁用。only修饰符可禁止用户自选密码。

enforce=none|users|everyone模块配置为仅警告弱密码或强制使用强密码。none仅警告,users对非root用户强制,everyone对所有用户强制(默认)。

non-unix默认pam_passwdqcgetpwnam(3)获取用户信息用于密码强度检查,此选项可禁用该行为。

retry=N用户首次输入密码强度不足且两次输入不一致时,模块再次询问新密码的次数(默认3)。

ask_oldauthtok[=update]要求用户提供额外输入旧密码。通常后续模块负责此任务。无参数时,在预检查阶段询问旧密码;update参数时,在更新阶段询问。

check_oldauthtok要求模块在提示新密码前验证旧密码。通常由后续模块完成。主要用于与ask_oldauthtok=update配合,此时其他模块无法询问和验证密码,仅适用于UNIX密码。

disable_firstupper_lastdigit_check计算密码字符类时,包含首字母大写和末尾数字。

use_first_passuse_authtok使用堆栈中前面模块获取的新密码,禁用pam_passwdqc内的用户交互。两者区别在于,前者与ask_oldauthtok不兼容。

oldpass_prompt_filenewpass_prompt_file=绝对文件路径可覆盖请求旧密码和新密码时的提示。提示文件最大4096字符,超长将截断。

http://www.xdnf.cn/news/234829.html

相关文章:

  • 《FastAPI零基础入门与进阶实战》第10篇:Token验证
  • echarts
  • Python-pandas-操作csv文件(读取数据/写入数据)及csv语法详细分享
  • MiWi|Microchip开发的专有无线通信协议,适用于低功耗、短距离的无线个人局域网【无线通信小百科】
  • 简单表管理
  • SV 仿真的常识
  • 从有线到无线:冶炼工厂的高效转型
  • C盘哪些文件删除之后无影响,可以清理磁盘空间。
  • Web应用开发指南
  • PostgreSQL中的SSL(2)
  • Missashe考研日记-day31
  • UNet 改进(21):可变形卷积UNet架构
  • Java 实现 SM4 加密解密
  • SpringAI实现AI应用-搭建知识库
  • GPU集群搭建
  • BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来
  • Compose笔记(二十)--TextField
  • (31)VTK C++开发示例 ---绘制立方体
  • 第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
  • C++好用的打印日志类
  • 2025.4.24 JavaScript 基础学习笔记
  • [特殊字符] 蓝桥杯省赛全解析:含金量、获奖难度、参赛意义与发展价值全面剖析
  • 精华贴分享|【零敲碎打12】类筹码数据构建-散户行为倾向
  • react初学踏坑记录-if(number)到底过滤了什么
  • leetcode0075. 颜色分类-medium
  • 数学:拉马努金如何想出计算圆周率的公式?
  • 大连理工大学选修课——机器学习笔记(3):KNN原理及应用
  • 【中间件】bthread效率为什么高?
  • 12.Three.js 中的 DirectionalLight(平行光)详解指南
  • Python第四周作业