如何在 sudoers 中将命令参数与 Cmnd_Alias 一起使用?

如何在 sudoers 中将命令参数与 Cmnd_Alias 一起使用?

如何在 sudoers 中指定命令参数?作为背景,aws命令实际上是通往一大堆子系统的网关,我想限制用户只能运行aws s3 cp ...any other args...

当我尝试以下操作时/etc/sudoers

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp, /usr/local/aws/bin/aws s3 cp
gbt1 ALL=(gbt-ops) NOPASSWD: AWSS3_CMD

不幸的是 shell 提示输入密码

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
gbt-ops's password:

如果我删除 Cmnd_Alias 中的命令参数,那么它会按需要流动(没有密码提示),但授权太广泛了。那么,限制仅某些类型的命令调用的正确方法是什么

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws

然后

$ sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy

多谢。

答案1

您没有使用任何通配符,但提供了两个参数。因此,sudo查找与写入完全相同的命令(路径查找除外)(来自man 5 sudoers):

 If a Cmnd has associated command line arguments, then the arguments in
 the Cmnd must match exactly those given by the user on the command line
 (or match the wildcards if there are any).

尝试类似的方法:

Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws s3 cp *, /usr/local/aws/bin/aws s3 cp *

注意:

 Wildcards in command line arguments should be used with care.  Because
 command line arguments are matched as a single, concatenated string, a
 wildcard such as ‘?’ or ‘*’ can match multiple words. 

因此,每个命令只需要一个通配符。

答案2

与@muru相同,但对于那些喜欢完整工作示例的人:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=/bin/echo A *,/bin/echo B *

# Make USER run specific commands on given HOSTNAME
# USER_NAME 

#userx
userx ALL=(root) NOPASSWD: /sbin/cmd1,/sbin/cmd2,ECHO_CMD

/sbin/cmd1,/sbin/cmd2可以是任何其他命令。

的目的ECHO_CMD是展示sudo echo X A将​​要求密码短语,而sudo echo A X不是要求密码短语,并让您通过这样简单的实验获得信心。

(假设 echo 位于/bin/echo,要检查它在您系统上的位置,请尝试whereis echo

答案3

你也可以在 sudoers 中使用正则表达式。

这将允许/usr/bin/apt update upgrade and auto-remove在没有密码的情况下运行,但如果您指定 .deb 名称,否则apt install它仍然会提示输入密码。

Cmnd_Alias UPDATES = /usr/bin/apt (update|upgrade|auto-remove)
%sudo ALL=(ALL:ALL) NOPASSWD: UPDATES
%sudo ALL=(ALL:ALL) ALL

答案4

我知道这是旧的,但可以说这是cat代替的echo,并且有C一个用户无权访问的文件。您将用户添加到 sudoers 中,这允许:

# Cmnd alias specification
Cmnd_Alias ECHO_CMD=cat A *,cat B *

然后我可以通过运行以下命令来访问文件 C:

sudo echo A C

因为 C 正确遵循通配符语法。我认为这是在 sudo 命令中使用通配符时安全性较差的一个很好的例子。我会非常小心地使用这种用法,并考虑通配符可能产生的任何可能的变化!

相关内容