Cambiar la configuración de red mediante programación sin root

1

Quiero cambiar las configuraciones de red como dhcp, dirección IP, etc. programáticamente.

Pero lo que no quiero es ejecutar mi aplicación como root. Entonces mi pregunta es: ¿Cuál sería un enfoque común para resolver eso? ¿Es esto posible?

¿Hay algún grupo al que se le permita hacer eso sin obtener ningún otro derecho? ¿O debería 'cortar' los archivos de configuración a un grupo especial y agregar al usuario a ese grupo?

Relacionado con esto (si eso está fuera del tema, dígame y abriré otra pregunta): El objetivo es un dispositivo incrustado y la aplicación debería ser la única a la que el usuario pueda acceder. ¿Hay alguna buena (mejor) práctica? ¿Debo crear un usuario especial para esa aplicación? Cualquier pista es apreciada.

exiliar
fuente

Respuestas:

2

Puede establecer capacidades en su programa. Esto le permitiría realizar ciertas tareas privilegiadas sin la necesidad de ejecutarse completamente como root. La capacidad en cuestión aquí es CAP_NET_ADMIN:

CAP_NET_ADMIN
    Perform various network-related operations:
     * interface configuration;
     * administration of IP firewall, masquerading, and accounting;
     * modify routing tables;
     * bind to any address for transparent proxying;
     * set type-of-service (TOS)
     * clear driver statistics;
     * set promiscuous mode;
     * enabling multicasting;
     * use  setsockopt(2)  to set the following socket options: SO_DEBUG, SO_MARK,
       SO_PRIORITY (for a priority outside the range 0 to 6), SO_RCVBUFFORCE,  and
       SO_SNDBUFFORCE.

Encontrará más información sobre las capacidades en las páginas de manual capabilities(7)y setcap(8).

Para asegurar esto aún más, en caso de que solo necesite un subconjunto específico de usuarios para poder ejecutar este programa, puede poner a esos usuarios en un grupo, chgrpsu programa en este grupo y chmodtambién para hacerlo 0750.

Andreas Wiese
fuente
Eso podría ser interesante para mí. No tengo suficiente reputación para votar, lo siento.
Exilit
Tengo curiosidad sobre el manejo de objetos compartidos. El manual solo habla de hilos. Entonces, ¿tengo razón en que establecer la capacidad de un SO no tiene ningún efecto en el código ejecutado? Por lo que yo entiendo, el código del objeto compartido se ejecuta con las capacidades heredadas del hilo en el que se ejecuta el objeto, ¿verdad?
exilit
Creo que las capacidades solo tienen efecto en los ejecutables. Fraseología difícil, hrm ... esas cosas con funciones main (). ;)
Andreas Wiese
Entonces, ¿un objeto compartido heredaría capacidades de la "cosa con la función main ()" :)?
exilit
Por lo que puedo ver ... sí.
Andreas Wiese
1

Si está utilizando NetworkManager en su computadora, puede usar NM-CLI .

nmcli es una herramienta de línea de comandos para controlar NetworkManager y obtener su estado. No pretende ser un reemplazo de nm-applet u otros clientes similares. Más bien es una utilidad complementaria para estos programas. El uso principal de nmcli es en servidores, máquinas sin cabeza o solo para usuarios avanzados que prefieren la línea de comandos.

   The use cases comprise:

   --  Initscripts: ifup/ifdown can utilize NetworkManager via nmcli
       instead of having to manage connections itself and possible
       interfere with NetworkManager.

   --  Servers, headless machines: No GUI is available; then nmcli is used
       to talk directly to NetworkManager and control only system-wide
       connections.

   --  User sessions: For this case, nmcli can talk to nm-applet to find
       user connections.  It can still talk directly to NetworkManager for
       manipulating these connections.  As nmcli doesn't have direct
       access to user configuration data in GConf, nm-applet handles that
       itself.  That may, for example, cause the applet to pop up keyring
       dialogs when secrets are needed.
Piskvor
fuente
0

Si su dispositivo objetivo lo admite, el mecanismo setuid podría ser el camino a seguir.

http://en.wikipedia.org/wiki/Setuid

Algunos programas necesitan privilegios de root, y lo que haces con setuid es que el archivo ejecutable pertenece a root y tiene el setuid-bit establecido, por lo que cuando otro usuario lo ejecuta, el ejecutable se ejecuta con privilegios de root.

Pero también tenga en cuenta que

Debido a posibles problemas de seguridad, muchos sistemas operativos ignoran el atributo setuid cuando se aplican a los scripts de shell ejecutables.

Jaspe
fuente
Gracias. Pero ya he pensado en setuid y esa no es una opción para mí porque no quiero ejecutar otro programa. En ese caso, podría simplemente usar ip o ifconfig con setuid bit set
exilit