Сценарій Bash для обмеження кількості входів


12

Моя компанія вимагає, щоб у мене працювало одне серверне додаток, до якого всі користувачі отримують доступ до нього через термінал шпаклівки. Хочу написати скрипт оболонки, що має бути відкрито лише 20 терміналів шпаклівки. Якщо 21-й термінал відкритий, я хочу його негайно закрити.

Як я можу цього досягти?

Будь ласка, допоможи мені.


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 на одному зі своїх старих ноутбуків. Сторінка чоловіка говорить, що за замовчуванням на сервер можуть увійти лише 10 користувачів? Ще в 80-х ми могли б мати сотні користувачів увійти в міні-комп'ютер IBM S / 36 з 2 Мб оперативної пам’яті.
WinEunuuchs2Unix

2
Ви плутаєте сеанси, як у відкритих терміналах (див. OP), із сеансами всередині SSH-з'єднання. Ви згадуєте налаштування про те, скільки "підз'єднань" дозволено одним ssh-з'єднанням. Тож використання 30 команд "ssh" - це навіть не проблема MaxSessions 20. У сесіях, про які йдеться, йдеться про такі речі, як переадресація портів (і навіть відкрита більш ніж одна оболонка) з використанням одного і того ж з'єднання, а не про кількість входів у систему.
Алло

@allo ця інформація, яку ви отримали від ОП?
Джордж Удосен

1
@allo тут правильно, MaxSessions посилається на мультиплексування сеансу через одне з'єднання TCP. Якщо всі користувачі OP не роблять дивних речей для спільного використання одного TCP-з'єднання з сервером, цей ліміт не вплине на них. Я щойно перевірив це, встановивши низький ліміт MaxSessions на сервері та відкривши більше ніж багато підключень до нього.
Джо Лі-Моєт

5

Рішення Джорджа прекрасно працює, однак ви попросили баш сценарій ...

Так вважають цей для інших ситуацій , коли немає ніякої можливості , як MaxSessionsз sshd, то ви можете використовувати що - щось на зразок цього:

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

Що pkill -nвб'є найновіший екземпляр processName.

Правильне рішення цієї особливої ​​ситуації - відповідь Джорджа.


Хіба це також не запобіжить підпроцесам?
RonJohn

Так, це також призводить до вбивства підпроцесу.
Ravexina

2
Тоді - враховуючи, що bash розвиває безліч підпроцесів, і вони хочуть обмежити користувачів, а не процеси - це не здається корисною відповіддю.
RonJohn

1
@RonJohn Це була корисна відповідь, що відповідає вимогам користувача (Сценарій, який негайно закриває процес), а також для інших користувачів, які надходять із пошукових систем (загальна відповідь на заголовок), поки ви не редагували питання.
Ravexina

Дозвольте мені зайти сюди. Я також знаю, що це місце спрямовує користувачів на правильний шлях на основі заданих питань. Якщо ОП задає запитання, і правильна відповідь (заснована на питанні ОП) не обов'язково є найкращою практикою чи правильним підходом, я вважаю, що хтось має право заявити про це або дати відповіді, відповідні цим спостереженням. Я не думаю, що ми повинні приймати рішення про те, яка відповідь найкраща, нехай вирішує ОП, і я люблю бачити багато варіантів від добре обізнаних членів сайту. Будь ласка, давайте завжди мати конструктивні дискусії, це допомагає мені, якщо не будь-якій іншій людині!
Джордж Удосен

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

2

Питання не ясно. Дозвольте спочатку розповісти, як я це розумію і в який спосіб, ІМО, слід запитати:

У нас є локальна мережа, де один сервер постачає конкретну програму. Наша команда отримує доступ до цієї програми через ssh-з'єднання зі своїх комп’ютерів до сервера за допомогою PuTTY. У кожного учасника команди є свій обліковий запис користувача, який використовується для встановлення ssh-з'єднань ( а може бути: всі члени команди використовують загальний обліковий запис користувача).

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

Якщо ця інтерпретація правильна, можливо, правильним способом виконання вимог є створення групи користувачів , а потім додайте всі облікові записи користувачів до цієї групи та обмежте кількість макрологів через /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.

Інший відповідь мій, може забезпечити обхідний шлях до певної міри, але це свого роду задоволення , а не справжнє рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.