禁止普通用户修改登录shell,核心是移除/usr/bin/chsh的setuid位(sudo chmod u-s /usr/bin/chsh),确保/etc/shells仅含可信shell路径,并将非交互用户统一设为/sbin/nologin。

禁止普通用户修改自己的登录 Shell,核心是收回其执行 chsh 命令的权限,并确保系统只允许管理员通过受控方式变更 Shell。直接放任用户随意切换 Shell(比如改成 /bin/sh、/usr/bin/python 或自定义脚本)可能绕过限制、执行非预期命令,甚至为提权或持久化埋下隐患。
撤回普通用户的 chsh 执行权限
chsh 默认由 /usr/bin/chsh 提供,通常属主为 root、权限为 -rwsr-xr-x(带 setuid 位),这正是普通用户能修改自己 Shell 的原因。要禁用该能力:
- 移除其 setuid 位:
sudo chmod u-s /usr/bin/chsh - 验证是否生效:
ls -l /usr/bin/chsh—— 输出中不应再出现s(如变成-rwxr-xr-x) - 此时普通用户运行
chsh会提示Permission denied,而 root 仍可通过chsh -s或usermod -s管理
确保 /etc/shells 只含可信 Shell
chsh(即使保留 setuid)默认只接受列在 /etc/shells 中的路径。若该文件被篡改或包含危险解释器(如 /bin/bash 之外的交互式 shell 或脚本解释器),仍可能被利用:
- 检查当前内容:
cat /etc/shells - 仅保留明确需要的 Shell,例如:
/bin/bash、/bin/sh、/sbin/nologin、/usr/bin/zsh(如确需) - 删除无关项,如
/usr/bin/perl、/usr/bin/python3、/bin/awk等——它们虽可执行,但不应作为登录 Shell - 必要时锁定该文件防篡改:
sudo chattr +i /etc/shells
将非交互用户设为 /sbin/nologin
对无需登录的系统账户(如服务账号、批量任务账号),应强制使用 /sbin/nologin 作为登录 Shell,而非留空或设为 /bin/false(后者部分旧工具兼容性差):
- 新建用户时指定:
sudo useradd -s /sbin/nologin appsvc - 修改现有用户:
sudo usermod -s /sbin/nologin backupuser - 验证效果:SSH 登录会直接返回
This account is currently not available.并断开,无法进入任何交互环境
补充加固:限制 Shell 启动行为
即便 Shell 被正确设置,用户仍可能通过环境变量(如 SHELL)、exec 调用或脚本间接启动其他解释器。可进一步收紧:
- 在用户家目录的
.bashrc或.profile中加入:unset SHELL PATH; export PATH="/bin:/usr/bin"(谨慎测试,避免影响必要命令) - 对高敏感账户,考虑使用 PAM 模块限制可执行程序,例如配置
/etc/pam.d/common-session加入:session required pam_exec.so /usr/local/bin/restrict-shell.sh - 审计 Shell 相关操作:
sudo auditctl -a always,exit -F path=/usr/bin/chsh -F perm=x -k shell_mod,后续用ausearch -k shell_mod追踪调用记录










