Skrypt Bash, aby ograniczyć liczbę logowań

12

Moja firma wymaga, aby mieć uruchomioną jedną aplikację serwerową, do której wszyscy użytkownicy uzyskują dostęp za jej pośrednictwem za pomocą putty terminal. Chcę napisać skrypt powłoki, w którym powinien być otwarty tylko 20 kitowy terminal. Jeśli 21 terminal jest otwarty, chcę go natychmiast zamknąć.

Jak mogę to osiągnąć?

Proszę pomóż mi.

vijay12289
źródło
3
Ustaw maksymalną liczbę połączeń dozwolonych dostępu w ssh do 20 na serwerze w MaxSessionsterenie
George Udosen
2
Jeśli twoja korporacja ma zasadę 20 maksymalnych sesji, a domyślną wartością jest 10 (jak mówi najwyższa głosowana odpowiedź), dlaczego twoja firma zwiększyła liczbę dozwolonych sesji> 20 w /etc/sshd_config, czy to jest błąd Ubuntu?
WinEunuuchs2Unix
Jeśli 21. terminal jest otwarty, to chcę go natychmiast zamknąć. Czyli 20 pierwszych połączeń może zablokować serwer na czas nieokreślony?
ksenoid

Odpowiedzi:

24

Edytuj swoje /etc/sshd_configpo stronie serwera i zmień wiersz:

#MaxSessions 10

do

MaxSessions 20

Zobacz 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
źródło
tak, to działa, trochę późno, aby dodać go jako odpowiedź.
rɑːdʒɑ
2
Od jakiegoś czasu chciałem skonfigurować SSSH na jednym ze starych laptopów. Czy strona man mówi, że domyślnie tylko 10 użytkowników może zalogować się na serwer? Już w latach 80. mogliśmy mieć setkę użytkowników logujących się do mini-komputera IBM S / 36 z 2 MB pamięci RAM.
WinEunuuchs2Unix
2
Mylą się sesje jak w otwartych terminalach (patrz OP) z sesjami wewnątrz połączenia SSH. Wspomniane ustawienie dotyczy tego, ile „pod-połączeń” jest dozwolonych przez pojedyncze połączenie ssh. Zatem uruchomienie 30 poleceń „ssh” nie stanowi żadnego problemu MaxSessions 20. Wspomniane tam sesje dotyczą między innymi przekazywania portów (a nawet otwarcia więcej niż jednej powłoki) przy użyciu tego samego połączenia, a nie liczby logowań w systemie.
allo
@ Czy te informacje otrzymałeś od OP?
George Udosen
1
@ allo jest tutaj poprawne, MaxSessions odnosi się do multipleksowania sesji przez pojedyncze połączenie TCP. O ile wszyscy użytkownicy OP nie zrobią dziwnych rzeczy, aby udostępnić jedno połączenie TCP z serwerem, ten limit nie wpłynie na nich. Właśnie to zweryfikowałem, ustawiając niski limit MaxSessions na serwerze i otwierając więcej niż tyle połączeń z nim.
Joe Lee-Moyet
5

Rozwiązanie George'a działa dobrze, jednak poprosiłeś o skrypt bash ...

Więc rozważyć tę jedną dla innych sytuacjach, gdy nie ma innej możliwości jak MaxSessionsz sshd, a następnie można użyć mniej więcej tak:

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

Który pkill -nzabije najnowszą instancję processName.

Prawidłowe rozwiązanie tej szczególnej sytuacji to odpowiedź George'a.

Ravexina
źródło
Czy nie zapobiegnie to również podprocesom?
RonJohn
Tak, powoduje to również zabicie podprocesu.
Ravexina
2
Następnie - biorąc pod uwagę, że bash rozwidla wiele podprocesów i chcą ograniczyć użytkowników, a nie procesy - nie wydaje się to użyteczną odpowiedzią.
RonJohn
1
@RonJohn To była przydatna odpowiedź odpowiadająca wymaganiom użytkownika (skrypt, który natychmiast zamyka proces) i dla innych użytkowników pochodzących z wyszukiwarek (ogólna odpowiedź na tytuł), dopóki nie zredagowałeś pytania.
Ravexina
Pozwól mi tu wejść. Wiem również, że to miejsce kieruje użytkowników na właściwą ścieżkę na podstawie zadanych pytań. Jeśli OP zadaje pytanie, a właściwa odpowiedź (oparta na pytaniu OP) niekoniecznie jest najlepszą praktyką lub właściwym podejściem, myślę, że każdy ma prawo to stwierdzić lub udzielić odpowiedzi zgodnie z tym spostrzeżeniem. Nie sądzę, że powinniśmy zdecydować, która odpowiedź jest najlepsza, niech OP zdecyduje i uwielbiam widzieć wiele opcji od dobrze poinformowanych członków witryny. Proszę, pozwólmy zawsze mieć konstruktywną debatę, która pomaga mi, jeśli nie jakiejkolwiek innej osobie!
George Udosen
4

