管理系统用户的 shell 环境限制需从登录 shell、pam 控制、sudo 授权及系统加固四方面全链路管控:一用 /sbin/nologin 等禁用交互式 shell;二用 pam 按来源/时间/组动态控制登录;三用 sudoers 白名单精确授权命令;四加固 /etc/shadow 权限、清理 uid 0 账户、禁用 root 远程登录。

管理系统用户的 shell 环境限制,本质是控制“谁能执行什么命令”以及“在什么条件下执行”。这不是单点操作,而是从账户创建、登录行为、命令执行到审计追踪的全链路管控。
一、用 shell 类型决定登录能力边界
用户能否进入交互式会话,首先由其登录 shell 决定:
- /sbin/nologin:最常用。用户可认证成功(如 SSH 密码验证通过),但立即退出,不启动任何 shell。适合仅需 FTP、邮件等服务身份的账号。
- /bin/false:行为与 nologin 类似,但返回值为失败(exit code 1),某些旧脚本或服务更倾向识别它。
- /usr/sbin/nologin:部分发行版(如 Debian)默认路径,功能一致,注意检查 /etc/shells 是否包含该路径。
- 避免直接设为 /bin/bash 或 /bin/sh 给非运维账号——哪怕加了 sudo 限制,shell 本身已提供大量逃逸入口(如 $PATH 注入、内建命令、环境变量劫持)。
二、用 PAM 实现登录级细粒度控制
仅改 shell 是粗粒度封锁;PAM 能按来源、时间、组别动态放行或拒绝:
- 编辑 /etc/pam.d/sshd(SSH 登录)或 /etc/pam.d/login(本地终端),添加一行:
auth required pam_access.so accessfile=/etc/security/access.conf - 在 /etc/security/access.conf 中写规则,例如:
- : backupuser : !192.168.10.0/24(仅允许 backupuser 从指定网段登录)+: wheel : LOCAL(允许 wheel 组本地登录)-: ALL : ALL(默认禁止所有远程登录) - 注意顺序:PAM 规则自上而下匹配,
+和-行不能颠倒,否则可能被绕过。
三、用 sudoers 精确授权命令范围
对需保留部分操作权限的用户,禁用 shell 不现实,应转向命令白名单:
- 用 visudo 编辑 /etc/sudoers,避免语法错误锁死系统。
- 最小化授权示例:
deployer ALL=(www-data) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/rsync
表示 deployer 只能以 www-data 身份免密执行这两个命令。 - 禁止全部 sudo 权限:
guestuser ALL=(ALL) !ALL—— 显式拒绝所有命令,比留空更安全。 - 禁用 shell 功能:
Defaults:limiteduser !shell_escape阻止使用 sudo -s、sudo sh 等启动子 shell。
四、配合关键系统级加固动作
shell 限制效果依赖底层基础是否牢固:
- 确认 /etc/shadow 权限为
-r--------(400),运行chmod 400 /etc/shadow;否则攻击者可直接读取哈希离线破解。 - 检查 UID 0 账户:
awk -F: '($3==0){print $1}' /etc/passwd,输出只应有 root;其他账户必须立即处理(改 shell 或删除)。 - 禁用 root 远程登录:修改 /etc/ssh/sshd_config 中
PermitRootLogin no,重启 sshd。 - 锁定账号文件(可选):
chattr +i /etc/passwd /etc/shadow防止篡改,但需在维护前chattr -i解锁。











