为什么锁系统账号
bin、daemon、adm、lp、games 这类账号只归守护进程与服务使用,不该有人拿它登录。收敛要同时做两件事:把登录 shell 改成 /sbin/nologin 或 /bin/false,堵掉交互会话;把 /etc/shadow 的口令字段锁成 ! 或 * 开头,让口令认证彻底不可用。只做一件都留缺口——只锁口令,密钥登录照样能进;只改 shell,su 或服务复用账号等路径仍可能被口令爆破命中。
基本信息
| 加固项 | 系统账号口令锁定与登录 shell 收敛 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS、Debian/Ubuntu) |
| 权限要求 | root |
| 达标判据 | /etc/shadow 第 2 字段以 ! 或 * 开头 |
| 基线对应 | CIS Linux Benchmark:system accounts are secured |
典型使用场景
- 新系统做基线核查,先清掉仍可登录的系统账号
- 服务账号从共享账号拆成专用账号后,回收旧账号的登录能力
- 等保或内部审计前逐项确认“禁止口令登录”类控制点
- 入侵排查时确认攻击者没有给内置账号种上口令
- 卸载软件后清理遗留的数据库、中间件系统账号
核查:谁还能用口令
核查:谁还能用口令
awk -F: '$1 != "root" && $2 ~ /^\$/ { print $1 }' /etc/shadow # 仍持有真实哈希的系统账号
passwd -S sysuser # 单账号状态:L/LK 已锁 NP 空口令 P/PS 可用口令
awk -F: '($3 < 1000) && ($1 != "root") { print $1, $7 }' /etc/passwd # 顺带看这些账号的 shell处置:锁定并收 shell
处置:锁定并收 shell
usermod -L sysuser # 在现有哈希前加 !,不动 shell
passwd -l sysuser # 等效做法,二选一即可
usermod -s /sbin/nologin sysuser # 禁止交互登录
passwd -S sysuser # 复核:期望输出 L 或 LKshadow 口令字段读法
| 字段内容 | 含义 | 处置 |
|---|---|---|
| $6$... / $y$... | 存在可验证的口令哈希 | 按业务确认后锁定或清空 |
| ! 或 !$6$... | 已锁定,哈希被禁用 | 达标 |
| * | 从未设口令或占位符 | 达标,同属不可口令登录 |
| 空值(::) | 无口令即可登录 | 高危,立刻修复 |
系统账号的边界由 UID 决定:RHEL 系与 Debian 系默认 UID_MIN=1000,所以 UID 小于 1000 且非 root 的账号基本就是系统账号。若环境改过 UID_MIN,核查范围要按 /etc/login.defs 的实际值来定,避免漏项或误伤业务账号。
usermod -L 只是给现有哈希加 ! 前缀:账号原本就无口令(!! 或 *)时语义不同,别把“已锁定”当成“空口令已修”。改完必须用 passwd -S 逐条复核,而不是看命令有没有报错。