https://foro.gambas-es.org/viewtopic.php?f=5&t=7720&p=46399#p46399
-----------------------------------
shordi
Martes, 17 Septiembre 2019, 20:58

Simón Dice: Sudo Sin Clave Desde Un Programa Gambas
-----------------------------------
Os presento una técnica que desarrollé hace un tiempo y que utilizamos en mi empresa para administrar las máquinas clientes. 
El caso es que tú distribuyes, o instalas por tí mismo, tu paquete de instalación en las máquinas de los clientes y al principio muy bien, pero luego, por ejemplo, subes versiones nuevas al repositorio y te encuentras que los clientes no han actualizado las máquinas. 

Hay que actualizar, pero eso es cuestión de root

O por los motivos que sea, quieres que la contraseña que el usuario introduce en tu aplicación coincida con la que tiene en el Sistema Operativo.

Pero consultar esa clave es cuestión de root

O has desarrollado un "programa auxiliar" (copias de seguridad, por ejemplo) que quieres que también esté instalado en la máquina del Cliente, que no sabe instalar nada y no entiende instrucciones sencillas por teléfono (no hablemos de por escrito).

Hay que instalarlo, pero eso es cuestión de root.

O quieres controlar qué software se ha instalado y que está estorbando el funcionamiento de tu programa y desinstalárselo si eso incumple el contrato que hiciste con él.

Pero desinstalar es cosa de root

Bien, os voy a mostrar cómo, desde mis programas ejecuto acciones de root con sudo sin que se me pida la clave nunca.

El truco es:
El sistema de sudo permite la relajación de ciertos comandos para no pedirles la clave. El más sencillo lo veis todos los días: Si ejecutas "apt update" en la consola, el sistema no te lo permite y si lo haces con sudo te pide la clave. Entonces ¿Cómo demonios lo hace el gestor de actualizaciones para decirte que hay actualizaciones pendientes? ¿Cómo es que a ése programa no se le pide la clave para eso?

La explicación es: Sudo permite que ciertos comandos concretos tengan "autorizaciones especiales" al ser ejecutados. No voy a dar más explicaciones sobre el tema que san gúgul está lleno de ellas. Basta saber que si ubicamos un fichero llamado "sidi" con éste contenido

[quote]Cmnd_Alias SIDI = /tmp/sididar
ALL ALL = (root) NOPASSWD:SIDI[/quote]

en la carpeta /etc/sudoers.d, le estamos diciendo al sistema que el comando /tmp/sididar, se ejecuta como root y no se le pide la password. Sí, ya sé que ese comando no existe, pero a ello vamos.
(por cierto SIDI por lo de Simón Dice y sididar por SImon DIce Do As Root) 

Basándonos en eso hacemos lo siguiente:

A) FICHERO SIDI:

Creamos este fichero "sidi" con el contenido de arriba en la carpeta .hidden de nuestro proyecto.
A la hora de crear el paquete de instalación .deb, en la pantalla 8 ponemos ésto:
 [img]https://foro.gambas-es.org/files/images/38/captura_de_pantalla_de_2019_09_17_19_24_56.png[/img] 
Con ésto, al instalar nuestro programa (momento en que sí se le/nos pedira la clave de root, claro), además de instalar nuestro proyecto, copiará sidi en la carpeta de destino.

B) El COMANDO /tmp/sididar
Una vez instalado sidi, éste comando, llamado con sudo, se ejecutará sin contraseña.
Este comando es, en realidad, un shell script que tiene el siguiente contenido:

[quote]#/bin/bash
$1[/quote]

Es decir, simplemente lanza al shell el primer parámetro que reciba.

Supongo que ya pilláis la idea: Si creáis en /tmp el fichero sididar con permisos de ejecución y, por ejemplo tecleáis 

[quote]sudo /tmp/sididar apt update[/quote]

El sistema se actualizará sin pedir clave.

Abajo os adjunto un ejemplo que compara la clave tecleada con la clave del usuario en el sistema fichero /etc/shadow que es de root con permisos 640

La copia de sidi en /etc/sudoers.d, se hace en el momento de la instalación del programa vía .deb en el ordenador (evidentemente para probarlo en el IDE tendréis que copiarlo en dicha carpeta vosotros mismos)

 /tmp/sididar se crea en tiempo de ejecución para la ejecución del comando que nos interese y se elimina inmediatamente después para no dejar "agujeros" de seguridad abiertos.

Esto es hecho por una función que os paso dentro de un módulo en el proyecto de ejemplo y que permite ejecutar comandos recibiendo la salida de la consola en una variable; ejecutar comandos despreciando la salida de la consola y ejecutar comandos en background (&) y continuar con le ejecución de nuestro proyecto.

Esta técnica es, indudablemente, un agujero en la seguridad de la máquina que se instale, pero no tan grave como pudiese parecer. 

En primer lugar el que al comando /tmp/sididar no se le pida la clave, no quiere decir que pueda ser usado por alguien que no pertenece al grupo sudo, con lo que lo que sea que se ejecute con esta técnica es algo que él mismo podría haber ejecutado tranquilamente. El hueco reside en aquellos usuarios que perteneciendo al grupo de sudoers, tienen configurado su sesión para que no le pida la clave al inicio, lo que deja el ordenador abierto para todo aquél que se ponga a hurgar.
Puede ser también un problema para los ordenadores físicamente accesibles que un usuario deja sin bloquear mientras se pira al desayuno o lo que sea.

Por otra parte, es una técnica que inventé yo y que aquí hago pública por primera vez, y por tanto no conocida de momento (aunque sospecho que he vuelto a inventar la rueda) aunque cualquier usuario avanzado en el funcionamiento de Linux (y cargado de malas intenciones el muy hijoputa) puede llegar a adivinar echando un ojo a la carpeta /etc/sudoers.d

En resumen, una vez instalado el sistema, la responsabilidad de la seguridad recae aún más si cabe, en el usuario, al que tendremos que aleccionar y amenazar con las penas del infierno si descuida su clave o deja el aparato abierto.

Eso sí, nuestros programas, con ésto, se convierten en todopoderosos en la máquina donde estén instalados.

Perdón por el ladrillo.


