在Linux系统中,尤其是像CentOS这样注重安全性的企业级发行版,用户密码的管理遵循着严格的安全原则,一个核心且必须明确的概念是:出于安全考虑,系统管理员或任何用户都无法直接“查看”其他用户的明文密码,密码并非以可读的形式存储在任何文件中,本文将深入探讨CentOS中密码的存储机制,并介绍如何进行有效的密码管理,包括重置密码、检查密码状态等实际操作。

密码的存储机制:/etc/passwd 与 /etc/shadow
要理解为什么无法直接查看密码,首先需要了解两个至关重要的文件:/etc/passwd 和 /etc/shadow。
/etc/passwd 文件
这是一个基础的用户信息文件,任何用户都可以读取,它包含了系统上每个账户的基本信息,每行代表一个用户,字段之间用冒号分隔,其格式如下:
用户名:密码占位符:用户ID (UID):组ID (GID):用户注释信息:家目录:默认Shell
在早期的Unix系统中,第二个字段直接存储加密后的密码,但由于/etc/passwd需要全局可读,这带来了巨大的安全风险,现代Linux系统(包括CentOS)采用了“shadow”机制。/etc/passwd文件的密码字段统一用一个x来代替,这个x是一个指针,告诉我们真正的密码信息存储在另一个文件中。
/etc/shadow 文件
这才是真正存储密码信息的“宝库”,但它受到严格的权限保护,默认只有root用户可以读取,其权限通常是(600),属主和属组都是root,这种设计从根本上杜绝了普通用户窥探密码哈希值的可能性。
/etc/shadow文件的格式同样以冒号分隔字段,但更为复杂:
用户名:加密后的密码:最后一次修改日期:最小修改间隔:最大有效期:警告期:宽限期:失效日期:保留字段

第二个字段“加密后的密码”就是我们关注的焦点,它并非明文密码,而是经过哈希算法处理后的字符串,哈希是一种单向函数,意味着可以从原始密码计算出哈希值,但无法从哈希值反推出原始密码,这就好比把鸡蛋打碎,你无法将其复原。
这个哈希字段的格式通常为 $id$salt$hashed,
$id$:标识所使用的哈希算法。$1$代表MD5,$5$代表SHA-256,$6$代表SHA-512,现代CentOS系统默认使用安全性更高的SHA-512。$salt$:盐值,一串随机字符,在计算哈希前,系统会将这个盐值与用户的原始密码结合,这样做可以有效抵御“彩虹表攻击”,即使两个用户设置了相同的密码,由于盐值不同,其最终的哈希字符串也完全不同。$hashed:将原始密码和盐值结合后,通过指定哈希算法计算出的最终结果。
管理员操作:重置用户密码
既然无法查看,管理员最常做的操作就是重置密码,这可以通过passwd命令轻松完成。
要为其他用户重置密码,必须拥有root权限,命令格式如下:
sudo passwd [用户名]
要重置用户testuser的密码,可以执行:
sudo passwd testuser
系统会提示你输入新的密码,并再次确认,输入时,屏幕上不会显示任何字符,这是正常的安全措施。
更改用户 testuser 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。 如果管理员只是想修改自己的密码,直接在终端输入passwd即可,无需sudo和用户名。
检查用户密码状态
除了重置密码,管理员还常常需要了解用户密码的时效性策略,例如密码何时过期、账户何时锁定等。chage命令是完成此任务的利器。
使用-l参数可以列出指定用户的详细密码时效信息:

sudo chage -l testuser
输出结果通常会包含以下信息,清晰地展示了密码的生命周期:
| 信息项 | 描述 |
|---|---|
| 最近一次密码修改时间 | 显示密码上次被更改的具体日期 |
| 密码过期时间 | 密码将在此日期后失效,必须更改 |
| 密码失效时间 | 密码过期后,如果用户仍未修改,账户在此日期后将被锁定 |
| 帐户过期时间 | 账户本身在此日期后将无法使用,无论密码状态如何 |
| 两次修改密码之间间隔的最少天数 | 用户在修改密码后,必须等待多少天才能再次修改 |
| 两次修改密码之间间隔的最多天数 | 密码的有效期,超过此天数必须修改 |
| 在密码过期之前警告的天数 | 在密码即将到期时,系统提前多少天开始警告用户 |
通过这些信息,管理员可以有效地实施和审查密码策略,确保系统安全。
相关问答FAQs
问题1:我忘记了root密码,无法进入系统,该怎么办?
解答: 忘记root密码是一个严重但可以解决的问题,你需要通过重启系统进入“单用户模式”或“救援模式”来重置它,基本步骤如下:
- 重启服务器,在GRUB引导菜单出现时,按下
e键进入编辑模式。 - 找到以
linux或linux16或linuxefi开头的那一行,使用方向键移动到该行末尾。 - 添加启动参数,对于较新的CentOS版本(如7/8/9),在行尾添加
rd.break,对于较老版本,可能需要添加init=/bin/bash或single。 - 按下
Ctrl + X启动系统,系统会进入一个临时的shell环境。 - 重新挂载根文件系统为可读写模式:
mount -o remount,rw /sysroot。 - 切换到原始系统环境:
chroot /sysroot。 - 现在你可以重置root密码了:
passwd root,按照提示输入新密码。 - 确保SELinux上下文正确(非常重要!):
touch /.autorelabel,这会在下次重启时自动重新标记所有文件,避免因SELinux导致无法登录。 - 退出并重启:输入
exit两次,系统将自动重启,重启后,你就可以用新设置的root密码登录了。
问题2:如何强制一个用户在下次登录时必须修改自己的密码?
解答: 这是一个常见的管理需求,例如在为新员工创建临时密码后,可以使用passwd命令的-e(–expire)选项,或者chage命令的-d 0选项来实现。
- 使用
passwd命令:sudo passwd -e testuser
这个命令会立即将
testuser的密码标记为已过期,用户在下次登录时会被强制要求设置新密码后才能进入系统。 - 使用
chage命令:sudo chage -d 0 testuser
-d 0表示将密码的“最后一次修改日期”设置为1970年1月1日(Unix纪元),这同样会使密码立即处于过期状态,达到强制用户下次登录修改密码的目的,两个命令效果相同,chage提供了更灵活的日期控制。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复