news 2026/1/13 13:24:22

Linux密码管理深度解析:passwd与chpasswd的底层机制对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux密码管理深度解析:passwd与chpasswd的底层机制对比

摘要

本文从Linux安全专家视角,深入剖析passwdchpasswd命令在密码设置中的底层原理差异,涵盖PAM模块调用机制、密码存储格式、安全考量及实际操作实例,为系统管理员提供全面的技术参考。


1. 核心概览:两种密码管理工具的本质区别

特性passwd命令chpasswd命令
设计目的交互式密码更改批量密码设置
用户交互需要用户交互(输入密码)非交互式(从文件/管道读取)
PAM调用完全集成PAM默认不调用PAM
典型使用场景用户自主改密、管理员单用户改密批量用户初始化、自动化脚本
权限要求普通用户可改自己密码,root可改任何密码通常需要root权限

2. 底层架构深度解析

2.1 passwd:完整的PAM认证流程

// 简化版passwd工作流程passwd_main(){// 1. 身份验证阶段pam_start("passwd",username,&pam_conv,&pamh);pam_authenticate(pamh,0);// 验证当前用户身份// 2. 密码策略校验(通过PAM)pam_chauthtok(pamh,0);// 调用PAM密码更改模块// 3. 密码更新(最终由PAM模块写入shadow)pam_end(pamh,exit_status);}

关键PAM配置文件

/etc/pam.d/passwd# passwd的PAM配置

典型配置内容:

#%PAM-1.0 auth include system-auth account include system-auth password substack system-auth -password optional pam_gnome_keyring.so

2.2 chpasswd:直接操作shadow文件

// chpasswd核心逻辑(简化)chpasswd_main(){// 1. 读取用户名:密码对while(read_line(&username,&password)){// 2. 直接加密密码(不经过PAM策略检查)char*encrypted=crypt(password,salt);// 3. 直接写入/etc/shadow文件update_shadow_file(username,encrypted);}}

关键特性

  • 绕过PAM密码复杂度策略
  • 直接调用crypt(3)函数加密
  • 以root权限直接修改/etc/shadow

3. PAM模块调用机制对比

3.1 passwd的PAM调用栈

┌─────────────────────────────────────────┐ │ passwd命令 │ ├─────────────────────────────────────────┤ │ 1. pam_authenticate() │ │ ├─pam_unix.so (验证当前密码) │ │ └─pam_tally2.so (失败计数) │ │ │ │ 2. pam_chauthtok() │ │ ├─pam_pwquality.so (密码质量检查) │ │ ├─pam_unix.so (密码加密和存储) │ │ ├─pam_cracklib.so (字典检查) │ │ └─pam_pwhistory.so (密码历史检查) │ └─────────────────────────────────────────┘

3.2 chpasswd的PAM回避机制

# 查看chpasswd是否使用PAM$ ldd /usr/sbin/chpasswd|greppam# 通常无输出,表明不链接PAM库# 验证方法:strace追踪系统调用$strace-e openat chpasswd<<<"testuser:Test@123"2>&1|greppam# 无PAM相关文件访问

4. 密码存储格式与加密算法

两种命令最终都写入/etc/shadow,格式相同:

username:$y$j9T$salt$encrypted:18459:0:99999:7:::

但加密过程有差异:

4.1 passwd的加密流程

# PAM控制加密算法(/etc/pam.d/system-auth)password sufficient pam_unix.so sha512 shadow nullok try_first_pass

4.2 chpasswd的加密控制

# 指定加密算法(-c参数)$echo"user:password"|chpasswd -c SHA512# 使用已有加密值(-e参数)$echo"user:$6$salt$encrypted"|chpasswd -e

5. 安全审计与监控差异

5.1 passwd的安全审计记录

# 查看passwd操作的审计日志$ ausearch -m USER_CHAUTHTOK -cpasswdtime->Tue Jan1510:30:002024type=USER_CHAUTHTOKmsg=audit(1705300200.123:456):pid=1234uid=0auid=1000ses=1msg='op=password acct="testuser" exe="/usr/bin/passwd" hostname=? addr=? terminal=pts/0 res=success'

5.2 chpasswd的审计缺陷

# chpasswd可能只记录简单命令执行$grepchpasswd /var/log/secure Jan1510:35:01 server chpasswd[5678]: password changedforuser1# 但不会记录密码策略违反情况!

6. 实际应用场景与操作示例

6.1 passwd命令实战

场景1:用户自主修改密码

$passwdChanging passwordforcurrent user.(current)UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

场景2:管理员强制重置密码

# 不需要知道原密码$sudopasswdusername New password: Retype new password:# 非交互式(某些发行版支持)$echo"NewPass123"|sudopasswd--stdin username

场景3:密码策略验证

# 强制密码立即过期$sudopasswd-e username# 查看密码状态$sudopasswd-S username username P 01/15/20240999997-1

6.2 chpasswd命令实战

场景1:批量用户密码初始化

# 从文件批量设置密码$catusers.txt user1:Password@123 user2:Secure#456user3:Complex$789$sudochpasswd<users.txt# 一次性设置多个用户$echo-e"user1:Pass1\nuser2:Pass2"|sudochpasswd

场景2:自动化脚本中的使用

#!/bin/bash# 自动化用户创建和密码设置脚本USERNAME="newuser"PASSWORD=$(openssl rand -base6412)# 创建用户sudouseradd-m$USERNAME# 设置密码(绕过PAM策略)echo"$USERNAME:$PASSWORD"|sudochpasswd# 记录日志echo"$(date): Created user$USERNAME">>/var/log/user_mgmt.log

场景3:使用加密的密码

# 生成加密密码$ENCRYPTED=$(opensslpasswd-6"MyPassword")$6$salt$encrypted_string# 使用加密密码$echo"user:$6$salt$encrypted_string"|sudochpasswd -e

