Bash script para limitar el número de inicios de sesión

12

Mi empresa tiene el requisito de tener una aplicación de servidor en ejecución, que todos los usuarios acceden a ella a través de una terminal de masilla. Quiero escribir un script de shell que solo 20 terminales de masilla deben estar abiertos. Si la terminal 21 está abierta, entonces quiero cerrar esa terminal de inmediato.

¿Cómo puedo conseguir esto?

Por favor, ayúdame.

vijay12289
fuente
3
Establezca el número máximo de conexiones que permiten el acceso en ssh a 20 en el servidor en el MaxSessionscampo
George Udosen
2
Si su empresa tiene una política de 20 sesiones máximas y la predeterminada es 10 (como dice la respuesta más votada), ¿por qué su empresa aumentó el número de sesiones permitidas> 20 /etc/sshd_configo es un error de Ubuntu?
WinEunuuchs2Unix
Si el 21º terminal está abierto, entonces quiero cerrar ese terminal inmediatamente ¿Entonces las 20 primeras conexiones pueden acaparar el servidor indefinidamente?
xenoid

Respuestas:

24

Edite su /etc/sshd_configen el lado del servidor y cambie la línea:

#MaxSessions 10

a

MaxSessions 20

Ver man sshd_config:

 MaxSessions
         Specifies the maximum number of open shell, login or subsystem
         (e.g. sftp) sessions permitted per network connection.  Multiple
         sessions may be established by clients that support connection
         multiplexing.  Setting MaxSessions to 1 will effectively disable
         session multiplexing, whereas setting it to 0 will prevent all
         shell, login and subsystem sessions while still permitting for-
         warding.  The default is 10.
George Udosen
fuente
sí, funciona, un poco tarde para agregarlo como respuesta.
rɑːdʒɑ
2
He tenido la intención de configurar SSSH cosita en una de mis viejas computadoras portátiles por un tiempo ahora. ¿La página de manual dice que por defecto solo 10 usuarios pueden iniciar sesión en el servidor? Incluso en los años 80, podríamos tener un centenar de usuarios que inicien sesión en una mini computadora IBM S / 36 con 2 MB de RAM.
WinEunuuchs2Unix
2
Está confundiendo sesiones como en terminales abiertas (vea OP) con sesiones dentro de una conexión SSH. La configuración que menciona es acerca de cuántas "sub-conexiones" están permitidas por una sola conexión ssh. Por lo tanto, ejecutar 30 comandos "ssh" no es un problema incluso con MaxSessions 20. Las sesiones mencionadas allí tratan sobre reenvíos de puertos (e incluso tener más de un shell abierto) usando la misma conexión, no sobre el número de inicios de sesión en el sistema.
allo
@toda esta información que recibió de OP?
George Udosen
1
@allo es correcto aquí, MaxSessions se refiere a la multiplexación de sesiones en una sola conexión TCP. A menos que todos los usuarios de OP estén haciendo cosas extrañas para compartir una única conexión TCP al servidor, este límite no los afectará. Acabo de verificar esto yo mismo estableciendo un límite bajo de MaxSessions en un servidor y abriendo más que esa cantidad de conexiones.
Joe Lee-Moyet
5

La solución de George funciona bien, sin embargo, solicitó un script bash ...

Así que considere esto una para otras situaciones en las que no hay ninguna opción al igual que MaxSessionsde sshd, a continuación, se puede usar algo como esto:

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

Lo pkill -nque matará a la instancia más nueva deprocessName .

La solución correcta para esta situación especial es la respuesta de George.

Ravexina
fuente
¿No evitaría esto también los subprocesos?
RonJohn
Sí, hace que el subproceso también sea eliminado.
Ravexina
2
Luego, dado que bash bifurca muchos subprocesos y quieren limitar a los usuarios, no a los procesos, esto no parece ser una respuesta útil.
RonJohn
1
@RonJohn Fue una respuesta útil correspondiente a los requisitos del usuario (un script que cierra un proceso de inmediato) y para otros usuarios que vienen de los motores de búsqueda (una respuesta general al título) hasta que haya editado la pregunta.
Ravexina
Déjame entrar aquí. También sé que este lugar dirige a los usuarios al camino correcto en función de las preguntas formuladas. Si OP hace una pregunta y la respuesta correcta (basada en la pregunta de OP) no es necesariamente la mejor práctica o el enfoque correcto, creo que cualquiera tiene derecho a decir esto o dar respuestas en línea con esa observación. Realmente no creo que debamos tomar la opción de decidir qué respuesta es la mejor, deje que OP decida y me encanta ver muchas opciones de miembros del sitio bien informados. Por favor, tengamos siempre un debate constructivo, ¡me ayuda si no a cualquier otra persona!
George Udosen
4

