禁用不必要的虚拟账户和系统账号是Linux安全加固的基础措施。应识别UID<1000且Shell非nologin/false的账号,检查空口令和UID=0账号,优先使用passwd -l、usermod -s /sbin/nologin等命令禁用,避免手动注释passwd文件,并备份配置、验证效果及定期审计。

禁用不必要的虚拟账户和系统账号,是Linux安全加固中最基础也最有效的一步。这些账户通常不用于登录,仅服务后台进程,但若被利用,可能成为提权或横向移动的入口。
识别哪些账号属于“不必要的系统账号”
Linux默认安装会创建大量系统用户(如adm、lp、sync、shutdown、halt、mail、operator、games、ftp、nobody等),它们UID通常在1–999之间,Shell多为/sbin/nologin或/bin/false。但部分账号仍可能被滥用(例如ftp可配合FTP服务上传恶意脚本)。
检查命令:
- cat /etc/passwd | awk -F: '$3 < 1000 && $7 !~ /(nologin|false)$/ {print $1,$3,$7}' —— 列出UID<1000且Shell非nologin/false的账号
- awk -F: '($2=="")' /etc/shadow —— 查空口令账号(高危!必须处理)
- awk -F: '($3==0)' /etc/passwd —— 确认只有root的UID为0
安全禁用方式:优先用命令,慎用手动编辑
直接注释/etc/passwd中某行(如加#)虽能禁用,但易引发语法错误,且不被systemd等现代工具识别,不推荐。应使用标准命令:
- passwd -l username:在/etc/shadow密码字段前加!,禁止密码登录(对SSH密钥登录无效)
- usermod -s /sbin/nologin username:强制设为不可交互Shell,彻底阻止所有本地/远程shell登录
- usermod --expiredate 1 username:设置账号过期时间为1970-01-01,系统拒绝任何认证尝试(含密钥)
- userdel -r username:确认完全无用后,直接删除账号及主目录(删除前务必确认无服务依赖)
重点加固对象与操作建议
以下账号在多数生产环境无需登录能力,建议统一处理:
- sync、shutdown、halt:Shell已为/bin/sync或/sbin/shutdown,保留即可,勿改Shell;若需进一步限制,可用usermod -s /sbin/nologin
- adm、lp、mail、operator、games、ftp:除非明确启用对应服务(如CUPS打印、FTP服务),否则建议usermod -s /sbin/nologin或直接userdel
- nobody、nobody4、dbus、polkitd、sshd:属关键服务运行账户,仅设/sbin/nologin,切勿删除
操作前备份:cp /etc/passwd /etc/passwd.bak && cp /etc/shadow /etc/shadow.bak
验证与持续防护
禁用后务必验证效果:
- passwd -S username —— 显示L(Locked)表示密码已锁定
- getent passwd username —— 检查Shell是否已更新为/sbin/nologin
- 尝试以该用户SSH登录,确认连接被拒绝或立即退出
- 定期复查:crontab -e添加每月检查任务,例如:0 0 1 * * awk -F: '$3<1000 && $7!~/nologin|false/ {print $1}' /etc/passwd >> /var/log/sec-audit.log
不复杂但容易忽略:禁用账号只是起点,还需同步关闭对应服务(如systemctl disable vsftpd)、限制su权限、启用PAM失败锁定等,才能形成纵深防御。


















