Comment puis-je autoriser un utilisateur à modifier un fichier système spécifique normalement limité à root?

8

J'essaie d'écrire /etc/network/interfacesavec un utilisateur qui n'a pas de privilèges root.

La raison de vouloir écrire sur ceci serait de permettre à l'utilisateur de définir une adresse IP statique car j'exécute un serveur en ligne de commande uniquement. De quelle autorisation ai-je besoin pour donner à l'utilisateur etc/sudoers?

Je ne veux pas que l'utilisateur ait des autorisations root complètes. Juste la possibilité de modifier ce fichier.

Keith
la source

Réponses:

25

Au lieu d'utiliser sudo, définissez simplement une ACL sur le fichier:

$ ls -l /var/tmp/foo
-rw-rw---- 1 root root 4 Jul 31 15:26 /var/tmp/foo
$ sudo setfacl -m u:white:rw /var/tmp/foo
$ whoami
white
$ cat /var/tmp/foo
bar

Maintenant, le fichier appartient à «root», mais l'utilisateur «white» peut y lire et y écrire. L'utilisateur «blanc» peut désormais utiliser son éditeur préféré pour éditer le fichier.

Jeff White
la source
Un peu confus. Est /var/tmp/foo= /etc/network/interfaces? Je n'ai jamais vraiment vu ce que vous essayez de dire là-bas, je suis assez nouveau sur Linux.
Keith
Ce n'est qu'un fichier. Vous pouvez utiliser le fichier que vous souhaitez.
Jeff White
1
Agréable. Je pensais que les ACL ne pouvaient être utilisées que pour restreindre les autorisations et non pour les accorder - agréable de savoir que ce n'est pas vrai!
Rmano
Ne semble pas être pris en charge sous WSL:setfacl: /etc/logrotate.conf: Operation not supported
mpen
8

Préparez un script qui fait l'édition que vous voulez, par exemple un script qui écrit le bon fichier avec l'IP statique (ce qu'il faut mettre dans ce script sort du cadre de ce Q&R). Appelons ce script /root/set_static_ip. (1)

Edit /etc/sudoers(2) (avec visudoc'est mieux, il vérifie la santé mentale, il est très difficile de récupérer un système avec un fichier sudoers invalide, même impossible à distance (3)), et ajoutez

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Maintenant que l'utilisateur peut utiliser sudo /root/set_static_ip sans mot de passe demandé, et le script s'exécutera avec tous les privilèges; aucune autre commande ne sera autorisée.

Si vous voulez que l'utilisateur remplace simplement un fichier par ce qu'il veut, le script pourrait simplement être (appelez-le /root/unsafe-overwrite-interface)

#! /bin/bash -e
#
cp /tmp/temp-iface.txt /etc/network/interfaces 
exit 0

... et vous dites à l'utilisateur de modifier /tmp/temp-iface.txtpuis d'exécuter sudo /root/unsafe-overwrite-interface--- l'activation dans sudoers comme spécifié ci-dessus. Ou vous pouvez ajouter l'utilisateur à une liste ACL et lui accorder une autorisation d'écriture sur le fichier spécifique .

Mais notez que si vous ne vérifiez pas le contenu du fichier pour des raisons de sécurité, des ravages se produiront, intentionnels ou non.


Notes de bas de page :

(1) ce script doit être aussi sûr que possible. Vérifiez les entrées, etc. Il sera exécuté avec des autorisations complètes.

(2) dans une installation sudo moderne, vous pouvez ajouter un fichier au /etc/sudoers.d/répertoire qui est mieux --- survivra aux mises à jour.

(3) Je garde normalement un terminal avec une session root ouverte ( sudo -i) lorsque je modifie le mécanisme sudoers et une sauvegarde à portée de main.

Rmano
la source
Le seul problème est que les paramètres IP statiques doivent être modifiés à la demande. Ma compréhension du script que vous recommandez serait essentiellement de réécrire le /etc/network/interfacesfichier quel qu'il soit /root/set_static_ip. A moins que vous ne puissiez faire un script qui demande à l'utilisateur de saisir une adresse IP, une passerelle, etc ... Ce que je ne suis pas assez bon pour faire.
Keith
Vous pouvez écrire un script qui accepte des paramètres ... mais oui, c'est le moyen le plus sûr. Si vous laissez l'utilisateur éditer le fichier à l'aveugle, que se passe-t-il s'il fait une erreur? Vous pouvez avoir votre serveur hors de portée ... donc le script doit non seulement demander en quelque sorte les paramètres, mais aussi vérifier s'ils sont sûrs.
Rmano
3
En ce qui concerne /etc/sudoers, ce n'est visudopas le cas sudoedit.
saiarcot895
Si quelqu'un pose ce genre de question, il est probablement au-delà de ses compétences d'écrire un script bash sûr. Il y a une raison pour laquelle vous ne pouvez pas définir root un script bash.
rox0r