Как использовать аргументы команды с Cmnd_Alias ​​в sudoers?

36

Как указать аргументы команды в 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

Оболочка, к сожалению, запрашивает пароль

$ 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

Большое спасибо.

Динеш
источник
Почему у вас есть / usr / local / bin / aws, / usr / local / aws / bin / aws? Я имею в виду, вы повторили команду два раза в одной строке?
Мохаммед Нурельдин

Ответы:

47

Вы не использовали подстановочные знаки, но предоставили два аргумента. Поэтому sudoищет команды в точности как написано (исключая path-lookup) (from 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. 

Таким образом, для каждой команды требуется только один подстановочный знак.

Мур
источник
1
+1 за краткое объяснение и обмен знаниями, спасибо.
Динеш
1
Обратите внимание, что sudo неправильно соблюдает разделение аргументов, которые в некоторых случаях могут использоваться для эксплойтов, см. Unix.stackexchange.com/a/279142/43920 . Поэтому вместо указания /usr/local/bin/aws s3 cpsudoers безопаснее заменить его скриптом (доступным только для записи root).
pcworld
6

Так же, как @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)

Гжегож Вежовецкий
источник
Да, есть /bin/echoдвоичный файл, но большинство оболочек также имеет встроенную функцию, echoкоторая будет использоваться вместо этого двоичного файла, если вы не укажете полный путь.
Marki555