Como uso argumentos de comando com Cmnd_Alias ​​em sudoers?

36

Como especificar argumentos de comando em sudoers? Como pano de fundo, o awscomando é na verdade um gateway para vários subsistemas e quero restringir o usuário a executar apenasaws s3 cp ...any other args...

Quando tento o seguinte em /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

Infelizmente, o shell solicita senha

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

Se eu remover o comando args em Cmnd_Alias, ele fluirá conforme desejado (sem solicitação de senha), mas a autorização será muito ampla. Portanto, qual é a maneira correta de restringir apenas a certos tipos de invocações de comando .

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

Então

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

Muito obrigado.

Dinesh
fonte
Por que você possui / usr / local / bin / aws, / usr / local / aws / bin / aws? Quero dizer que você repetiu o comando duas vezes na mesma linha?
Mohammed Noureldin

Respostas:

47

Você não usou nenhum curinga, mas forneceu dois argumentos. Portanto, sudoprocura comandos exatamente como escritos (exceto pesquisa de caminho) (de 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).

Tente algo como:

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

Observe que:

 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. 

Portanto, apenas um curinga é necessário por comando.

muru
fonte
1
+1 para uma explicação sucinta e para compartilhar conhecimento, obrigado.
Dinesh
1
Observe que o sudo não respeita adequadamente a separação de argumentos que podem ser usados ​​para explorações em alguns casos, consulte unix.stackexchange.com/a/279142/43920 . Portanto, em vez de especificar /usr/local/bin/aws s3 cpem sudoers, é mais seguro substituí-lo por um script (somente gravável por raiz).
Pc11
6

O mesmo que @muru, mas para quem gosta de exemplo completo de trabalho:

# 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

Enquanto /sbin/cmd1, /sbin/cmd2pode haver outros comandos.

O objetivo de ECHO_CMDé apresentar que sudo echo X Asolicitará a senha, enquanto sudo echo A Xnão estiver , e permitir que você ganhe confiança por meio de um experimento tão simples.

(Supunha-se que o eco se encaixa /bin/echo, para verificar onde ele está no seu sistema, tente whereis echo)

Grzegorz Wierzowiecki
fonte
Sim, há /bin/echobinário, mas a maioria dos shells também possui uma função interna echoque será usada no lugar desse binário se você não fornecer o caminho completo.
Marki555 18/06