Comment utiliser les arguments de commande avec Cmnd_Alias ​​dans les sudoers?

36

Comment spécifier les arguments de commande dans sudoers? En tant qu'arrière-plan, la awscommande est en fait une passerelle vers de nombreux sous-systèmes et je souhaite limiter l'utilisateur à l'exécutionaws s3 cp ...any other args...

Quand j'essaye ce qui suit dans /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

Le shell demande malheureusement un mot de passe

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

Si je supprime la commande args dans Cmnd_Alias, elle se déroule comme souhaité (sans invite de mot de passe), mais les autorisations sont beaucoup trop larges. Alors, quelle est la bonne façon de limiter à certains types d’invocations de commandes ?

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

ensuite

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

Merci beaucoup.

Dinesh
la source
Pourquoi avez-vous / usr / local / bin / aws, / usr / local / aws / bin / aws? Je veux dire que vous avez répété la commande deux fois dans la même ligne?
Mohammed Noureldin

Réponses:

47

Vous n'avez utilisé aucun caractère générique, mais vous avez fourni deux arguments. Par conséquent, sudorecherche les commandes exactement telles qu’elles sont écrites (à l’exception de 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).

Essayez quelque chose comme:

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

Notez 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. 

Ainsi, un seul caractère générique est nécessaire par commande.

muru
la source
1
+1 pour une explication succincte et le partage des connaissances, merci.
Dinesh
1
Notez que sudo ne respecte pas correctement la séparation des arguments pouvant être utilisés comme exploits dans certains cas, voir unix.stackexchange.com/a/279142/43920 . Ainsi, au lieu de spécifier /usr/local/bin/aws s3 cpdans sudoers, il est plus sûr de le remplacer par un script (accessible en écriture uniquement par root).
pcworld
6

Identique à @muru, mais pour ceux qui aiment un exemple complet de travail:

# 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

Alors que /sbin/cmd1, /sbin/cmd2peut être toute autre commande.

Le but de ECHO_CMDest de présenter ce sudo echo X Aqui demandera la phrase secrète, alors que ce sudo echo A Xn’est pas le cas, et de vous permettre de gagner en confiance grâce à une expérience aussi simple.

(On a supposé que l'écho est assis /bin/echo, pour vérifier où il se trouve sur votre système, essayez whereis echo)

Grzegorz Wierzowiecki
la source
Oui, il y a du /bin/echobinaire, mais la plupart des shells ont aussi une fonction intégrée echoqui sera utilisée à la place de ce binaire si vous ne fournissez pas de chemin complet.
Marki555