web-dev-qa-db-fra.com

Script Bash pour limiter le nombre de connexions

Mon entreprise a l'obligation de disposer d'une application serveur en cours d'exécution, accessible à tous les utilisateurs via le terminal PuTTY. Je veux écrire un script Shell selon lequel seul 20 terminaux PuTTY devraient être ouverts. Si le 21ème terminal est ouvert, je souhaite fermer ce terminal immédiatement.

Comment puis-je atteindre cet objectif?

Aidez-moi, s'il vous plaît.

12
vijay12289

Editez votre /etc/sshd_config côté serveur et changez la ligne:

#MaxSessions 10

à

MaxSessions 20

Voir 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.
24
George Udosen

La solution de George fonctionne bien, mais vous avez demandé un script bash ...

Donc, considérez celui-ci pour d'autres situations où il n'y a pas d'option comme MaxSessions of sshd, alors vous pouvez utiliser quelque chose comme ceci:

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

Quel pkill -n va tuer la dernière instance de processName.

La réponse correcte à cette situation particulière est la réponse de George.

5
Ravexina

J'ai décidé d'élaborer et de tester les Ravexinaidea . Cela fonctionne et est efficace si vous souhaitez limiter le nombre de connexions ssh établies.

En premier lieu, lorsque le démon ssh est en cours d’exécution sans connexion, il existe un processus sshd. Pour chaque nouvelle connexion, deux nouveaux processus sshd sont créés. Donc, si vous voulez une limite de 20 connexions, le seuil doit être 41 (1 + 2x20) au lieu de 20.

Ensuite, j'ai créé un fichier exécutable, nommé /usr/local/bin/limit-sshd, qui se présente comme suit:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Le seuil ici est 7, respectivement, seulement 3 connexions pourraient être établies et le reste sera abandonné.

Enfin, j'ai ajouté la directive suivante à /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $Shell
  • La variable $Shell exécutera le shell de l'utilisateur par défaut.
  • Un effet indésirable est que le message d'accueil n'est plus disponible.
  • N'oubliez pas de redémarrer le démon ssh: Sudo systemctl restart sshd.service

Voici comment cela fonctionne ( cliquez sur l'image pour voir une démonstration animée ):

enter image description here

De plus, j'ai réalisé que nous n'avons pas besoin de tuer quoi que ce soit, si nous modifions le script de cette manière:

#!/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

Et respectivement /etc/ssh/sshd_config de cette manière:

ForceCommand /usr/local/bin/limit-sshd
4
pa4080

La question n'est pas claire. Laissez-moi d'abord dire comment je le comprends et de quelle manière, à mon avis, il faudrait demander:

Nous avons un réseau local où un serveur fournit une application spécifique. Notre équipe accède à cette application via une connexion ssh de leurs ordinateurs au serveur en utilisant PuTTY. Chaque membre de l'équipe dispose de son propre compte utilisateur utilisé pour établir les connexions SSH (ou peut-être: tous les membres de l'équipe utilisent un compte d'utilisateur commun).

Les membres de l’équipe n’utilisent pas le serveur à d’autres fins et nous souhaitons limiter le nombre de leurs connexions ssh à 20, quel que soit le nombre de connexions encore établies par un utilisateur particulier (ou peut-être: 20 connexions par utilisateur).

Si cette interprétation est correcte, une manière correcte de répondre aux exigences consiste probablement à créer un groupe d'utilisateurs, puis ajoutez tous les comptes d'utilisateurs à ce groupe et limitez le nombre de maxlogins via /etc/security/limits.conf .

  1. Créez un groupe, appelé par exemple the-app-maxlogins, avec l'identifiant de groupe 10 000:

    Sudo groupadd -g 10000 the-app-maxlogins
    
  2. Ajoutez les utilisateurs à ce groupe - Sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do Sudo adduser "$user" the-app-maxlogins; done
    
  3. Ajoutez la ligne suivante à /etc/security/limits.conf pour limiter le nombre maximal de connexions de du groupe entier :

    %the-app-maxlogins      -       maxlogins       20
    

    Ou ajoutez la ligne suivante à limiter le nombre maximal de connexions par utilisateur du groupe :

    @the-app-maxlogins      -       maxlogins       20
    
  4. Éditez /etc/ssh/sshd_config et ajoutez les lignes suivantes au bas (!) Du fichier pour désactiver le multiplexage de session pour ce groupe (ce n'est probablement pas obligatoire dans ce cas):

    Match Group the-app-maxlogins
        MaxSessions 1
    

Cette solution limitera le nombre de connexions des utilisateurs affectés, que ce soit via ssh ou tty. Si vous souhaitez l'appliquer à un certain utilisateur, pas à un groupe, ajoutez simplement une ligne comme suit dans limits.conf ou placez-la dans un fichier .conf séparé du répertoire /etc/security/limits.d/:

username      -       maxlogins       20

Une explication simple de la signification réelle de la directive MaxSessionsest fournie dans cette réponse . La source principale de la réponse actuelle est autre réponse sous la même question de L & U.

Le autre réponse du mien, pourrait fournir une solution de contournement, mais c'est une sorte de plaisir plutôt que de vraie solution.

2
pa4080