7. 安全最佳实践

7.1 何时使用哪个命令

使用passwd的情况

  • 最终用户自行更改密码
  • 需要强制执行密码策略
  • 需要完整的审计追踪
  • 生产环境中的单用户密码管理

使用chpasswd的情况

  • 大规模用户初始化
  • 自动化部署脚本
  • 密码恢复/紧急重置
  • 测试环境批量设置

7.2 增强chpasswd的安全性

#!/bin/bash# 安全使用chpasswd的封装脚本validate_password(){# 自定义密码策略检查localpass="$1"[[${#pass}-ge8]]||return1[["$pass"=~[A-Z]]]||return1[["$pass"=~[a-z]]]||return1[["$pass"=~[0-9]]]||return1[["$pass"=~[!@#$%^&*] ]] || return 1return0}safe_chpasswd(){localuser="$1"localpass="$2"ifvalidate_password"$pass";thenecho"$user:$pass"|sudochpasswd logger"Password changed for$uservia safe_chpasswd"elseecho"Error: Password does not meet policy">&2return1fi}# 使用示例safe_chpasswd"testuser""Secure@Pass123"

7.3 监控与审计配置

# 增强chpasswd的审计(添加audit规则)$sudoauditctl -w /usr/sbin/chpasswd -p x -k password_changes# 监控shadow文件修改$sudoauditctl -w /etc/shadow -p wa -k shadow_modification

8. 故障排查与调试

8.1 调试passwd的PAM问题

# 启用PAM调试$sudoPAM_DEBUG=1passwdusername# 检查PAM配置$sudopam_tally2 --user=username $sudofaillock --user=username# 测试PAM配置$sudopam-auth-update

8.2 chpasswd问题排查

# 检查加密算法支持$ authconfig --test|grephashing# 验证shadow文件格式$sudopwck# 测试密码加密$ python3 -c"import crypt; print(crypt.crypt('test', crypt.mksalt(crypt.METHOD_SHA512)))"

9. 结论与推荐

维度推荐选择理由
安全性passwd完整的PAM策略执行和审计
批量操作chpasswd效率高,适合自动化
合规要求passwd满足安全审计要求
临时/测试chpasswd快速简便
生产环境passwd为主,chpasswd需封装平衡安全与效率

最终建议

  • 在自动化脚本中使用chpasswd时,务必添加自定义密码策略检查
  • 生产环境中,考虑开发封装脚本,结合两者的优点
  • 定期审计密码更改日志,特别是chpasswd的使用记录
  • 根据组织安全策略,可能需要完全禁用chpasswd,强制使用passwd

附录:相关配置文件位置

/etc/pam.d/ ├── passwd # passwd的PAM配置 ├── system-auth # 系统认证通用配置 └── chpasswd # 某些系统可能存在的配置 /etc/login.defs # 密码加密算法默认设置 /etc/security/ ├── pwquality.conf # 密码质量策略 └── limits.conf # 系统限制

通过深入理解passwdchpasswd的底层差异,系统管理员可以更安全、高效地管理Linux系统中的用户认证,在便利性与安全性之间找到最佳平衡点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/11 17:05:11

C 标准库 - `<math.h>`

C 标准库 - <math.h> 引言 在 C 语言编程中,数学运算是一项基本且重要的操作。《math.h》头文件提供了丰富的数学函数,用于处理各种数学问题。本文将详细介绍 <math.h> 标准库中的函数、使用方法以及注意事项。 1. <math.h> 函数概述 <math.h> 头…

作者头像 李华
网站建设 2026/1/9 9:28:46

【AUTOSAR AP CorAUTOSAR AP 错误处理与返回值规范:ErrorCode / ErrorDomain / Result / Exception / Violation 的工程化选型

目录标题 AUTOSAR AP 错误处理与返回值规范:ErrorCode / ErrorDomain / Result / Exception / Violation 的工程化选型 1. 错误分类先行:把“失败”拆成 4 种语义 1.1 Error:可恢复、属于 API 的正常输出域 1.2 Violation:断言级失败、不可恢复 1.3 Corruption:系统资源被…

作者头像 李华
网站建设 2026/1/12 9:34:09

舔狗的情绪价值和演员的自我修养

职场是人生中恒久的话题&#xff0c;也是关系个人生存发展的关键场景&#xff0c;因而关于职场有很多众说纷纭的言论和观点&#xff0c;也是跟个人的经历阅历相关。无所谓对错是非&#xff0c;只是选择不一样。纵览历史&#xff0c;即便大是大非、大奸大恶之事&#xff0c;也未…

作者头像 李华
网站建设 2026/1/12 2:37:38

30、编程与脚本编写指南

编程与脚本编写指南 1. 程序编译与安装 在大型项目中,程序编译非常重要。例如,Linux内核(一个不断修改和改进的程序)包含数百万行代码。 对于封装良好的源代码,通常会有一个名为 install 的特殊 make 目标。这个目标会将最终产品安装到系统目录中以供使用,通常这个…

作者头像 李华
网站建设 2025/12/31 15:56:10

33、Shell脚本中的控制操作符与交互式输入技巧

Shell脚本中的控制操作符与交互式输入技巧 1. 控制操作符:另一种分支方式 在Shell脚本编程里,控制操作符 && 和 || 为我们提供了一种独特的分支处理方式。理解它们的行为至关重要,下面是它们各自的工作原理: - command1 && command2 :先执行 co…

作者头像 李华
网站建设 2026/1/10 3:27:36

vue和springboot框架开发的协同过滤算法的电影推荐系统 电影评价管理系统_ 影评解说系统z9p6gctw

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vueSpringboot电影评价管理系统_ 影评解说系统 框架开…

作者头像 李华