Bash script per limitare il numero di accessi


12

La mia azienda ha l'obbligo di avere un'applicazione server in esecuzione, a cui tutti gli utenti accedono tramite terminale putty. Voglio scrivere uno script di shell che dovrebbe essere aperto solo 20 terminali putty. Se il 21 ° terminale si apre, voglio chiudere immediatamente quel terminale.

Come posso raggiungere questo obiettivo?

Mi aiuti per favore.


3
Impostare il numero massimo di connessioni a cui è consentito l'accesso in ssh a 20 sul server nel MaxSessionscampo
George Udosen,

2
Se la tua azienda ha una politica di massimo 20 sessioni e il valore predefinito è 10 (come dice la risposta più votata), perché la tua azienda ha aumentato il numero di sessioni consentite> 20 pollici /etc/sshd_configo è un bug di Ubuntu?
WinEunuuchs2Unix il

Se il 21 ° terminale si apre, voglio chiudere immediatamente quel terminale. Quindi le prime 20 connessioni possono bloccare il server indefinitamente?
xenoide,

Risposte:


24

Modifica il tuo /etc/sshd_configlato server e cambia la riga:

#MaxSessions 10

per

MaxSessions 20

Vedi 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.

sì, funziona, un po 'tardi per aggiungerlo come risposta.
rʒɑdʒɑ

2
Per un po 'ho intenzione di installare SSSH su uno dei miei vecchi laptop. La pagina man dice che per impostazione predefinita solo 10 utenti possono accedere al server? Già negli anni 80 potevamo avere un centinaio di utenti che accedono a un mini-computer IBM S / 36 con 2 MB di RAM.
WinEunuuchs2Unix il

2
Stai confondendo le sessioni come nei terminali aperti (vedi OP) con sessioni all'interno di una connessione SSH. L'impostazione menzionata riguarda il numero di "connessioni secondarie" consentite da una singola connessione SSH. Quindi eseguire 30 comandi "ssh" non è un problema nemmeno con MaxSessions 20. Le sessioni menzionate riguardano argomenti come il port forwarding (e anche con più di una shell aperta) utilizzando la stessa connessione, non il numero di accessi sul sistema.
allo

@allo queste informazioni che hai ricevuto da OP?
George Udosen,

1
@allo è corretto qui, MaxSessions si riferisce al multiplexing della sessione su una singola connessione TCP. A meno che tutti gli utenti OP non stiano facendo cose strane per condividere una singola connessione TCP al server, questo limite non li influenzerà. L'ho appena verificato impostando un limite MaxSessions basso su un server e aprendo più di tante connessioni ad esso.
Joe Lee-Moyet,

5

La soluzione di George funziona benissimo comunque tu abbia chiesto uno script bash ...

Quindi prendere in considerazione questo per altre situazioni in cui non esiste alcuna opzione come MaxSessionsdi sshd, allora si può usare qualcosa di simile a questo:

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

Che pkill -nucciderà la più recente istanza di processName.

La soluzione corretta per questa situazione speciale è la risposta di George.


Ciò non impedirebbe anche i sottoprocessi?
RonJohn,

Sì, provoca anche la fine del processo secondario.
Ravexina,

2
Quindi, dato che bash genera molti sottoprocessi e vogliono limitare gli utenti, non i processi, questa non sembra essere una risposta utile.
RonJohn,

1
@RonJohn È stata una risposta utile corrispondente ai requisiti dell'utente (uno script che chiude immediatamente un processo) e per gli altri utenti provenienti dai motori di ricerca (una risposta generale al titolo) fino a quando non hai modificato la domanda.
Ravexina,

Fammi venire qui. So anche che questo posto indirizza gli utenti sulla strada giusta in base alle domande poste. Se l'OP fa una domanda e la risposta giusta (basata sulla domanda dell'OP) non è necessariamente la migliore pratica o il giusto approccio, penso che qualcuno abbia il diritto di dichiararlo o dare risposte in linea con tale osservazione. Non credo davvero che dovremmo scegliere l'opzione per decidere quale sia la migliore risposta che OP decida e mi piace vedere molte opzioni da parte di membri del sito ben informati. Per favore, facciamo sempre un dibattito costruttivo, mi aiuta se non qualsiasi altra persona!
George Udosen,

