0

0

Linux如何设置用户密码复杂度要求

P粉602998670

P粉602998670

发布时间:2025-09-05 13:37:01

|

668人浏览过

|

来源于php中文网

原创

答案:通过配置PAM模块pam_pwquality.so及/etc/security/pwquality.conf文件设置密码复杂度,如最小长度、字符类型、差异性等,并结合密码过期策略与用户教育,确保新密码符合安全要求,且在用户下次修改密码时生效。

linux如何设置用户密码复杂度要求

在Linux系统上设置用户密码的复杂度要求,核心在于配置可插拔认证模块(PAM),特别是通过

pam_pwquality.so
模块及其配置文件
/etc/security/pwquality.conf
来定义密码强度规则。这不仅仅是技术配置,更是系统安全策略落地的重要一环,确保用户密码不易被猜测或暴力破解。

解决方案

要为Linux系统设置用户密码复杂度要求,主要步骤是编辑

/etc/security/pwquality.conf
文件,并确保PAM模块正确加载
pam_pwquality.so

首先,定位并编辑

/etc/security/pwquality.conf
。这个文件定义了各种密码质量参数。如果你的系统没有这个文件,可能需要安装
libpwquality
cracklib
相关的包(例如在Debian/Ubuntu上是
libpam-pwquality
,在RHEL/CentOS上是
libpwquality
)。

以下是一些常用参数及其作用,以及一个示例配置:

  • minlen
    : 密码的最小长度。
  • dcredit
    : 密码中至少包含的数字字符数量(负数表示必须包含,例如
    -1
    表示至少一个)。
  • ucredit
    : 密码中至少包含的大写字母数量(负数表示必须包含)。
  • lcredit
    : 密码中至少包含的小写字母数量(负数表示必须包含)。
  • ocredit
    : 密码中至少包含的特殊字符数量(负数表示必须包含)。
  • difok
    : 新密码与旧密码之间必须不同的字符数量。
  • maxrepeat
    : 允许连续重复的字符最大数量。
  • maxclassrepeat
    : 允许连续重复的字符类别最大数量(例如“aaa”是同一类别重复)。
  • gecoscheck
    : 是否检查密码与用户GECOS信息(全名、电话等)的相似性。
  • badwords
    : 一个文件路径,包含禁止使用的字典词汇。
  • enforce_for_root
    : 是否对root用户也强制执行这些规则。

示例

/etc/security/pwquality.conf
配置:

# 设置密码最小长度为12
minlen = 12
# 必须包含至少一个数字
dcredit = -1
# 必须包含至少一个大写字母
ucredit = -1
# 必须包含至少一个小写字母
lcredit = -1
# 必须包含至少一个特殊字符
ocredit = -1
# 新密码与旧密码至少有7个字符不同
difok = 7
# 连续重复字符不能超过3个
maxrepeat = 3
# 连续重复字符类别不能超过3个
maxclassrepeat = 3
# 检查密码是否与GECOS信息相似
gecoscheck = 1
# 指定一个包含禁用词汇的文件 (如果需要)
# badwords = /etc/security/badwords.txt
# 对root用户也强制执行密码复杂度规则
enforce_for_root = 1

配置好

pwquality.conf
后,下一步是确保PAM模块加载了
pam_pwquality.so
。这通常在
/etc/pam.d/common-password
(或类似文件,具体取决于你的发行版)中完成。

找到以下行(或添加它,如果不存在):

password    requisite     pam_pwquality.so retry=3

这行应该放在其他

password
模块之前,特别是那些用于哈希密码的模块(如
pam_unix.so
)。
requisite
表示如果此模块失败,则认证立即失败。
retry=3
表示在用户输入错误密码后,系统会提示重试3次。

完成这些配置后,保存文件。新的密码复杂度要求将在用户下次尝试更改密码时生效。

Linux密码策略配置最佳实践有哪些?

在Linux系统上制定密码策略,不仅仅是机械地设置几个参数,更是一门平衡艺术:在安全性与用户便利性之间找到一个合适的点。我个人经验告诉我,过于严苛的策略往往会导致用户将密码写在便利贴上,反而适得其反。

首先,最小长度是基石。我通常建议将

minlen
设置为至少12到14个字符。这听起来有点长,但现代的破解技术进步太快,短密码已经不再安全。12个字符的长度,加上多样化的字符类型,能大大增加破解难度。

其次,字符多样性至关重要。强制要求包含大小写字母、数字和特殊字符(

dcredit
,
ucredit
,
lcredit
,
ocredit
设置为
-1
),这是构建强密码的关键。我发现,仅仅要求包含这些类型,就能让用户思考如何组合,而不是只用简单的单词加数字。

再来,避免重复和模式化

maxrepeat
maxclassrepeat
参数可以有效防止“aaaaa”或“111222”这类易猜的密码。同时,
difok
参数确保新密码与旧密码有足够的差异,防止用户只是在旧密码基础上做微小改动。

禁用常用词汇和个人信息也很重要。

