Linux命令-pwck(检查 /etc/passwd 和 /etc/shadow 完整性)
Linux命令-pwck(检查 /etc/passwd 和 /etc/shadow 完整性)
- 快速参考
- 命令语法
- 常用选项
- 检查项目
- 实战示例
- 1. 基础检查
- 2. 只读检查
- 3. 检查特定用户文件副本
- 4. 手动检查 vs pwck
- 5. 安全审计
- 发行版差异
- 相关命令
- 总结
快速参考
pwck(Password Check)是一个系统完整性检查工具,用于验证/etc/passwd和/etc/shadow文件的结构完整性。它会逐行检查用户名唯一性、UID/GID 合法性、主目录是否存在、Shell 是否有效等,帮助管理员发现潜在的账户配置错误或安全漏洞。
在 Linux 系统中,
/etc/passwd和/etc/shadow是认证体系的根基。pwck是你的账户数据库的"健康检查"——定期运行它,可以在问题演变成安全事故之前发现隐患。
命令语法
pwck [选项] [passwd [shadow]]常用选项
| 选项 | 功能 |
|---|---|
-r | 只读模式(不修改文件) |
-s | 排序模式(按 UID 排序后检查) |
-q | 安静模式(减少输出) |
-R | 在 chroot 环境中运行 |
-h | 显示帮助 |
检查项目
pwck会验证以下内容:
| 检查项 | 说明 |
|---|---|
| 用户名唯一性 | 不允许重复的用户名 |
| UID 唯一性 | 不允许重复的 UID |
| 字段数量 | 每行必须是冒号分隔的 7 个字段 |
| UID 合法性 | 必须是数字且在合理范围内 |
| GID 合法性 | 必须是数字且在合理范围内 |
| 主目录存在性 | 主目录路径必须存在 |
| Shell 有效性 | Shell 必须在/etc/shells中列出 |
| 字段非空 | 除密码字段外,其他字段不应为空 |
| 影子密码一致性 | passwd 与 shadow 中的用户名对应 |
实战示例
1. 基础检查
# 检查当前系统(需要 root 权限)$sudopwck user'alice':directory'/home/alice'does not exist user'bob':directory'/nonexistent/path'does not exist user'carol':program'/bin/false'is notin/etc/shells pwck: no changes# 解读:# alice: 主目录 /home/alice 不存在(可能已被删除)# bob: 主目录路径无效# carol: Shell 不在 /etc/shells 中(可能是合法的服务账户)# 查看 /etc/shells 中允许的 Shell$cat/etc/shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /bin/dash /usr/bin/dash /bin/zsh /usr/bin/zsh /usr/bin/fish# 注意:/usr/sbin/nologin 和 /bin/false 通常不在此列表中# 它们是合法的"禁止登录"Shell,pwck 可能误报2. 只读检查
# 只读模式(推荐!不修改文件,只报告问题)$sudopwck-ruser'test':directory'/home/test'does not exist invalid passwordfileentry delete line'test:x:2001:2001::/home/test:/bin/bash'? No pwck: the files have been updated# 即使 -r 也会尝试修复# 安静模式$sudopwck-q# 只输出错误,不输出正常行3. 检查特定用户文件副本
# 备份当前的 passwd 和 shadow$sudocp/etc/passwd /tmp/passwd.test $sudocp/etc/shadow /tmp/shadow.test# 对副本进行检查(不影响系统)$sudopwck-r/tmp/passwd.test user'nobody':directory'/nonexistent'does not exist user'systemd-coredump':directory'/'does not exist pwck: no changes# 修复:创建缺失的主目录$sudomkdir-p/home/alice $sudochownalice:alice /home/alice# 修复:更新 Shell 路径$sudousermod-s/usr/sbin/nologin carol# 或添加 Shell 到 /etc/shells$echo"/usr/sbin/nologin"|sudotee-a/etc/shells4. 手动检查 vs pwck
# pwck 在做什么——我们可以手动实现类似检查# 检查重复用户名$cut-d:-f1/etc/passwd|sort|uniq-d# 检查重复 UID$cut-d:-f3/etc/passwd|sort|uniq-d# 检查字段不完整(非 7 个字段)$awk-F:'NF != 7 {print "Line " NR ": " $0}'/etc/passwd# 检查 UID 非数字$awk-F:'$3 !~ /^[0-9]+$/ {print "Invalid UID: " $0}'/etc/passwd# 检查 Shell 是否有效$awk-F:'{print $7}'/etc/passwd|sort-u|whilereadshell;doif!grep-qxF"$shell"/etc/shells2>/dev/null;thenecho"Shell not in /etc/shells:$shell"fidone# 检查主目录是否存在$awk-F:'{print $6}'/etc/passwd|sort-u|whilereaddir;doif["$dir"!="/"]&&[!-d"$dir"];thenecho"Directory missing:$dir"fidone# 可以封装为自定义检查脚本$cat>/usr/local/bin/passwd_check.sh<<'SCRIPT' #!/bin/bash echo "=== UID 冲突检查 ===" cut -d: -f3 /etc/passwd | sort -n | uniq -d echo "=== 用户名冲突检查 ===" cut -d: -f1 /etc/passwd | sort | uniq -d echo "=== 字段不完整检查 ===" awk -F: 'NF != 7 {print "Line " NR ": " $0}' /etc/passwd echo "=== 0 号 UID 检查(除了 root)===" awk -F: '$3 == 0 && $1 != "root" {print $0}' /etc/passwd echo "=== 主目录缺失检查 ===" while IFS=: read -r user _ uid _ _ dir shell; do [ "$dir" = "/" ] && continue [ "$dir" = "" ] && continue [ -d "$dir" ] || echo "$user: directory $dir missing" done < /etc/passwd SCRIPT$chmod+x /usr/local/bin/passwd_check.sh5. 安全审计
# 检查是否有未授权的 UID 0 账户(后门账户)$sudopwck-r2>&1|grep"UID 0"$sudoawk-F:'$3 == 0 {print $0}'/etc/passwd root:x:0:0:root:/root:/bin/bash# 如果输出不止 root 一行!立即检查是否是安全事件!# 检查是否有空密码的账户$sudoawk-F:'($2 == "" || $2 == "!") && $3 >= 1000'/etc/shadow# 检查是否有已过期但仍活跃的账户$sudochage-lalice# 定期检查的 cron 任务$cat>/etc/cron.daily/passwd-integrity<<'SCRIPT' #!/bin/bash REPORT=$(sudo pwck -r -q 2>&1) if [ -n "$REPORT" ]; then echo "Subject: [SECURITY] /etc/passwd integrity warning" | \ sendmail -t admin@example.com echo "$REPORT" | sendmail -t admin@example.com fi SCRIPT$chmod+x /etc/cron.daily/passwd-integrity发行版差异
| 发行版 | 包名 | 默认安装 | 命令路径 |
|---|---|---|---|
| Debian/Ubuntu | passwd | 是 | /usr/sbin/pwck |
| RHEL/CentOS/Fedora | shadow-utils | 是 | /usr/sbin/pwck |
| Arch Linux | shadow | 是 | /usr/bin/pwck |
| Alpine Linux | shadow | 否 (apk add shadow) | /usr/sbin/pwck |
所有主流 Linux 发行版都提供了pwck,行为一致。
相关命令
| 命令 | 功能 |
|---|---|
pwck | 检查/etc/passwd和/etc/shadow |
grpck | 检查/etc/group和/etc/gshadow |
pwconv | 从 passwd 创建 shadow(影子密码) |
pwunconv | 从 shadow 恢复传统密码 |
vipw | 安全编辑/etc/passwd(锁定文件) |
vigr | 安全编辑/etc/group |
总结
pwck是系统账户数据库的"例行体检"工具。它帮助管理员在问题演变成安全漏洞或登录失败之前发现隐患:
- 重复 UID → 权限混乱
- 缺失主目录 → 用户无法登录或配置文件丢失
- 无效 Shell → 用户无法正常使用
- UID 0 多个 → 可能的安全事件
建议:在创建/删除用户后运行pwck -r验证,定期将pwck -r -q加入安全审计 cron 中。
