Ces derniers temps, j'ai utilisé sudo
pour faire du contrôle d'accès, donc j'ai dû réviser les bases :
sudo
ne prend pas en charge les regex dans sa configuration, uniquement les glob patterns, un sous-ensemble de caractères substituables. Il n'est donc pas possible d'indiquer la répétition d'un ou de plusieurs caractères avec « + », « * » ou « {} », par exemple ;sudo
. Parfois à cause des programmes à qui l'on donne des droits avec sudo
(exemple avec less, mais on peut faire la même avec vim
qui permet d'exécuter des commandes ;)), très souvent à cause de la configuration de sudo
.Exemples :
toto ALL=(titi) NOPASSWD: /usr/bin/id
: l'utilisateur toto peut se faire passer pour l'utilisateur titi afin d'exécuter la commande id
sans avoir à saisir un mot de passe. Tous les paramètres du programme id
sont utilisables (« - g », par exemple). Plus largement, tous les arguments sont possibles : autoriser less ou cat donne la possibilité de consulter tooous les fichiers du système en se faisant passer pour titi. C'est pourquoi il ne faudrait jamais avoir une entrée dans la configuration de sudo
de la forme toto ALL=(root) NOPASSWD: /usr/bin/id *
si le but est d'autoriser tous les arguments d'une commande (lire les points suivants pour connaître les dangers de l'entrée sudo
énoncée à l'instant) ;toto ALL=(titi) NOPASSWD: /usr/bin/id -[gu]
(pas « -(g|u) » puisque sudo ne prend pas en charge les regex) : toto peut lancer id -u
et id -g
sans mot de passe en se faisant passer pour titi ;toto ALL=(root) NOPASSWD: /usr/bin/ssh root@cluster[0-9] id
: toto peut se faire passer pour root afin de se connecter, en SSH, aux machines nommées clusterX où X doit être entre 0 et 9 inclus. Pour autoriser les dizaines (« clusterXX ») : « cluster[0-9][0-9] ». Surtout pas « cluster[0-9]* » : il ne s'agit pas d'une regex, donc « * » n'agit pas sur le groupe précédent afin de le répéter 0 ou n fois : il autorise clusterX (où X = entre 0 et 9, ça ne change pas) suivi de n'importe quoi (des chiffres, des lettres, des espaces, etc.). Toto peut donc exécuter : sudo ssh root@cluster10 'rm -rf / ; id'
;toto ALL=(root) NOPASSWD: /usr/bin/ssh root@web[0-9]*.monorganisation.example id
: toto pourra exécuter sudo ssh root@web1 rm -rf /#.monorganisation.example id
. # = commentaire, tout ce qui suit ne sera pas exécuté. Il faudra juste définir le nom web1 dans /etc/hosts (sauf s'il y a une instruction search
ou domain
dans /etc/resolv.conf).Il y a un cas que je ne sais pas résoudre sur le plan de la lisibilité :
toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh
;toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a start, /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a stop
. Mais plus il y a d'arguments et de valeurs, plus la configurarion de sudo
devient lourde, longue et illisible ;toto ALL=(root) NOPASSWD: /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a start -b [a-z][a-z][a-z][a-z], /usr/bin/ssh root@srv.monorganisation.example /usr/local/bin/script.sh -a stop
;sudo
devient illisible.