Як запобігти відключенню, коли користувач SSH увійшов до системи?


20

Я керую мережевим середовищем, і в мене вчора виникла цікава ситуація. Якщо хост вимагає відключення звичайного користувача, він відмовляється це робити, якщо інші користувачі входять в систему на локальному рівні. Однак це не так, коли інші користувачі входять у систему через SSH. Якщо один користувач увійшов локально, а один користувач увійшов через SSH і локально ввійшов у систему користувач, спроби відключити його, це не вдасться навіть без попередження, а SSH-з'єднання іншого користувача різко припиняється. Моє запитання, чи є спосіб запобігти цьому, як це робить політика для місцевих користувачів? Я вже переглянув сторінку чоловіка sshd_configі не зміг знайти нічого, що здається пов'язаним.


EDIT (Додаткова інформація.):

У мережі є 4 ОС: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 та Ubuntu 11.04. Конкретний випадок, з яким я маю на увазі, був користувач SSH на хості Mandriva 2009 і локальний користувач на хості Mandriva 2011.

Хости Mandriva 2009 використовують середовище GNOME 2.28, хости 2010.2 використовують GNOME 2.32, 2011 хости використовують KDE Plasma, а хости Ubuntu 11.04 використовують Unity.


Оновлення

Як я зазначив у цьому питанні , я розглядав polkitдії під /usr/share/polkit-1/actions/і знаходив (у файлі org.freedesktop.consolekit.policy) дію, яка називається, org.freedesktop.consolekit.system.stop-multiple-usersяка кидає повідомлення

System policy prevents stopping the system when other users are logged in

Я думаю (завдяки org.freedesktop.*умові іменування), що це якийсь сигнал, що надсилається до ДМ через D-BUS. Я думаю, що якщо я можу дізнатися, який сигнал викликає цю polkitдію, я маю змогу змінити його поведінку. Будь-які ідеї?


Оновлення 2

Я спробував сьогодні трохи експериментувати, і це дало мені дуже дивні результати. Я спробував увійти через SSH в одне поле і переконався, що жоден користувач не входив на жодні VT. Якщо я вибираю в Shutdownменю "Дії" в GDM, я отримую довгоочікуване повідомлення про політику, яке повідомляє мені, що це неможливо зробити без автентифікації, оскільки інші користувачі входять у систему. Однак , якщо я використовую GDM для локального входу та вибору щоб вимкнути вікно з меню GNOME, SSH-сеанс клобується, як і раніше. Як це можливо? Чи відрізняється поведінка, коли я ініціюю shutdownзапит від GDM, ніж коли я ініціюю його зсередини gnome-session? Чи говорить це комусь, що може допомогти мені вирішити проблему?


Можливо, це допоможе, якщо ви зможете дати підказку щодо того, яку ОС ви працюєте.
Jenny D

У мережі є 4 ОС: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 та Ubuntu 11.04. Я не розумів, що це стосується ОС; редагуючи моє запитання ...
Джозеф Р.

2
Я думаю, що це більше стосується ОС, ніж SSH. Це не те, на що я натрапив у Unixes, якими я бігаю; але знову ж таки, я зазвичай роблю відключення як root.
Jenny D

@JennyD: рішенням може бути запобігання відключенню користувачів через інтерфейс користувача; але я думаю, що це буде їм дуже дратувати.
Джозеф Р.

2
Замість того, щоб бути проблемою з SSH, це може бути проблема з конфігурацією PAM (при відключенні хоста). Чи вивчали ви, як PAM може допомогти зупинці визначати користувачів, які ввійшли, та подати таке ж попередження для користувача, який бажає вимкнути систему?
Роб Гібсон

Відповіді:


3

Я б написав невелику програму, яка перевіряла наявність активних SSH-з'єднань через netstatта / або ps. Відкиньте його замість shutdownкоманди.

Якщо ніхто не використовує апарат, дзвоніть, shutdownколи користувач намагається. Якщо хтось використовує машину, просто попередити користувача, який видав shutdownкоманду.

Netstat дасть такий вихід, і це досить легко шукати .sshу виході.

netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        State
tcp        0     52  10.5.6.xx.ssh          10.6.6.yy.51400        ESTABLISHED
tcp        0      0  *.ssh                  *.*                    LISTEN
udp        0      0  *.syslog               *.*

psдасть такий вихід, але це трохи складніше, оскільки ви повинні переконатися, що не турбуєтесь про вихідні з'єднання. Netstatце, мабуть, правильний шлях.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd

Звучить дуже добре. Я думаю, що більш надійним способом є розширення sessionланцюга SSH PAM за допомогою програми, яка торкається файлу, коли користувач входить у систему через SSH та видаляє його, коли користувач виходить із системи, а потім запропонує програмі, яку ви запропонували, просто перевірити на наявність ці файли. Якщо це працює, я приймаю вашу відповідь.
Джозеф Р.

1
Це має спрацювати. Одна думка: що станеться, якщо вони відключаються, не виходячи з системи? Чи торкається файл, якщо сеанс SSH просто вмирає? Ви хочете переконатися, що це
kmort

Хммм. Це справді їжа для роздумів ...
Джозеф Р.

1
Можливо, ваш підхід може бути спрощений шляхом аналізу результатів whoзамість цього. Він показує, які користувачі (користувачі) підключені / підключені та від якого хоста.
Джозеф Р.

1
Ймовірно. На оболонці, яку я використовую, більшість whoне дає великого результату, але більшість інших оболонок вони роблять. (Дурно вбудована система ...) У будь-якому випадку, якщо ви хочете скористатися netstat, дістати потрібний стовпець досить просто awk. Щось по лінії netstat -a | awk '{print $4}'(Принаймні, на моїй оболонці.)
кморт

2

Ви фактично знайшли потрібну інформацію. Принаймні, він працював в Ubuntu до 13.04.

Наступний запис політики при налаштуванні з "auth_admin_keep", як показано нижче, вважає за краще відключення:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

Але якось з 13.10 ця політика повністю ігнорується. Досі ніхто не зміг сказати мені, що б замінило його (якщо що).

Зауважте, що у вас також є такий запис для перезавантаження (org.freedesktop.consolekit.system.restart-кілька користувачів), для якого також слід встановити auth_admin_keep.

Дивіться також це питання / відповідь на AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

Підраховуйте підключення SSH, а якщо більше, ніж ваше, то відключення:

SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)

if [ "$SSH_CONS" -gt 1 ]
then
    echo "More than 1 SSH connection..."
else
    echo "Shutting down..."
    # halt
fi

Щось на зразок цього?

Я б, мабуть, вставив деякі змінні, прочитані, щоб це підказало мені, як-от "Ви все одно хочете відключитись?" та "Ви хочете відключення?".

Тоді ви можете використовувати його як псевдонім або подібний.


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