因此,我的 sudoers 文件中有一个如下所示的条目:
user1 ALL=(user2) NOPASSWD: /scripts/dir/
这允许 user1 以 user2 的身份运行所有可执行文件,/scripts/dir/
而无需使用诸如 之类的命令输入密码sudo -u user2 /scripts/dir/script
。但是,我遇到了可执行文件期望在 user2 的环境($PATH, $DISPLAY
等)中运行的问题。 user1 可以通过运行类似sudo -iu user2 /scripts/dir/script
模拟登录 shell 的内容来完成此操作,但是使用上面的 sudoers 条目,这不起作用,系统会提示他们输入密码。是否有 sudoers 条目允许 user1 运行此命令,或者至少能够在运行命令时获取 user2 的 .bashrc、.cshrc 等?
我找到了该SETENV
选项,但这允许 user1 保留其现有环境,而不是采用 user2 的环境。我可以source /home/user2/.bashrc
接着做sudo -Eu user2 /scripts/dir/script
;这将为 user1 user2 的环境提供该选项将保留的环境-E
,但这假设 user1 具有对该.bashrc
文件的读取访问权限,并且该脚本不会尝试执行 user1 无权运行的任何命令。
sudoers 手册页对-i
选项进行了以下说明sudo
:
作为一种特殊情况,如果指定了 sudo 的 -i 选项(初始登录),则无论 env_reset 的值如何,sudoers 都会初始化环境。 DISPLAY、PATH 和 TERM 变量保持不变; HOME、MAIL、SHELL、USER 和 LOGNAME 根据目标用户设置。在 AIX(以及没有 PAM 的 Linux 系统)上,还包括 /etc/environment 的内容。在 BSD 系统上,如果启用了 use_loginclass 标志,则还会应用 /etc/login.conf 中的 path 和 setenv 变量。所有其他环境变量都被删除。
这似乎表明可以-i
通过某些 sudoers 配置提供该选项,也许可以通过授予 user1 运行ALL
命令的权限或专门允许-i
sudoers 中的选项,但我希望有一种更细粒度的方法来实现这一点。另外,它似乎表明PATH
并且DISPLAY
将来自 user1 的环境,这不是我想要的。
当然,我可以为 user1 授予比所需更多的权限来完成此操作,但这会带来安全风险。
答案1
因此,我找不到执行此操作的安全方法,因此我最终使用SETENV:
sudoers 条目中的选项,然后在以 user1 身份发出命令之前,我获取 user2 的源.bashrc
并-E
在调用 sudo 时提供该选项。这不是完成我想做的事情的安全方法,因为 user1 可以设置其PATH
环境变量,以允许他们以 user2 身份执行任意可执行文件。