首页 / 帮助文档 / CentOS安全中设置nologin禁止非授权shell登录

CentOS安全中设置nologin禁止非授权shell登录

在CentOS系统安全加固中,设置nologin来禁止非授权用户获取shell登录权限,是最基础也最有效的手段之一。具体做法是通过修改/etc/passwd文件中目标用户的登录shell字段,将其改为/sbin/nologin或/usr/sbin/nologin,这样该用户就无法通过SSH、本地终端等方式获得交互式shell,但仍然可以通过其他方式(如SFTP、定时任务)执行特定操作。这一操作看似简单,但在实际生产环境中涉及的场景、细节和延伸安全策略非常多,下面逐一展开讲透。

一、为什么要禁止非授权shell登录

在CentOS服务器上,默认情况下系统会创建多个系统账户,比如bin、daemon、adm、lp、mail、nobody等。这些账户通常不需要交互式登录能力,它们存在的意义是运行特定的后台服务或进程。如果这些账户被赋予了正常的shell(比如/bin/bash),一旦攻击者通过某种漏洞获取了这些账户的密码,就能直接登录系统执行任意命令,后果不堪设想。

此外,还有一些应用账户,比如运行Web服务的apache、nginx用户,运行数据库的mysql用户等。这些账户如果拥有shell权限,同样是巨大的安全隐患。禁止非授权shell登录,本质上是遵循"最小权限原则"——只给账户完成工作所必需的权限,多余的一律砍掉。

二、nologin的工作原理

/sbin/nologin(或/usr/sbin/nologin)是一个特殊的程序,它的作用非常单一:当用户尝试登录时,它会显示一条提示信息(通常是"This account is currently not available"),然后立即终止登录会话。它不是一个真正的shell,不会给用户任何命令执行环境。

从技术角度看,/etc/passwd文件的每一行都包含七个字段,用冒号分隔:用户名:密码占位符:UID:GID:描述信息:主目录:登录shell。当我们把最后一个字段改成/sbin/nologin时,系统在验证用户身份后,会调用这个程序而不是启动bash或sh,从而阻断交互式登录。

三、具体操作步骤

第一步,查看当前用户的shell设置。打开终端执行以下命令:

cat /etc/passwd | grep -v "nologin" | grep -v "false"

这条命令会列出所有使用正常shell的用户,方便你快速定位哪些账户需要修改。

第二步,使用usermod命令修改指定用户的shell。例如,要禁止apache用户登录:

usermod -s /sbin/nologin apache

如果要禁止nobody用户登录:

usermod -s /sbin/nologin nobody

第三步,验证修改是否生效:

grep "apache" /etc/passwd

输出应该类似于:

apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

看到最后一个字段变成/sbin/nologin就说明设置成功了。

四、批量禁止系统默认账户的shell

CentOS 7/8系统上有大量默认系统账户,手动一个个改效率太低。可以用一条命令批量处理。先查看哪些系统账户使用了bash:

awk -F: '($7 ~ /bash$/) {print $1}' /etc/passwd

然后批量修改(注意排除root和你自己的管理账户):

for user in $(awk -F: '($7 ~ /bash$/ && $3 >= 1000) {print $1}' /etc/passwd); do usermod -s /sbin/nologin $user; done

这里加了$3 >= 1000的条件,是因为UID小于1000的通常是系统关键账户,需要谨慎处理。实际操作前建议先备份/etc/passwd文件:

cp /etc/passwd /etc/passwd.bak.$(date +%F)

五、nologin和/bin/false的区别

很多人分不清/sbin/nologin和/bin/false的区别。两者都能阻止登录,但行为不同。/bin/false是直接返回一个非零退出码,没有任何提示信息,用户会看到登录失败的错误。/sbin/nologin会先显示一条友好提示再退出。从安全角度看,两者效果相同,但从用户体验和日志审计角度看,nologin更好,因为它能明确告诉尝试登录的人"此账户不可用",而不是让人以为密码输错了。

在CentOS 8及更新版本中,/usr/sbin/nologin是标准路径,/sbin/nologin通常是软链接指向它。建议统一使用/usr/sbin/nologin。

六、设置后需要注意的影响

设置nologin后,该用户确实无法通过SSH或本地终端登录了,但有几个场景需要特别注意:

1、如果某个服务需要以该用户身份运行交互式程序(极少见但存在),会直接失败。修改前确认该账户的实际用途。

2、SFTP登录可能仍然有效。如果你同时需要禁止SFTP,需要在sshd_config中额外配置:

Match User apache
    ForceCommand /usr/sbin/nologin
    AllowTcpForwarding no
    X11Forwarding no

3、通过sudo切换到该用户的操作不受影响。如果你不希望任何人通过sudo -u apache bash这种方式获得shell,需要在/etc/sudoers中限制。

七、配合其他安全措施形成纵深防御

单纯设置nologin只是安全加固的一个环节,不能指望它解决所有问题。建议配合以下措施:

1、禁用root远程登录。修改/etc/ssh/sshd_config:

PermitRootLogin no

2、限制SSH登录用户白名单:

AllowUsers admin_user deploy_user

3、使用SSH密钥认证替代密码登录,彻底杜绝暴力破解。

4、安装fail2ban或类似工具,自动封禁多次登录失败的IP。

5、定期审计/etc/passwd和/etc/shadow文件,检查是否有异常账户被添加。

6、启用SELinux或AppArmor,即使账户被攻破,也能限制其活动范围。

八、特殊场景:需要保留部分登录能力的账户

有些账户虽然不需要交互式shell,但需要执行某些特定命令。比如运维人员可能需要通过某个专用账户执行备份脚本。这种情况下,可以不用nologin,而是使用rbash(受限bash)或者通过authorized_keys中的command选项限制该密钥只能执行特定命令:

command="/usr/local/bin/backup.sh",no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3...

这样比直接设nologin更灵活,既保证了安全又不影响正常运维操作。

九、CentOS 8/9 Stream中的变化

CentOS 8和CentOS Stream 9在用户管理上有一些变化。systemd的引入使得某些服务账户的管理方式有所不同。另外,CentOS Stream 9默认使用/usr/sbin/nologin而不是/sbin/nologin。如果你从CentOS 7迁移过来,记得检查路径是否正确。同时,新版本中useradd命令默认创建的系统用户可能已经是nologin了,但手动创建的用户不一定,需要手动检查。

另外提醒一点,CentOS 8已经停止维护,CentOS Stream 9是滚动更新模式,安全策略需要持续跟进。不要设置完就不管了,定期复查是必须的。

十、常见错误和排查方法

错误一:修改后发现某个服务启动失败。这通常是因为该服务依赖某个账户的shell环境。解决方法是查看服务的systemd unit文件,确认它是否指定了User=xxx,然后判断该用户是否真的需要shell。

错误二:想改回来却忘记原来的shell是什么。查看备份文件或者用以下命令查看默认值:

grep "^#" /etc/login.defs

错误三:误把自己的管理账户设成了nologin,导致自己也登不上去。这就是为什么操作前一定要备份,而且不要在root会话中批量操作关键账户。

总结

在CentOS安全加固中,设置nologin禁止非授权shell登录是一项低成本高回报的基础操作。它不需要安装额外软件,不影响系统性能,却能有效缩小攻击面。关键是要理解它的原理,知道什么账户该设、什么账户不该设,以及设置后可能带来的连锁影响。把这一项和SSH加固、最小权限、审计监控结合起来,才能构建真正有纵深的服务器安全体系。安全从来不是一招制胜,而是每一个细节的持续积累。