Script bash pour limiter le nombre de connexions

12

Mon entreprise a l'exigence d'avoir une application serveur en cours d'exécution, à laquelle tous les utilisateurs y accèdent via un terminal de mastic. Je veux écrire un script shell que seulement 20 terminaux de mastic devraient être ouverts. Si le 21e terminal s'ouvre, je veux le fermer immédiatement.

Comment puis-je atteindre cet objectif?

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

vijay12289
la source
3
Définissez le nombre maximal de connexions autorisées dans ssh à 20 sur le serveur sur le MaxSessionsterrain
George Udosen
2
Si votre société a une politique de 20 sessions maximum et que la valeur par défaut est 10 (comme le dit la réponse la plus votée), pourquoi votre entreprise a-t-elle augmenté le nombre de sessions autorisées> 20 pouces /etc/sshd_config, ou est-ce un bug Ubuntu?
WinEunuuchs2Unix
Si le 21ème terminal s'ouvre, je veux fermer ce terminal immédiatement. Ainsi, les 20 premières connexions peuvent monopoliser indéfiniment le serveur?
xenoid

Réponses:

24

Modifiez votre /etc/sshd_configcôté serveur et changez de 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.
George Udosen
la source
oui ses travaux, un peu tard pour l'ajouter comme réponse.
rɑːdʒɑ
2
J'avais l'intention de configurer SSSH thingy sur l'un de mes anciens ordinateurs portables depuis un certain temps maintenant. La page de manuel indique-t-elle que par défaut, seuls 10 utilisateurs peuvent se connecter au serveur? Même dans les années 80, une centaine d'utilisateurs pouvaient se connecter à un mini-ordinateur IBM S / 36 avec 2 Mo de RAM.
WinEunuuchs2Unix
2
Vous confondez les sessions comme dans les terminaux ouverts (voir OP) avec les sessions à l'intérieur d'une connexion SSH. Le paramètre que vous mentionnez concerne le nombre de "sous-connexions" autorisées par une seule connexion ssh. L'exécution de 30 commandes "ssh" ne pose donc aucun problème, même avec MaxSessions 20. Les sessions mentionnées mentionnent des choses comme les transferts de port (et même l'ouverture de plusieurs shell) utilisant la même connexion, et non le nombre de connexions sur le système.
allo
@allo ces informations que vous avez obtenues d'OP?
George Udosen
1
@allo est correct ici, MaxSessions fait référence au multiplexage de session sur une seule connexion TCP. À moins que tous les utilisateurs d'OP ne fassent des choses étranges pour partager une seule connexion TCP avec le serveur, cette limite ne les affectera pas. Je viens de le vérifier moi-même en définissant une limite MaxSessions basse sur un serveur et en ouvrant plus de connexions que lui.
Joe Lee-Moyet
5

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

Considérez donc celui-ci pour d'autres situations où il n'y a pas d'option comme celle MaxSessionsde sshd, alors vous pouvez utiliser quelque chose comme ceci:

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

Ce pkill -nqui tuera la dernière instance de processName.

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

Ravexina
la source
Cela n'empêcherait-il pas également les sous-processus?
RonJohn
Oui, cela provoque également la mort du sous-processus.
Ravexina
2
Ensuite - étant donné que bash bifurque beaucoup de sous-processus, et qu'ils veulent limiter les utilisateurs, pas les processus - cela ne semble pas être une réponse utile.
RonJohn
1
@RonJohn C'était une réponse utile correspondant aux besoins des utilisateurs (un script qui ferme immédiatement un processus) et pour les autres utilisateurs provenant des moteurs de recherche (une réponse générale au titre) jusqu'à ce que vous ayez édité la question.
Ravexina
Laissez-moi entrer ici. Je sais également que cet endroit oriente les utilisateurs vers le bon chemin en fonction des questions posées. Si OP pose une question et que la bonne réponse (basée sur la question de OP) n'est pas nécessairement la meilleure pratique ou la bonne approche, je pense que quiconque a le droit de le dire ou de donner des réponses conformes à cette observation. Je ne pense pas vraiment que nous devrions prendre l'option de décider quelle réponse est la meilleure laisser OP décider et j'aime voir de nombreuses options de membres du site bien informés. S'il vous plaît, ayez toujours un débat constructif, cela m'aide sinon toute autre personne!
George Udosen
4

J'ai décidé d'élaborer et de tester la Ravexina d » idée . Cela fonctionne et il est efficace si vous souhaitez restreindre le nombre de connexions ssh établies.

D'abord, j'ai trouvé que lorsque le démon ssh s'exécute sans aucune connexion, il y a un sshdprocessus. Pour chaque nouvelle connexion, deux nouveaux sshdprocessus sont créés. Donc, si vous voulez limiter 20 connexions, le seuil doit être 41 (1 + 2x20) au lieu de 20.

Ensuite, j'ai créé un fichier exécutable, nommé , qui ressemble à ceci:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Le seuil est ici de 7, respectivement seulement 3 connexions ont pu ê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 $SHELLexé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émo animée ):

entrez la description de l'image ici

De plus, j'ai réalisé que nous n'avons rien à tuer 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_configde cette façon:

ForceCommand /usr/local/bin/limit-sshd
pa4080
la source
2

La question n'est pas claire. Permettez-moi de dire d'abord comment je le comprends et de quelle manière, OMI, il convient de 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 a son propre compte utilisateur qui est utilisé pour établir les connexions ssh ( ou peut-être: tous les membres de l'équipe utilisent un compte utilisateur commun).

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

Si cette interprétation est correcte, probablement un moyen correct de satisfaire aux exigences est de créer un groupe d'utilisateurs , puis d'ajouter tous les comptes d'utilisateurs à ce groupe et de limiter le nombre de maxlogins via /etc/security/limits.conf.

  1. Créez un groupe, appelé par exemple the-app-maxlogins, avec l'ID 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.confpour limiter les maxlogins de l'ensemble du groupe :

    %the-app-maxlogins      -       maxlogins       20

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

    @the-app-maxlogins      -       maxlogins       20
  4. Modifiez /etc/ssh/sshd_configet ajoutez les lignes suivantes en 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 concernés, peu importe via ssh ou tty. Si vous souhaitez l'appliquer à un certain utilisateur et non à un groupe, ajoutez simplement une ligne comme suit limits.confou placez-la dans un .conffichier séparé dans le 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 principale source de la réponse actuelle est une autre réponse sous la même question de L&U.

L' autre réponse de la mienne, pourrait fournir une solution de contournement d'une certaine manière, mais c'est une sorte de solution amusante plutôt que vraie.

pa4080
la source