gecoscheck
是一个很好的功能,可以防止用户将自己的名字、生日等作为密码。更进一步,如果你的组织有明确的禁用词汇列表(比如公司名、产品名),可以利用
badwords
参数指向一个包含这些词汇的文件。这需要一些维护,但对提升安全性很有帮助。

Shopxp购物系统Html版
Shopxp购物系统Html版

一个经过完善设计的经典网上购物系统,适用于各种服务器环境的高效网上购物系统解决方案,shopxp购物系统Html版是我们首次推出的免费购物系统源码,完整可用。我们的系统是免费的不需要购买,该系统经过全面测试完整可用,如果碰到问题,先检查一下本地的配置或到官方网站提交问题求助。 网站管理地址:http://你的网址/admin/login.asp 用户名:admin 密 码:admin 提示:如果您

下载

最后,别忘了密码过期策略。虽然

pam_pwquality
处理的是密码强度,但密码的定期更换也是安全策略的重要组成部分。这通常通过
/etc/login.defs
中的
PASS_MAX_DAYS
PASS_MIN_DAYS
,以及
chage
命令来管理。我一般建议90天到180天更换一次,太频繁了用户会抱怨,太久了风险又高。

如何验证Linux系统上的密码复杂度设置是否生效?

配置完密码复杂度规则后,最关键的一步就是验证它们是否真正生效。毕竟,配置文件写得再好,如果没被系统正确加载或执行,那都是空谈。

最直接的验证方法,就是尝试修改一个用户的密码。你可以创建一个测试用户,或者用一个不重要的现有用户来测试。

sudo passwd testuser

当你被提示输入新密码时,尝试输入一些不符合你设置规则的密码。例如,如果你的

minlen
是12,就尝试输入一个8位数的密码;如果要求大小写、数字、特殊字符都包含,就尝试只输入小写字母。系统应该会拒绝这些弱密码,并给出类似“BAD PASSWORD: The password fails the dictionary check - too short”或“BAD PASSWORD: The password is too similar to the old one”的错误提示。如果系统允许你设置一个明显不符合规则的密码,那么说明你的配置可能没有正确加载。

另一个有用的工具

pwscore
命令,它通常是
libpwquality-tools
包的一部分。这个命令可以评估一个密码的强度得分,并与
pwquality.conf
中定义的规则进行比较。

pwscore "你的测试密码"

例如,如果你运行

pwscore "short"
,它可能会返回一个负数或很低的分数,并指出具体的原因,如“password too short”。这能让你在不实际更改密码的情况下,快速验证特定密码是否符合要求。

此外,检查PAM配置文件的加载顺序也很重要。你可以查看

/etc/pam.d/
目录下,哪些文件包含了
pam_pwquality.so
。例如,
login
passwd
sshd
等服务通常会引用
common-password
,所以确保
common-password
pam_pwquality.so
的配置是正确的。如果你的系统使用了SELinux,有时SELinux策略也可能影响到PAM模块的加载或行为,虽然这种情况比较少见,但值得留意。

修改密码复杂度后,对现有用户有什么影响?

这是一个非常实际的问题,也是我在实际操作中经常被问到的。好消息是,修改

pam_pwquality.conf
和PAM配置文件,不会立即强制所有现有用户更改他们的密码。这些新的复杂度要求只会在用户下次尝试更改密码时才生效。

这意味着,如果一个用户在新的策略生效之前设置了一个弱密码,那么这个弱密码会继续有效,直到该用户主动或被动(例如,密码过期)地尝试更改它。当他们下次更改密码时,系统就会强制他们遵循新的、更严格的复杂度规则。

这种“懒惰”的生效方式,虽然避免了对生产环境的即时冲击,但也带来了一些潜在的安全隐患:那些不符合新策略的弱密码可能会在系统中继续存在一段时间。

为了解决这个问题,通常有几种策略:

  1. 设置密码过期策略: 这是最常见的做法。通过
    chage
    命令或修改
    /etc/login.defs
    ,可以为所有用户或特定用户设置密码过期时间。例如,
    chage -M 90 
    会强制用户在90天内更改密码。当他们更改时,就会被新规则约束。对于已经设置了弱密码的用户,可以考虑缩短他们的过期时间,促使他们尽快更新。
  2. 用户通知与教育: 告知用户新的密码策略,解释其重要性,并提供一些创建强密码的建议。有时,用户只是不知道如何创建既复杂又容易记住的密码。
  3. 对高风险账户进行强制重置: 对于特权账户(如管理员、数据库账户等),可以考虑在业务低峰期进行一次强制密码重置,确保这些关键账户能尽快符合新策略。当然,这需要周密的计划和沟通。
  4. enforce_for_root
    的考量:
    别忘了
    pwquality.conf
    中的
    enforce_for_root
    参数。如果设置为
    1
    ,那么root用户在更改密码时也必须遵守这些规则。这很重要,因为root账户是系统的最高权限,其密码强度至关重要。

总的来说,修改密码复杂度是一个渐进的过程。你需要平衡安全性提升与用户体验,通过合理的策略和沟通,平稳地将系统过渡到更安全的密码环境。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

352

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2076

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

348

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

411

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

406

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

221

2023.10.19

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

8

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号