Comment spécifier des arguments de commande dans sudoers? En arrière-plan, la commande aws
est en fait une passerelle vers tout un tas de sous-systèmes et je veux restreindre l'utilisateur à exécuter uniquement aws s3 cp ...any other args...
Lorsque j'essaie 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 s'exécute comme vous le souhaitez (sans invite de mot de passe), mais l'autorisation est beaucoup trop large. Alors, quelle est la bonne façon de se limiter à certains types d'appels de commandes.
Cmnd_Alias AWSS3_CMD = /usr/local/bin/aws, /usr/local/aws/bin/aws
Alors
$ Sudo -u gbt-ops aws s3 cp helloworld s3://my-bucket/hw.1
...happy
Merci beaucoup.
Vous n'avez utilisé aucun caractère générique, mais avez fourni deux arguments. Par conséquent, Sudo
recherche les commandes exactement telles qu'elles sont écrites (à l'exception de la recherche de chemin) (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.
Identique à @muru, mais pour ceux qui aiment l'exemple complet:
# 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
Tandis que /sbin/cmd1
, /sbin/cmd2
peut être n'importe quelle autre commande.
Le but de ECHO_CMD
est de présenter que Sudo echo X A
demandera une phrase secrète, tandis que Sudo echo A X
non, et pour vous permettre de gagner en confiance grâce à une expérience aussi simple.
(On a supposé que l'écho se trouvait dans /bin/echo
, pour vérifier où il se trouve sur votre système, essayez whereis echo
)