4

Ho deciso di elaborare e testare la Ravexina s' idea . Funziona ed è efficace se si desidera limitare il numero di connessioni ssh stabilite.

Innanzitutto ho scoperto che quando il demone ssh è in esecuzione senza alcuna connessione c'è un sshdprocesso. Per ogni nuova connessione sshdvengono creati due nuovi processi. Quindi, se si desidera un limite di 20 connessioni, la soglia dovrebbe essere 41 (1 + 2x20) anziché 20.

Quindi ho creato un file eseguibile, chiamato , che ha il seguente aspetto:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • La soglia qui è 7, rispettivamente è possibile stabilire solo 3 connessioni e il resto verrà eliminato.

Alla fine ho aggiunto la seguente direttiva a /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • La variabile $SHELLeseguirà la shell dell'utente predefinito.
  • Un effetto indesiderato è che il messaggio di saluto non è più disponibile.
  • Non dimenticare di riavviare il demone ssh: sudo systemctl restart sshd.service

Ecco come funziona ( fai clic sull'immagine per vedere una demo animata ):

inserisci qui la descrizione dell'immagine

Inoltre, ho capito che non abbiamo bisogno di uccidere nulla, se modifichiamo lo script in questo modo:

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

E rispettivamente /etc/ssh/sshd_configin questo modo:

ForceCommand /usr/local/bin/limit-sshd

2

La domanda non è chiara Lasciatemi dire prima come lo capisco e in che modo, IMO, dovrebbe essere chiesto:

Abbiamo una rete locale in cui un server fornisce un'applicazione specifica. Il nostro team accede a questa applicazione tramite connessione ssh dai loro computer al server utilizzando PuTTY. Ogni membro del team ha il proprio account utente che viene utilizzato per stabilire le connessioni ssh ( o forse: tutti i membri del team utilizzano un account utente comune).

I membri del team non usano il server per nessun altro scopo e vogliamo limitare il numero delle loro connessioni ssh a 20, indipendentemente da quante connessioni siano state ancora stabilite da un determinato utente ( o forse: 20 connessioni per utente).

Se l'interpretazione è corretta, probabilmente un modo corretto per soddisfare i requisiti è quello di creare un gruppo di utenti , quindi aggiungere tutti gli account utente a quel gruppo e limitare il numero di maxlogin tramite /etc/security/limits.conf.

  1. Crea un gruppo, chiamato ad esempio the-app-maxlogins, con ID gruppo 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Aggiungi gli utenti a quel gruppo - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Aggiungi la riga successiva a /etc/security/limits.confper limitare i maxlogin dell'intero gruppo :

    %the-app-maxlogins      -       maxlogins       20

    Oppure aggiungi la seguente riga per limitare il numero massimo di accessi per utente del gruppo :

    @the-app-maxlogins      -       maxlogins       20
  4. Modifica /etc/ssh/sshd_confige aggiungi le seguenti righe in fondo (!) Al file per disabilitare il multiplexing di sessione per quel gruppo (probabilmente non è obbligatorio in quel caso):

    Match Group the-app-maxlogins
        MaxSessions 1

Questa soluzione limiterà il numero di accessi degli utenti interessati, indipendentemente da ssh o tty. Se si desidera applicarlo per un determinato utente non per un gruppo, è sufficiente aggiungere una riga come segue limits.confo inserirla in un .conffile separato all'interno della directory /etc/security/limits.d/:

username      -       maxlogins       20

MaxSessionsIn questa risposta viene fornita una semplice spiegazione del significato effettivo della direttiva . La fonte principale della risposta corrente è un'altra risposta sotto la stessa domanda di L&U.

L' altra mia risposta , potrebbe in qualche modo fornire una soluzione alternativa, ma è una specie di soluzione divertente piuttosto che vera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.