Ejecutar un script como root en cada inicio de sesión ssh

4

¿Hay alguna forma posible de ejecutar un script, por ejemplo? abc.sh; como root ¿Usuario en cada inicio de sesión en mi sistema a través de SSH?

He pasado por una pregunta similar el cual dice agregar la ejecución del script a .bashrc expediente. Esto no es de mucha ayuda ya que tendría que agregarlo al archivo de configuración de cada usuario. Además, todavía tendrían la capacidad de eliminarlo.

La ejecución como root no es tan importante como negar a los usuarios el poder de detener su ejecución. El sistema operativo es debian, si eso ayuda de alguna manera.

hjpotter92
fuente

Respuestas:

1

Esta es una respuesta tardía, pero puede ejecutarla en cada inicio de sesión Y hacer que se ejecute como root (o cualquier otro usuario que desee), haciendo lo siguiente:

  1. Escriba su secuencia de comandos, con los comandos que desea ejecutar como root, y guárdelo, por ejemplo. como /path/to/root-script.sh .
  2. Hacer que root (o el usuario deseado) sea el propietario del script.

    chown root:root /path/to/root-script.sh`
    
  3. Establezca el bit setuid en el script, con otros permisos deseados. (Asegúrate de que no se pueda escribir universalmente, etc.)

    chmod 4755 /path/to/root-script.sh
    

    los 4 significa establecer el bit setuid, que hará que el script se ejecute como el propietario del script. Esto es lo que sudo Se utiliza para garantizar la ejecución como root.

  4. Para asegurarse de que se ejecuta en cada inicio de sesión, ejecute el conjunto de bits adherentes root-script.sh desde dentro /etc/profile . los /etc/profile debe ejecutarse independientemente del shell utilizado por el usuario. Tenga en cuenta que esto solo se aplicará a los inicios de sesión interactivos sin embargo.

Editar . Como lo señaló Scott en los comentarios, esta solución NO funciona generalmente en ningún sistema moderno con cualquier secuencia de comandos shebang que no sea Perl & lt; 5.12.0. Los núcleos modernos ignorarían los scripts con un bit setuid a menos que hayan sido parcheados, lo cual no sería recomendado por razones de seguridad.

Por el contrario, setuid solo funciona generalmente en binarios compilados y [versiones antiguas de Perl] [ https://stackoverflow.com/questions/21597300/can-i-setuid-for-perl-script] que puede usar (Perl & lt; 5.12.0) con suidperl.

Esta pregunta de Unix / Linux SE tiene una respuesta completa de por qué setuid se ignora para los scripts de shebang, con su resumen TL; DR:

Setuid Shebang es inseguro pero generalmente ignorado. Si ejecuta un programa   con privilegios (ya sea a través de sudo o setuid), escriba código nativo o   Perl, o inicie el programa con un envoltorio que desinfecte el   entorno (como sudo con la opción env_reset).

hilcharge
fuente
Probé esto en manjaro 17.x (ejecutando el kernel de Linux 4.14.x) y el comando no se ejecutó. Estoy tratando de correr /home/user/bin/script como raíz Después de hacer los pasos 1-3 anteriores, intenté agregar una línea con /home/user/bin/script a /etc/profile así como reemplazarlo con sudo /home/user/bin/script. En ambos casos no tuvo el efecto deseado. Qué estoy haciendo mal ?
koushik
Me acaban de decir que no tengo permiso para ejecutar el script cuando intento esto
jamzsabb
1
(1) Buen trabajo para conseguir el nombre del bit correcto; la 1000 poco es, de hecho, el bit pegajoso. Sin embargo, eso es no lo mismo que el bit setuid (eso sería 4000 ) que es la que hace que un programa se ejecute como propietario del programa. (2) Pero no importa. El bit setuid no ha funcionado para scripts desde el milenio anterior, más o menos. (3) Además, si chmod un archivo para 1750 (con root:root propiedad), entonces solo la raíz o un usuario en el grupo raíz podrán ejecutarlo.
Scott
Gracias @Scott, editado para referirse correctamente a bit setuid en lugar de bit adhesivo y permisos correctos. También mencionó que los núcleos modernos no los ejecutarán como root, a excepción del antiguo Perl.
hilcharge
2

Podría agregar la llamada a /etc/bash.bashrc: esto se procesa en cada inicio de sesión de Bash, por lo que, si los usuarios usan Bash como su shell, debería ejecutar el script.

Craig Watson
fuente
3
.bashrc solo se obtiene cuando Bash se ejecuta como un shell sin inicio de sesión, por lo que es posible que desee utilizar /etc/profile?
slhck
1

OpenSSH soporta el ForceCommand variable de configuración que podría establecerse en la ruta de un script que

  1. Hace algo administrativo - ver más abajo para más detalles.
  2. Llamadas

    $(SHELL) -c "$SSH_ORIGINAL_COMMAND"
    

    o

    eval "$SSH_ORIGINAL_COMMAND"
    

    después de eso, para realizar realmente la tarea que el usuario tenía previsto realizar.

Ahora el problema es que el comando forzado se ejecuta con las credenciales del usuario que ha iniciado sesión. Para combatir esto, es suficiente usar algún tipo de IPC para comunicarse con un proceso daemon, ejecutándose como root. Sockets de dominio Unix Parece ser la mejor opción para mí, ya que en realidad permite transferir las credenciales antes de que tenga lugar el intercambio de datos real (utilizando el getsockopt(SO_PREERCRED) llamada). El inconveniente es que tendrá que escribir un par de herramientas para hacerlo (bueno, la parte del cliente podría ser manejada por socat ).

Ver también este hilo .

kostix
fuente