Linux中限制sudo环境变量的核心是控制子进程继承的变量,通过env_reset、env_keep和env_delete在/etc/sudoers中精细配置,默认重置环境并仅保留安全白名单变量。

Linux 中限制 sudo 命令执行时的环境变量,核心是控制子进程启动时继承哪些变量,防止通过恶意环境变量(如 PWD、SHELL、PATH 或自定义变量)绕过权限检查或加载非预期程序。默认情况下,sudo 会重置大部分环境变量,只保留少量安全白名单(如 HOME、LOGNAME、USER 等),但这个行为可通过配置精细调整。
使用 Defaults env_reset 和 env_keep 控制变量继承
在 /etc/sudoers 中,env_reset 是默认启用的安全机制,它会在执行命令前清空用户原始环境,再按需注入可控变量。你可以显式启用并配合 env_keep 保留特定变量:
- 在 visudo 中添加全局策略:
Defaults env_reset
Defaults env_keep += "LANG LC_* SSH_CONNECTION" - env_keep 后面用 += 是追加,避免覆盖系统默认保留项;LC_* 支持通配符,可一次保留所有本地化变量
- 若想彻底禁止某变量被带入,可用 env_delete:
Defaults env_delete += "LD_PRELOAD PYTHONPATH"(常用于防动态库劫持或脚本注入)
禁用危险变量传递(关键防护)
某些变量极易被利用来提权或逃逸,应明确删除:
- LD_PRELOAD:可强制加载恶意共享库,绕过命令白名单 —— 必须加入 env_delete
-
PATH:虽然 sudo 默认重置为安全路径(如 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin),但若需进一步锁定,可显式设置:
Defaults secure_path="/usr/local/bin:/usr/bin:/bin" - SHELL、IFS、PS4 等也建议列入 env_delete 清单,尤其在高安全场景下
按用户或命令粒度定制环境
不一定要全局统一处理,可以针对特定用户、组或命令单独配置:
- 限制某用户执行 /usr/bin/python3 时不带任何额外变量:
alice ALL=(ALL) NOEXEC: /usr/bin/python3
(NOEXEC 防止子进程 fork 新 shell,间接抑制变量影响) - 为某条命令启用最小环境:
bob ALL=(ALL) SETENV: /bin/ls
再配合 env_check 或 env_delete 精确过滤 - 使用 !SETENV 显式禁止该规则下继承环境变量,比依赖默认更可靠
验证与日志跟踪
配置生效后务必验证,并确保操作可审计:
- 用 sudo -l -U username 查看该用户实际生效的 Defaults 设置
- 执行 sudo env | grep -E '^(PATH|LD_|SHELL|HOME)' 直观确认变量是否被正确清理或保留
- 所有 sudo 行为(含环境相关拒绝)默认记录在 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS),可配合 Defaults logfile 指定独立日志路径


