He decidido elaborar y probar la Ravexina 's idea . Funciona y es efectivo si desea restringir la cantidad de conexiones ssh establecidas.

Primero descubrí que cuando el demonio ssh se está ejecutando sin ninguna conexión, hay un sshdproceso. Para cada nueva conexión sshdse crean dos nuevos procesos. Entonces, si desea un límite de 20 conexiones, el umbral debe ser 41 (1 + 2x20) en lugar de 20.

Luego he creado un archivo ejecutable, llamado , que se ve de la siguiente manera:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • El umbral aquí es 7, respectivamente, solo se podrían establecer 3 conexiones y el resto se eliminará.

Finalmente agregué la siguiente directiva a /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • La variable $SHELL ejecutará el shell del usuario predeterminado.
  • Un efecto no deseado es que el mensaje de saludo ya no está disponible.
  • No olvides reiniciar el demonio ssh: sudo systemctl restart sshd.service

Así es como funciona ( haga clic en la imagen para ver una demostración animada ):

ingrese la descripción de la imagen aquí

Además, me di cuenta de que no necesitamos matar nada, si modificamos el script de esta manera:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    exit # This line is not mandatory
else
    eval "$SHELL"
fi

Y respectivamente /etc/ssh/sshd_configde esta manera:

ForceCommand /usr/local/bin/limit-sshd
pa4080
fuente
2

La pregunta no está clara. Permítanme decir primero cómo lo entiendo y de qué manera, en mi opinión, debería preguntarse:

Tenemos una red local donde un servidor suministra una aplicación específica. Nuestro equipo accede a esta aplicación a través de una conexión ssh desde sus computadoras al servidor utilizando PuTTY. Cada miembro del equipo tiene su propia cuenta de usuario que se utiliza para establecer las conexiones ssh ( o tal vez: todos los miembros del equipo usan una cuenta de usuario común).

Los miembros del equipo no usan el servidor para ningún otro propósito y queremos limitar el número de sus conexiones ssh a 20, sin importar cuántas conexiones haya establecido aún un usuario en particular ( o tal vez: 20 conexiones por usuario).

Si esa interpretación es correcta, probablemente una forma correcta de cumplir con los requisitos es crear un grupo de usuarios , luego agregar todas las cuentas de usuario a ese grupo y limitar el número de maxlogins a través de /etc/security/limits.conf.

  1. Cree un grupo, llamado por ejemplo the-app-maxlogins, con id de grupo 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Agregue los usuarios a ese grupo sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Añadir la siguiente línea a la /etc/security/limits.confque limitar las maxlogins de todo el grupo :

    %the-app-maxlogins      -       maxlogins       20

    O agregue la siguiente línea para limitar el número máximo de inicios de sesión por usuario del grupo :

    @the-app-maxlogins      -       maxlogins       20
  4. Edite /etc/ssh/sshd_configy agregue las siguientes líneas en la parte inferior (!) Del archivo para deshabilitar la multiplexación de sesión para ese grupo (probablemente esto no es obligatorio en ese caso):

    Match Group the-app-maxlogins
        MaxSessions 1

Esta solución limitará el número de inicios de sesión de los usuarios afectados sin importar a través de ssh o tty. Si desea aplicarlo para un determinado usuario, no para un grupo, simplemente agregue una línea como sigue limits.confo colóquela en un .confarchivo separado dentro del directorio /etc/security/limits.d/:

username      -       maxlogins       20

MaxSessionsEn esta respuesta se proporciona una explicación simple del significado real de la directiva . La fuente principal de la respuesta actual es otra respuesta bajo la misma pregunta de L&U.

La otra respuesta mía, podría proporcionar una solución de alguna manera, pero es una solución más divertida que verdadera.

pa4080
fuente