Zdecydowałem się opracować i przetestować Ravexina „s pomysł . Działa i jest skuteczny, jeśli chcesz w ogóle ograniczyć liczbę ustanowionych połączeń ssh.

Najpierw odkryłem, że gdy demon ssh działa bez połączenia, istnieje jeden sshdproces. Dla każdego nowego połączenia sshdtworzone są dwa nowe procesy. Więc jeśli chcesz limit 20 połączeń, próg powinien wynosić 41 (1 + 2x20) zamiast 20.

Następnie utworzyłem plik wykonywalny o nazwie , który wygląda następująco:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Tutaj próg wynosi 7, odpowiednio można ustanowić tylko 3 połączenia, a reszta zostanie zerwana.

Wreszcie dodałem następującą dyrektywę do /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Zmienna $SHELLwykona domyślną powłokę użytkownika.
  • Niepożądanym efektem jest to, że powitanie nie jest już dostępne.
  • Nie zapomnij zrestartować demona ssh: sudo systemctl restart sshd.service

Oto jak to działa ( kliknij obraz, aby zobaczyć animowaną wersję demonstracyjną ):

wprowadź opis zdjęcia tutaj

Ponadto zdałem sobie sprawę, że nie musimy niczego zabijać, jeśli zmodyfikujemy skrypt w ten sposób:

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

I odpowiednio /etc/ssh/sshd_configw ten sposób:

ForceCommand /usr/local/bin/limit-sshd
pa4080
źródło
2

Pytanie nie jest jasne. Pozwól mi najpierw powiedzieć, jak to rozumiem i w jaki sposób, IMO, należy zapytać:

Mamy sieć lokalną, w której jeden serwer dostarcza konkretną aplikację. Nasz zespół uzyskuje dostęp do tej aplikacji za pośrednictwem połączenia ssh ze swoich komputerów do serwera za pomocą PuTTY. Każdy członek zespołu ma własne konto użytkownika, które służy do nawiązywania połączeń ssh ( a może: wszyscy członkowie zespołu korzystają ze wspólnego konta użytkownika).

Członkowie zespołu nie używają serwera do żadnych innych celów i chcemy ograniczyć liczbę ich połączeń ssh do 20, bez względu na to, ile połączeń jest nawiązywanych przez konkretnego użytkownika ( a może: 20 połączeń na użytkownika).

Jeśli ta interpretacja jest poprawna, prawdopodobnie poprawnym sposobem spełnienia wymagań jest utworzenie grupy użytkowników , a następnie dodanie wszystkich kont użytkowników do tej grupy i ograniczenie liczby maksymalnych logowań za pośrednictwem /etc/security/limits.conf.

  1. Utwórz grupę, np. O the-app-maxloginsidentyfikatorze grupy 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Dodaj użytkowników do tej grupy - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Dodaj kolejną linię /etc/security/limits.confdo ograniczenia tych maxlogins z całej grupy :

    %the-app-maxlogins      -       maxlogins       20

    Lub dodaj następujący wiersz, aby ograniczyć maksymalną liczbę logowania na użytkownika w grupie :

    @the-app-maxlogins      -       maxlogins       20
  4. Edytuj /etc/ssh/sshd_configi dodaj następujące wiersze na dole (!) Pliku, aby wyłączyć multipleksowanie sesji dla tej grupy (prawdopodobnie nie jest to w tym przypadku obowiązkowe):

    Match Group the-app-maxlogins
        MaxSessions 1
    

To rozwiązanie ograniczy liczbę logowań dotkniętych użytkowników bez względu na ssh lub tty. Jeśli chcesz zastosować go dla określonego użytkownika, a nie dla grupy, po prostu dodaj wiersz jako kontynuację limits.conflub umieść go w osobnym .confpliku w katalogu /etc/security/limits.d/:

username      -       maxlogins       20

MaxSessionsW tej odpowiedzi podano proste wyjaśnienie faktycznego znaczenia dyrektywy . Głównym źródłem obecnej odpowiedzi jest inna odpowiedź w ramach tego samego pytania L&U.

Inna odpowiedź kopalni, mógłby stanowić obejście w jakiś sposób, ale jest to rodzaj zabawy, a nie prawdziwe rozwiązanie.

pa4080
źródło