Скрипт Bash для ограничения количества логинов

12

Моя компания требует, чтобы у меня было запущено одно серверное приложение, и все пользователи обращались к нему через терминал замазки. Я хочу написать сценарий оболочки, что только 20 замазка терминала должны быть открыты. Если 21-й терминал открыт, то я хочу немедленно закрыть этот терминал.

Как мне этого добиться?

Пожалуйста, помогите мне.

vijay12289
источник
3
Установите максимальное количество подключений, разрешенных для доступа в SSH к 20 на сервере в MaxSessionsполе
Джордж Удосен
2
Если ваша корпорация имеет политику максимум 20 сессий и по умолчанию 10 (как говорит ответ с наибольшим количеством голосов), почему ваша компания увеличила количество допустимых сессий> 20 в /etc/sshd_config, или это ошибка Ubuntu?
WinEunuuchs2Unix
Если 21-й терминал открыт, то я хочу немедленно закрыть этот терминал. Итак, 20 первых подключений могут работать на сервер бесконечно?
ксеноид

Ответы:

24

Отредактируйте /etc/sshd_configна стороне сервера и измените строку:

#MaxSessions 10

в

MaxSessions 20

Смотрите 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.
Джордж Удосен
источник
да, это работает, немного поздно, чтобы добавить его в качестве ответа.
rɑːdʒɑ
2
Я давно хотел установить SSSH на один из моих старых ноутбуков. Говорит ли man-страница, что по умолчанию только 10 пользователей могут войти на сервер? Даже в 80-х годах сотни пользователей могли подключиться к мини-компьютеру IBM S / 36 с 2 МБ оперативной памяти.
WinEunuuchs2Unix
2
Вы путаете сеансы как в открытых терминалах (см. OP) с сеансами внутри соединения SSH. Упомянутый вами параметр относится к тому, сколько «суб-соединений» разрешено одним ssh-соединением. Таким образом, выполнение 30 команд «ssh» не проблема даже с MaxSessions 20. Упоминаемые здесь сеансы касаются таких вещей, как переадресация портов (и даже наличие нескольких открытых оболочек), использующих одно и то же соединение, а не количество входов в систему.
алло
@ также эту информацию вы получили от ОП?
Джордж Удосен
1
@allo здесь правильно, MaxSessions относится к мультиплексированию сеансов по одному TCP-соединению. Если все пользователи OP не делают странных вещей, чтобы разделить одно TCP-соединение с сервером, это ограничение не повлияет на них. Я только что сам это проверил, установив низкий предел MaxSessions на сервере и открыв больше, чем столько подключений к нему.
Джо Ли-Moyet
5

Решение Джорджа работает отлично, но вы попросили сценарий bash ...

Так считают этот для других ситуаций , когда нет никакой возможности , как MaxSessionsиз sshd, то вы можете использовать что - то вроде этого:

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

Который pkill -nубьет новейший экземпляр processName.

Правильное решение этой особой ситуации - ответ Джорджа.

Ravexina
источник
Разве это не помешает подпроцессам?
RonJohn
Да, это также приводит к уничтожению подпроцесса.
Равексина
2
Затем - учитывая, что bash разветвляется на множество подпроцессов, и они хотят ограничивать пользователей, а не процессы - это не кажется полезным ответом.
RonJohn
1
@RonJohn Это был полезный ответ, соответствующий требованиям пользователя (скрипт, который немедленно закрывает процесс) и для других пользователей из поисковых систем (общий ответ на заголовок), пока вы не отредактировали вопрос.
Равексина
Позволь мне прийти сюда. Я также знаю, что это место направляет пользователей на правильный путь, основанный на задаваемых вопросах. Если ОП задает вопрос и правильный ответ (на основе вопроса ОП) не обязательно является наилучшей практикой или правильным подходом, я думаю, что любой имеет право заявить об этом или дать ответы в соответствии с этим наблюдением. На самом деле я не думаю, что нам следует выбирать, какой ответ лучше всего решать, пусть OP решит, и мне нравится видеть много вариантов от хорошо информированных участников сайта. Пожалуйста, давайте всегда иметь конструктивные дебаты, это поможет мне, если не любой другой человек!
Джордж Удосен
4

Я решил разработать и протестировать Ravexina «s идеи . Это работает, и это эффективно, если вы хотите ограничить количество установленных соединений SSH вообще.

Сначала я обнаружил, что когда демон ssh работает без какого-либо соединения, существует один sshdпроцесс. Для каждого нового соединения sshdсоздаются два новых процесса. Поэтому, если вы хотите ограничить 20 соединений, порог должен быть 41 (1 + 2x20) вместо 20.

Затем я создал исполняемый файл с именем , который выглядит следующим образом:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Порог здесь равен 7, соответственно может быть установлено только 3 соединения, а остальное будет сброшено.

Наконец, я добавил следующую директиву /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Переменная $SHELLвыполнит оболочку пользователя по умолчанию.
  • Нежелательный эффект заключается в том, что приветственное сообщение больше не доступно.
  • Не забудьте перезапустить демон ssh: sudo systemctl restart sshd.service

Вот как это работает ( нажмите на изображение, чтобы увидеть анимацию ):

введите описание изображения здесь

Далее я понял, что нам не нужно ничего убивать, если мы изменим скрипт таким образом:

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

И соответственно /etc/ssh/sshd_configтаким образом:

ForceCommand /usr/local/bin/limit-sshd
pa4080
источник
2

Вопрос не ясен. Позвольте мне сначала рассказать, как я понимаю это и каким образом, ИМО, следует спросить:

У нас есть локальная сеть, где один сервер поставляет конкретное приложение. Наша команда получает доступ к этому приложению через ssh-соединение со своих компьютеров на сервер с помощью PuTTY. У каждого члена группы есть своя собственная учетная запись пользователя, которая используется для установки ssh-соединений ( или, возможно, все члены группы используют общую учетную запись пользователя).

Члены команды не используют сервер для каких-либо других целей, и мы хотим ограничить количество их соединений ssh ​​до 20, независимо от того, сколько соединений установлено конкретным пользователем ( или, возможно, 20 соединений на пользователя).

Если эта интерпретация верна, вероятно, правильный способ выполнить требования - создать группу пользователей , затем добавить все учетные записи пользователей в эту группу и ограничить число maxlogins через них /etc/security/limits.conf.

  1. Создайте группу, например the-app-maxlogins, с идентификатором группы 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Добавьте пользователей в эту группу - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Добавьте следующую строку , /etc/security/limits.confчтобы ограничить в maxlogins из всей группы :

    %the-app-maxlogins      -       maxlogins       20

    Или добавьте следующую строку, чтобы ограничить максимальное число входов в систему на пользователя группы :

    @the-app-maxlogins      -       maxlogins       20
  4. Отредактируйте /etc/ssh/sshd_configи добавьте следующие строки в конец (!) Файла, чтобы отключить мультиплексирование сеансов для этой группы (возможно, это не обязательно в этом случае):

    Match Group the-app-maxlogins
        MaxSessions 1

Это решение ограничит количество входов затронутых пользователей независимо от того, будут ли они использоваться через ssh или tty. Если вы хотите применить его для определенного пользователя, а не для группы, просто добавьте следующую строку limits.confили поместите ее в отдельный .confфайл в каталоге /etc/security/limits.d/:

username      -       maxlogins       20

В этом ответеMaxSessions дается простое объяснение действительного значения директивы . Основным источником текущего ответа является другой ответ на тот же вопрос L & U.

Другой ответ мой, может обеспечить обходной путь в некотором роде, но это своего рода удовольствие , а не истинное решение.

pa4080
источник