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

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

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

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

решение1

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

Связанный контент