Ejecute el programa cada vez que alguien inicie sesión a través de SSH en un cuadro de Linux

10

Tengo un pequeño servidor SSH y me gustaría escribir un script para que se ejecute cada vez que alguien inicie sesión a través de SSH.

Ahora, ¿cómo voy a hacer eso?

Me gustaría que el script se ejecute cada vez que CUALQUIERA inicie sesión, y necesito tener acceso al menos al nombre de usuario de la persona que inició sesión y a la dirección IP desde la que inició sesión.

Pensé en usar /etc/bash.bashrc, pero ¿es una buena solución? Por ejemplo, ¿hay alguna forma en que un usuario pueda desactivar su uso y, por lo tanto, desactivar mi script? En caso afirmativo, ¿cuáles son mis otras opciones?

Gracias.

houbysoft
fuente
Esto solo funcionará si el usuario usa bash, por supuesto. No funcionará si los usuarios pueden seleccionar su propio shell.
Paŭlo Ebermann

Respuestas:

12

El mecanismo a utilizar depende de tus objetivos.

Si desea proporcionar algo conveniente o amigable para sus usuarios, entonces /etc/profilees lo suficientemente razonable si todos sus usuarios usan el mismo shell. Si desea que los comandos se ejecuten solo cuando inicie sesión a través de ssh, coloque los comandos en /etc/ssh/sshrc. (Si no le importa que los usuarios anulen los comandos con su propio ~/.ssh/rcarchivo).

Si desea obligar a un usuario a ejecutar un programa, y solo un programa , entonces la ForceCommandopción descrita por DigitalRoss es un buen enfoque. (Personalmente, limitaría aún más al usuario con un sistema de control de acceso obligatorio como AppArmor , SELinux , TOMOYO o SMACK , para garantizar que el programa no permita que un usuario escape. He trabajado en AppArmor durante diez años, así que ese es el herramienta que elegiría primero, pero las otras son buenas herramientas escritas por excelentes programadores).

Si solo desea que un programa se ejecute y no moleste al usuario de ninguna manera , entonces el mejor enfoque es usar el pam_exec(8)módulo, que no se puede omitir, funciona independientemente del shell y proporciona una capacidad fácil de ejecutar como usuario o como usuario cuenta del programa que realiza la autorización. La página de manual da el siguiente ejemplo:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.

Esto podría extenderse a ejecutar en auth, account, password, y sessionacciones; probablemente sessionsería mejor para ejecutar al iniciar sesión. Simplemente agregue una línea como:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

a su /etc/pam.d/sshdarchivo de control.

sarnold
fuente
Parece que el pam_execmódulo es exactamente lo que estoy buscando. ¡Gracias!
houbysoft
2
CUIDADO, si el comando que ejecuta sale con un código de salida distinto de cero, su inicio de sesión fallará y podría quedar bloqueado. Una forma de resolver esto es asegurarse de que haya otra 'sesión opcional' llamada con un módulo diferente que siempre tenga éxito.
gflarity
4

Las versiones más recientes de OpenSSH tienen una función de servidor llamada ForceCommand que le da control a un script en lugar de la operación (scp, ssh, ...) que el usuario pretendía. El script recibe el comando original, por lo que probablemente podría encadenarlo después de hacer lo que sea necesario.

Desde sshd_config (5):

ForceCommand

Fuerza la ejecución del comando especificado por ForceCommand, ignorando cualquier comando proporcionado por el cliente y ~ / .ssh / rc si está presente. El comando se invoca utilizando el shell de inicio de sesión del usuario con la opción -c. Esto se aplica a la ejecución de shell, comando o subsistema. Es más útil dentro de un bloque Match. El comando suministrado originalmente por el cliente está disponible en la variable de entorno SSH_ORIGINAL_COMMAND. Especificar un comando de `` internal-sftp '' forzará el uso de un servidor sftp en proceso que no requiere archivos de soporte cuando se usa con ChrootDirectory.

Utilicé esto una vez para anular scp y proporcionar una carga segura de gemas sin dar a cada usuario autorizado para cargar gemas acceso interactivo que no necesitaban ni deseaban.

DigitalRoss
fuente
3

Una forma sería usar syslog-ng como un demonio syslog y configurarlo para ejecutar un fondo de script cada vez que coincida una determinada entrada de registro (como un inicio de sesión ssh exitoso).

Janne Pikkarainen
fuente
0

Mira esto:

http://ubuntuforums.org/showthread.php?p=9383927

No creo que haya una manera de deshabilitar esta ejecución. ¿Alguien más puede verificar esto?

Rápido
fuente
( /etc/profileO ~/.profile) depende del shell del usuario, solo un poco menos que bashrc. Si sus usuarios están usando un bash o similar, está bien.
Paŭlo Ebermann