最稳妥的禁用方式是组合操作:先用 passwd -l 锁定密码字段阻断密码认证,再用 usermod -s /sbin/nologin 禁用交互式 shell,最后清理 crontab、ssh 密钥及 sudo 权限,否则 ssh 密钥登录、sudo 切换和定时任务仍可绕过单一措施。

passwd -l 是最直接有效的禁用方式,但它只拦密码登录,不拦 SSH 密钥、sudo 切换或 crontab 执行。真要禁用,得组合操作。
为什么单用 usermod -s /sbin/nologin 不够
这个命令只是把用户 shell 换成 /sbin/nologin(或 /usr/sbin/nologin),效果是:用户输密码后能进系统,但进不去交互式 shell —— 看似“登不上”,其实漏洞不少:
• SSH 密钥登录成功后仍可执行命令(如 ssh user@host uptime)
• sudo -u username bash 仍能切过去(只要该用户在 sudoers 里)
• 已存在的 crontab 任务照常运行
• 某些服务(如 FTP、mail)可能依赖 shell 字段做判断,用 /bin/false 还可能触发异常日志刷屏
passwd -l 锁的是密码字段,不是账户本身
它实际是在 /etc/shadow 对应行的密码哈希前加一个 !,比如从:$abc...:18200:0:99999:7:::
变成:!$abc...:18200:0:99999:7:::
这样系统在认证阶段就直接拒绝,连密码比对都不做。
• 必须用 sudo passwd -S username 验证,输出第二列是 LK 才算生效
• 注意别和 !! 混淆:!! 表示密码已过期+锁定,需先清过期再解锁
• usermod -L 效果相同,但运维脚本里混用 passwd -l 和 usermod -L 容易导致状态不一致
真正禁用要堵住所有入口
单一操作都留有缝隙,稳妥做法是三步一起做:
• sudo passwd -l username —— 拦密码认证
• sudo usermod -s /usr/sbin/nologin username(Debian/Ubuntu)或 /sbin/nologin(RHEL/CentOS)—— 拦交互式 shell 启动
• sudo crontab -e -u username 并清空内容,或直接删 /var/spool/cron/username(如存在)—— 防定时任务偷偷跑
• 如果用的是 SSH 密钥登录,还得检查 /home/username/.ssh/authorized_keys 是否被手动清理(passwd -l 不动它)
别忽略已存在的会话和 sudo 权限
执行完上述操作后:
• 当前已登录的会话不会被踢出,得自己 kill 或等超时
• 如果该用户在 sudoers 里有免密权限,sudo -u username whoami 仍可能成功(除非 shell 已设为 nologin)
• su - username 会失败(因 shell 不可执行),但 su username(不带 -)可能成功并进入非登录 shell,取决于 PAM 配置
• 检查是否漏掉 systemd --user 服务、at 任务、或通过 apache 等服务间接调用的脚本











