¿Cómo puedo permitir que un usuario edite un archivo de sistema específico normalmente restringido a root?

8

Estoy tratando de escribir /etc/network/interfacescon un usuario que no tiene privilegios de root.

La razón para querer escribir en esto sería permitirle al usuario establecer una IP estática ya que estoy ejecutando un servidor de línea de comando solamente. ¿Qué permiso necesito dar al usuario etc/sudoers?

No quiero que el usuario tenga permisos de root completos. Solo capacidad de editar este archivo.

Keith
fuente

Respuestas:

25

En lugar de usar sudo, simplemente configure una ACL en el archivo:

$ 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

Ahora el archivo es propiedad de 'root' pero el usuario 'white' puede leerlo y escribirlo. El usuario 'blanco' ahora puede usar su editor favorito para editar el archivo.

Jeff White
fuente
Un poco confuso. Es /var/tmp/foo= /etc/network/interfaces? Nunca he visto realmente lo que estás tratando de decir allí, soy bastante nuevo en Linux.
Keith
Es solo un archivo. Puede usar el archivo que desee.
Jeff White
1
Agradable. Pensé que las ACL solo podían usarse para restringir los permisos y no para otorgarlos, ¡es bueno saber que no es cierto!
Rmano
No parece ser compatible con WSL:setfacl: /etc/logrotate.conf: Operation not supported
mpen
8

Prepare un script que realice la edición que desee, por ejemplo, un script que escriba el archivo correcto con la IP estática (qué poner en este script está fuera del alcance de estas preguntas y respuestas). Llamemos a este script /root/set_static_ip. (1)

Editar /etc/sudoers(2) (con visudoes mejor, comprueba la cordura, es muy difícil recuperar un sistema con un archivo sudoers no válido, incluso imposible desde el remoto (3)), y agregar

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Ahora ese usuario puede usar sudo /root/set_static_ip sin ninguna contraseña solicitada, y el script se ejecutará con todos los privilegios; No se permitirá ningún otro comando.

Si desea que el usuario simplemente reemplace un archivo con lo que quiera, el script simplemente podría ser (llámelo /root/unsafe-overwrite-interface)

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

... y le dice al usuario que edite /tmp/temp-iface.txty luego ejecute sudo /root/unsafe-overwrite-interface--- habilitándolo en sudoers como se especifica anteriormente. O puede agregar al usuario a una lista de ACL y darles permiso de escritura en el archivo específico .

Pero note que si usted no comprueba el contenido del archivo para la seguridad, el caos va a suceder, ya sea intencional o no intencional.


Notas al pie :

(1) este script debe ser lo más seguro posible. Verifique las entradas, etc. Se ejecutará con permisos completos.

(2) en la instalación moderna de sudo, puede agregar un archivo al /etc/sudoers.d/directorio que es mejor --- sobrevivirá a las actualizaciones.

(3) Normalmente mantengo un terminal con una sesión de root abierta ( sudo -i) cuando modifico el mecanismo de sudoers y una copia de seguridad a mano.

Rmano
fuente
El único problema con esto es que la configuración de IP estática debe cambiarse bajo demanda. Mi comprensión del guión que recomiendas básicamente reescribiría el /etc/network/interfacesarchivo a lo que sea /root/set_static_ip. A menos que pueda hacer un script que le pida al usuario que ingrese la dirección IP, la puerta de enlace, etc. Esto no es lo suficientemente bueno para hacer.
Keith
Puede escribir un script que acepte parámetros ... pero sí, esta es la forma más segura. Si deja que el usuario edite el archivo a ciegas, ¿qué sucede si comete un error? Puede tener su servidor fuera del alcance ... por lo que el script no solo necesita preguntar de alguna manera los parámetros, sino también verificar si son seguros.
Rmano
3
En cuanto a /etc/sudoers, es visudo, no sudoedit.
saiarcot895
Si alguien hace este tipo de preguntas, probablemente esté más allá de sus habilidades escribir un script bash seguro. Hay una razón por la que no puede configurar root una secuencia de comandos bash.
rox0r