我们最近升级了 aws Linux 服务器实例类型。它仍然是 SLES 12 SP1。然而我注意到一些差异,其中一些令人困惑
$ sudo -u xyz cmd ...
<it asks for password, causing old scripts to break>
$ sudo -u xyz /path/to/cmd ...
<works>
$ sudo --version
Sudo version 1.8.10p3
Sudoers policy plugin version 1.8.10p3
Sudoers file grammar version 43
Sudoers I/O plugin version 1.8.10p3
$ uname -a
Linux ovcp6hana1 3.12.69-60.64.32-default #1 SMP Wed Feb 15 08:57:04 UTC 2017 (76392c8) x86_64 x86_64 x86_64 GNU/Linux
(sudoers 配置有一个 Cmnd_Alias 和“/path/to/cmd”的授权)
以前的版本曾经可以工作,但现在不行了,就好像路径之前会自动扩展,但不再自动扩展一样。
有什么办法可以让旧的表格发挥作用吗?谢谢。
- 编辑
我验证了它是完全相同的命令,即which xyz
扩展为/path/to/xyz
.
--编辑2
我想我发现了这个问题,但仍然没有办法与我的应用程序保持兼容。sudo
版本 1.7.6 和 1.8.10之间似乎存在差异。但我在 sudo 发行说明中没有找到这样的提及
我在运行 sudo 1.7 的旧服务器上创建了另一个具有类似权限的用户。具体特权如下。两个配置文件中的选项相匹配
#added in /etc/sudoers
#userA ALL=(userABC) NOPASSWD: /bin/bash, /usr/local/bin/aws
#with both sudo versions
userA$ sudo -u userABC bash -c "echo \$PATH"
/usr/bin:/bin:/usr/sbin:/sbin
userA$ sudo -u userABC bash -c "which aws"
/usr/bin/aws <<<< but this is not reached in either of the two cases
userA$ which aws
/usr/local/bin/aws <<<<<< this is the right binary
#with sudo version 1.7.6
userA$ sudo -u userABC aws
..the right binary runs, so path must have been set between check and run
#with sudo version 1.8.10
userA$ sudo -u userABC aws
failure! sudo asks for password of userABC
该程序/usr/bin/aws
进行某种包装。直到现在我还没有意识到(!)它的存在,但即使我暂时删除了这个程序,也没有对任何事情产生影响。
所以我对这个问题有了更好的理解,但仍然不知道除了更改应用程序之外是否还有其他选择。
答案1
当文件中指定可执行文件的完整路径的规则允许用户以另一个用户的身份执行命令时sudoers
,则也需要在命令行上使用该完整路径。
这是一项安全措施。
此外,如果文件中的命令sudoers
是使用命令行标志指定的,那么这些标志需要当您通过 调用命令时出现sudo
。
答案2
发生这种情况是因为您的sudoers
文件允许NOPASSWD
在调用可执行文件的显式路径时应用属性,但在您依赖路径搜索时则不允许应用属性;它可能会遇到不同的可执行文件。