permituserenvironment 是 openssh 的风险开关,开启后允许用户通过 ~/.ssh/environment 注入恶意环境变量实现劫持;正确做法是默认禁用(permituserenvironment no),并限制 acceptenv、清理可疑文件、加固 shell 权限。

PermitUserEnvironment 是 OpenSSH 提供的一个配置项,用于控制是否允许用户通过 ~/.ssh/environment 文件自定义环境变量。它本身不是“拦截”手段,而是**一个潜在风险开关**——开启后,攻击者若获得用户 SSH 密钥或密码,就可能通过篡改该文件注入恶意 PATH、LD_PRELOAD 或 SHELL 等变量,实现命令劫持、提权或持久化。因此,**正确做法不是“用它来拦截”,而是默认禁用它,并辅以其他加固措施防范环境变量劫持。**
为什么 PermitUserEnvironment 开启会带来风险
当 PermitUserEnvironment yes 时:
- 用户可在
~/.ssh/environment中写入任意环境变量(如PATH=/tmp/malware:/usr/bin) - SSH 登录时会加载该文件,且其优先级常高于
~/.bashrc,导致后续执行的命令(如ls、python)被指向恶意二进制 - 无需修改系统级配置或用户 shell 配置,隐蔽性强,尤其在共享账户或自动化部署场景中易被滥用
安全配置:默认关闭 + 显式禁止
在服务端 /etc/ssh/sshd_config 中确保以下设置:
- 显式关闭该功能:
PermitUserEnvironment no(不要仅注释掉,默认行为因版本而异) - 检查是否存在
AcceptEnv过度放行(如AcceptEnv *或AcceptEnv PATH LD_PRELOAD),应限制为必要变量(如AcceptEnv LANG LC_*) - 重启服务生效:
systemctl restart sshd
配套加固:阻断环境变量劫持链路
单靠关闭 PermitUserEnvironment 不够,还需切断其他常见劫持路径:
-
禁用非交互式 Shell 的配置文件加载:确认
/etc/passwd中用户 shell 为真实 shell(如/bin/bash),而非/bin/false或/usr/sbin/nologin;对仅需 sftp 的用户,使用internal-sftp并禁用 shell -
清理可疑环境文件:检查并删除用户主目录下异常文件:
~/.ssh/environment、~/.profile、~/.bash_profile中非标准 PATH 注入或 eval 调用 -
限制登录 Shell 权限:对运维账号启用
ForceCommand或 rbash,防止执行任意命令绕过环境控制 -
审计日志:开启
LogLevel VERBOSE,记录每次登录使用的环境变量和 shell 启动参数,便于事后溯源
验证是否生效
完成配置后可快速验证:
- 以目标用户 SSH 登录,执行
echo $PATH,确认输出不包含用户私有目录(如/tmp、~/bin) - 手动创建
~/.ssh/environment并写入TEST_VAR=123,重新连接后执行echo $TEST_VAR,应为空(未加载) - 运行
sshd -T | grep permituserenvironment,输出应为permituserenvironment no











