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
-
4 pam_passwdqc帮助文档翻译
可以传递以下选项给模块:
min=N0,N1,N2,N3,N4
:不同种类的密码/短语密码允许的最小长度。可以用disabled
禁用某类密码。后续数值不大于前一个。
-
N0
:用于仅包含一种字符类的密码。字符类包括:数字、小写字母、大写字母和其他字符,非ASCII字符视为特殊类(非数字)。 -
N1
:用于包含两种字符类且不符合短语密码要求的密码。 -
N2
:用于短语密码,要满足单词数要求(见passphrase
选项)。 -
N3
和N4
:用于包含三种和四种字符类的密码。
计算字符类时,首字母大写和末尾数字不计入字符类。密码需足够长且字符类足够多,满足检查的最小长度。
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_passwdqc
用getpwnam(3)
获取用户信息用于密码强度检查,此选项可禁用该行为。
retry=N
:用户首次输入密码强度不足且两次输入不一致时,模块再次询问新密码的次数(默认3)。
ask_oldauthtok[=update]
:要求用户提供额外输入旧密码。通常后续模块负责此任务。无参数时,在预检查阶段询问旧密码;update
参数时,在更新阶段询问。
check_oldauthtok
:要求模块在提示新密码前验证旧密码。通常由后续模块完成。主要用于与ask_oldauthtok=update
配合,此时其他模块无法询问和验证密码,仅适用于UNIX密码。
disable_firstupper_lastdigit_check
:计算密码字符类时,包含首字母大写和末尾数字。
use_first_pass
、use_authtok
:使用堆栈中前面模块获取的新密码,禁用pam_passwdqc
内的用户交互。两者区别在于,前者与ask_oldauthtok
不兼容。
oldpass_prompt_file
、newpass_prompt_file=绝对文件路径
:可覆盖请求旧密码和新密码时的提示。提示文件最大4096字符,超长将截断。