1. 项目概述:为什么修改Linux用户密码是核心运维技能
在Linux世界里,用户密码就像是进入自家大门的钥匙。无论是日常使用普通账户,还是进行系统维护需要
root
权限,密码都是身份验证的第一道,也是最重要的一道防线。我见过太多新手,甚至是有些经验的开发者,在遇到密码相关问题时手足无措——可能是新同事入职需要开户,可能是自己太久没登录忘记了密码,也可能是安全审计要求定期更新。
passwd
这个命令看似简单,敲几下键盘就完事,但背后涉及的用户权限、密码策略、配置文件以及各种“坑”,足以写上一整篇。今天,我们就抛开那些泛泛而谈的教程,从一个运维老手的视角,深挖“修改Linux用户密码”这件事。你会发现,这不仅是敲一条命令,更是一套关于系统安全、用户管理和故障恢复的完整知识体系。无论你用的是Ubuntu、CentOS还是其他任何发行版,这些核心原理和实操细节都是相通的。
2. 密码修改的核心机制与
passwd
命令全解
2.1
passwd
命令的工作原理:不止于修改字符串
当你输入
passwd
命令时,系统背后发生了一系列复杂的交互。首先,命令会调用PAM(可插拔认证模块)框架。PAM是Linux身份验证的基石,它是一组共享库,决定了如何认证用户、如何管理密码。
/etc/pam.d/passwd
这个配置文件定义了修改密码时需要经过的“关卡”,比如检查密码强度、历史记录等。
接着,命令会提示你输入当前密码(修改自己密码时)并进行验证。验证通过后,你输入的新密码并不会被直接存储。系统会使用一个“哈希函数”(如SHA-512,具体算法定义在
/etc/login.defs
的
ENCRYPT_METHOD
中)对新密码进行计算,生成一串看似随机的、固定长度的字符,这串字符被称为“哈希值”或“散列值”。这个过程的精妙之处在于:它是单向的。你可以从密码轻松算出哈希值,但几乎不可能从哈希值反推出原始密码。最终,这个哈希值会被写入
/etc/shadow
文件中相应用户名的记录后面。
注意 :
/etc/shadow文件是密码存储的核心,权限为-r-------- root root,只有root用户可读。千万不要去手动编辑这个文件,一个格式错误就可能导致所有用户无法登录。所有操作都应通过passwd、usermod等正规命令完成。
2.2 不同场景下的命令用法详解
根据执行者的身份和目标用户的不同,
passwd
命令的用法和所需权限也不同。
场景一:普通用户修改自己的密码
这是最简单的场景。直接在终端输入
passwd
,回车。
$ passwd
Changing password for user01.
(current) UNIX password: # 首先输入当前密码进行验证
New password: # 输入新密码
Retype new password: # 再次输入新密码确认
passwd: all authentication tokens updated successfully.
系统会要求你先输入旧密码以验证身份,然后才能设置新密码。密码输入时不会显示任何字符(星号也没有),这是正常的安全设计。
场景二:root用户修改任意用户的密码
超级用户
root
拥有最高权限,可以修改任何用户的密码,且无需知道该用户的旧密码。
# passwd user01
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
这里的关键是,
root
用户直接指定目标用户名,然后为其设置新密码。这个过程跳过了旧密码验证环节。
场景三:强制用户下次登录时修改密码 这在创建新用户账号或进行安全重置后非常有用。
# passwd -e user01
Expiring password for user01.
passwd: Success
-e
(expire) 参数会立即使用户
user01
的密码过期。用户下次尝试登录时,系统会强制要求其设置一个新密码后才能进入系统。这个状态体现在
/etc/shadow
文件中该用户密码字段的第一个字符为
!
或
*
。
2.3 密码策略的查看与配置
一个健壮的系统必须有严格的密码策略。相关配置主要分布在两个文件中:
-
/etc/login.defs:定义全局策略。-
PASS_MAX_DAYS 90:密码最大有效天数(90天后过期)。 -
PASS_MIN_DAYS 0:密码修改最小间隔天数(0表示可随时修改)。 -
PASS_MIN_LEN 8:密码最小长度(建议设为12以上)。 -
PASS_WARN_AGE 7:密码过期前多少天开始警告。
-
-
/etc/security/pwquality.conf(或/etc/pam.d/system-auth中的pam_pwquality模块) :定义密码复杂度。-
minlen = 12:最小长度。 -
dcredit = -1:至少包含1位数字。 -
ucredit = -1:至少包含1位大写字母。 -
lcredit = -1:至少包含1位小写字母。 -
ocredit = -1:至少包含1位特殊字符。 -
retry = 3:设置密码时最多可重试次数。
-
你可以使用
chage
命令来查看和修改特定用户的详细密码策略信息:
# chage -l user01 # 查看用户密码策略详情
# chage -M 60 -W 10 user01 # 将user01密码最长有效期设为60天,过期前10天警告
3. 特殊场景与进阶操作实战
3.1 忘记密码的终极解决方案:单用户模式与救援模式
这是运维人员必须掌握的“救命技能”。当用户(包括
root
)完全忘记密码时,我们需要绕过正常的身份验证流程来重置密码。
方法一:GRUB引导进入单用户模式(适用于物理机或拥有控制台的虚拟机)
-
重启系统,在GRUB引导菜单出现时,快速按下
e键进入编辑模式。 -
找到以
linux或linux16开头的那一行。在行尾,quiet参数后面,添加init=/bin/bash或single。实操心得 :不同发行版和内核版本,参数名可能略有不同。
init=/bin/bash更通用,它告诉内核直接启动一个bash shell,跳过所有系统服务。而single是单用户模式的传统参数。 -
按下
Ctrl+X或F10使用修改后的参数启动。系统会直接跳转到一个以root权限运行的shell(无需密码)。 -
此时,根文件系统通常是以只读(
ro)方式挂载的,需要重新挂载为可读写才能修改文件:mount -o remount,rw / -
现在,你可以用
passwd命令自由修改任何用户的密码了:passwd root passwd your_username -
修改完成后,执行
exec /sbin/init或直接重启 (reboot) 以正常启动系统。
方法二:使用Live CD/USB进入救援模式 如果系统GRUB被加密或无法修改,或者文件系统损坏,可以使用系统安装镜像(如Ubuntu Desktop ISO)启动。
- 从Live介质启动,选择“试用Ubuntu”(Try Ubuntu)。
-
打开终端,首先需要找到你的真实系统根分区所在位置:
sudo fdisk -l # 或 lsblk, 查看磁盘分区,识别出系统分区,例如 /dev/sda1 -
挂载系统根分区和必要的虚拟文件系统:
sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /dev/pts /mnt/dev/pts sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys -
使用
chroot切换到原系统的根环境:sudo chroot /mnt -
现在,你就在原系统的环境里了,可以像在单用户模式下一样使用
passwd修改密码。 -
修改完成后,退出
chroot,卸载分区并重启:exit sudo umount /mnt/{sys,proc,dev/pts,dev,} sudo umount /mnt reboot
3.2 非交互式修改密码:脚本与自动化
在自动化部署、批量初始化或Docker容器构建中,我们常常需要在不进行人工交互的情况下设置密码。这时,
passwd
命令的
--stdin
选项(并非所有发行版都默认支持,但主流如RHEL/CentOS/Ubuntu都支持)就派上用场了。
echo "MySuperStrongPass123!" | passwd --stdin user01
这条命令通过管道将新密码传递给
passwd
命令。然而,
将明文密码写在脚本或命令行历史中是极其危险的行为
。密码会留在shell历史记录和进程列表中。
安全的最佳实践是使用加密的密码哈希值 :
-
首先,在一个安全的环境中,用
openssl或python生成一个密码的哈希值:
输出结果类似于:openssl passwd -6 -salt $(openssl rand -base64 6) 'YourPassword' # 或使用更安全的 yescrypt/md5 (根据系统加密方法) python3 -c "import crypt; print(crypt.crypt('YourPassword', crypt.mksalt(crypt.METHOD_SHA512)))"$6$somesalt$HASHED_PASSWORD_STRING。 -
在脚本或自动化工具中,使用
usermod命令直接设置这个哈希值:
这样,脚本里存储的是哈希值而非明文密码,安全得多。但请注意,拥有哈希值虽然不能直接反推密码,但可以通过彩虹表攻击,因此仍需妥善保管脚本。usermod -p '$6$somesalt$HASHED_PASSWORD_STRING' user01
3.3
sudo
密码与
root
密码的辨析
很多新手会混淆
sudo
密码和
root
密码。在Ubuntu等默认禁用
root
登录的发行版中,初始安装后只有一个普通用户,这个用户被加入了
sudo
组。
-
sudo密码 :就是你当前登录的普通用户的密码。当你执行sudo command时,系统验证的是 你本人 的密码,以此授权你临时拥有root权限。修改这个密码,就是用passwd命令(不加用户名)。 -
root密码 :是超级用户root的独立密码。默认情况下,Ubuntu的root账户密码是锁定的(在/etc/shadow中显示为!或*)。你可以通过sudo passwd root来为root账户设置一个密码。设置后,就可以用su -命令并输入root密码切换到root身份了,但这通常不是推荐的做法,因为sudo提供了更细粒度的审计和权限控制。
4. 安全加固、问题排查与经验实录
4.1 密码安全最佳实践与加固
-
启用强密码策略
:如前所述,务必配置
/etc/security/pwquality.conf,强制要求密码长度、复杂度。 -
定期更换密码
:使用
chage命令或配置/etc/login.defs,设置合理的密码最长使用期限(如90天)。 -
禁止密码重用
:在PAM配置中启用
pam_unix模块的remember参数。编辑/etc/pam.d/system-auth或/etc/pam.d/common-password,在相应行添加remember=10,表示系统会记住最近10次密码,不允许重复使用。 -
限制
root远程登录 :编辑SSH服务配置文件/etc/ssh/sshd_config,将PermitRootLogin设置为no或prohibit-password(仅允许密钥登录)。 -
监控
/etc/shadow文件 :使用auditd或文件完整性监控工具,监控对/etc/shadow文件的任何读取或修改尝试。 - 使用密码管理器 :为所有系统账户生成并保存高强度、随机的唯一密码。
4.2 常见问题与故障排查实录
即使是一个简单的密码修改,也可能遇到各种“坑”。下面是我在实际运维中遇到的一些典型问题及解决方案。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
执行
passwd
提示“Authentication token manipulation error”
|
1. 当前密码输入错误。
2.
/etc/shadow
文件权限或属性异常。
3. PAM模块配置错误。 4. 磁盘空间满或文件系统只读。 |
1.
确认密码
:仔细重试,注意大小写和数字。
2. 检查文件 :
ls -l /etc/shadow
,权限应为
-r-------- root root
。如有问题,从备份恢复或用
pwconv
命令尝试修复。
3. 检查PAM :
cat /etc/pam.d/passwd
,看配置是否完整。可暂时注释掉复杂的PAM规则测试。
4. 检查磁盘 :
df -h
查看空间,
mount
查看挂载模式。
|
| 新密码符合要求,但系统提示“BAD PASSWORD: ...” |
密码复杂度规则(
pwquality
)检查未通过。
|
1.
查看规则
:
cat /etc/security/pwquality.conf
或
grep pam_pwquality /etc/pam.d/*
。
2. 按规则设置 :确保密码包含足够种类字符(大小写、数字、特殊符号)且长度达标。 3. 临时绕过(不推荐) :对于紧急情况,root用户可先用简单密码设置,再立即用
passwd
命令改为复杂密码。
|
| 修改密码后,SSH或sudo仍然提示密码错误 |
1. 修改的不是当前登录会话使用的密码(例如,有多个同名用户)。
2. 使用了
usermod -p
设置的是明文而非哈希值。
3. 账户被锁定。 |
1.
确认用户
:
whoami
和
id
确认当前用户,
cat /etc/passwd
查看用户ID(UID)是否唯一。
2. 检查shadow :
sudo grep username /etc/shadow
,看密码字段是否是一串哈希值(以
$id$
开头)。如果是明文,用
passwd
命令重设。
3. 检查锁定 :密码字段前有
!
或
*
表示锁定。用
passwd -u username
解锁,或用
usermod -U username
。
|
| 批量修改密码后,部分用户登录失败 | 脚本中密码哈希值生成方式与系统加密方法不匹配。 |
1.
确认加密方法
:
grep ENCRYPT_METHOD /etc/login.defs
。
2. 统一生成方式 :在目标系统上使用
mkpasswd
或
openssl passwd -6
生成哈希值,确保算法一致(SHA-512, yescrypt等)。
3. 测试单个用户 :先在一个测试用户上验证整个流程。 |
4.3 一次生产环境故障复盘:
/etc/shadow
文件损坏
这是我早期职业生涯中印象深刻的一次事故。在一次批量用户管理操作后,突然接到报告所有用户无法登录,包括
root
。现场排查发现,
passwd
命令报错“Authentication token manipulation error”,
sudo
也无法使用。
排查过程 :
-
首先尝试从单用户模式重置
root密码,成功进入。 -
检查
/etc/shadow,发现文件大小异常,且最后几行格式混乱,明显是脚本错误写入导致的损坏。 -
幸运的是,我们有定时的系统配置文件备份。从备份中恢复了
/etc/shadow文件。 - 重启系统,服务恢复正常。
经验教训与后续加固 :
-
永远不要直接编辑
/etc/shadow和/etc/passwd:任何修改都必须通过vipw、vigr(这些命令会进行锁和语法检查)或标准的useradd、usermod、passwd命令。 -
操作前先备份
:在执行任何批量用户操作前,手动备份关键文件:
cp -p /etc/passwd /etc/passwd.bak && cp -p /etc/shadow /etc/shadow.bak。 - 使用版本控制 :将用户管理脚本纳入Git等版本控制系统,任何修改都有迹可循。
- 在测试环境验证 :批量脚本必须在与生产环境一致的测试环境中充分验证后才能上线。
密码管理是系统安全的基石,它琐碎但至关重要。从一条简单的
passwd
命令延伸出去,涉及到系统认证架构、安全策略、应急恢复和自动化运维等多个层面。理解其背后的原理,掌握各种场景下的正确操作方法,并时刻保持对安全性的警惕,是一名合格的Linux系统管理员或开发者必备的素养。希望这篇从实战出发的深度解析,能让你下次再面对“修改密码”这个任务时,心中更有底气,手上更有章法。
327



被折叠的 条评论
为什么被折叠?



