核心是让系统账户“能运行服务、不能登录交互”,需阻断密码登录、SSH会话、本地终端登录三类入口;优先识别UID<1000且Shell非nologin/false的账号,用usermod -s /sbin/nologin禁用,避免注释passwd文件。

禁用不必要 Shell 账号,核心是让系统账户“能运行服务、不能登录交互”,而不是简单删掉或注释配置行。重点不是账号数量,而是每个账号是否具备实际登录能力——尤其要阻断密码登录、SSH 会话、本地终端登录这三类入口。
先识别哪些账号真该处理
系统自带的低 UID 账号(UID
-
已安全:Shell 是
/sbin/nologin或/bin/false的账号(如nobody、dbus、polkitd),无需改动 -
需干预:UID /bin/bash、
/bin/sh、/bin/sync、/sbin/shutdown等可执行 Shell 的账号(如sync、shutdown、adm、ftp) -
高危项:空口令账号(
awk -F: '($2=="")' /etc/shadow)、非 root 的 UID=0 账号(awk -F: '($3==0)' /etc/passwd | grep -v '^root:')必须立即处置
用标准命令禁用,别手动改 passwd
直接在 /etc/passwd 行前加 # 容易引发语法错误,systemd 和 PAM 也可能无法识别。推荐以下方式,按优先级排序:
-
usermod -s /sbin/nologin username:最常用,彻底禁止所有交互式登录(含 SSH 密钥登录) -
passwd -l username:仅锁定密码认证(对密钥登录无效),适合保留 Shell 但禁密码场景 -
usermod --expiredate 1 username:设账号过期时间为 Unix 元年,系统拒绝任何认证尝试 -
userdel -r username:仅当确认无服务依赖(如 CUPS 不用lp、FTP 服务未启用则可删ftp)时才删除
典型账号处理建议
不必一刀切删除,按角色区别对待:
-
sync、shutdown、halt:Shell 原为/bin/sync或/sbin/shutdown,本身不可交互,保留即可;若需强化,可设为/sbin/nologin -
adm、lp、mail、operator、games、ftp:除非明确启用日志分析、打印、邮件中继、运维操作或 FTP 服务,否则统一执行usermod -s /sbin/nologin -
nobody、dbus、sshd、polkitd:属关键服务运行身份,只设/sbin/nologin,严禁删除
操作后必须验证和防护
禁用不是终点,验证和持续控制同样重要:
- 验证是否生效:
passwd -S username显示L(Locked)表示密码锁定;getent passwd username查看 Shell 字段是否已更新 - 备份再操作:
cp /etc/passwd /etc/passwd.bak && cp /etc/shadow /etc/shadow.bak - 定期审计:
cat /etc/passwd | awk -F: '$3 每月跑一次,及时发现异常变更 - 加固基础:
chattr +i /etc/passwd /etc/shadow防止恶意篡改(操作前确保已掌握解锁方法)

















