Как предотвратить отключение при входе пользователя SSH?

20

Я администрирую сетевое окружение, и у меня вчера возникла интересная ситуация. Когда хост требует выключения обычным пользователем, он отказывается сделать это, если другие пользователи вошли в систему локально. Это, однако, не тот случай, когда другие пользователи вошли в систему через SSH. Если один пользователь вошел в систему локально, а один пользователь вошел в систему через SSH, а локально вошедший в систему пользователь попытается завершить работу, то это произойдет даже без предупреждения, а соединение SSH другого пользователя будет внезапно прервано. У меня вопрос, есть ли способ предотвратить это, как это делает политика для локальных пользователей? Я уже заглянул на страницу справочника sshd_configи не смог найти ничего похожего.


РЕДАКТИРОВАТЬ (Дополнительная информация.):

В сети есть 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.*соглашения об именах), что это какой-то сигнал, посылаемый DM через D-BUS. Я думаю, что если я смогу узнать, какой сигнал запускает это polkitдействие, я смогу изменить его поведение. Любые идеи?


Обновление 2

Сегодня я попробовал небольшой эксперимент, и он дал мне очень странные результаты. Я попытался войти через SSH в одну коробку и удостоверился, что никакие другие пользователи не вошли ни на одном VT. Если я выбираю в Shutdownменю «Действия» GDM, я получаю долгожданное сообщение о политике, информирующее меня о том, что это невозможно сделать без аутентификации, поскольку вошли другие пользователи. Однако , если я использую GDM для локального входа и выбора чтобы закрыть окно из меню GNOME, сеанс SSH, как и прежде, прерывается. Как это возможно? Отличается ли поведение, когда я инициирую shutdownзапрос из GDM, и когда я инициирую его изнутри gnome-session? Это говорит кому-нибудь что-нибудь, что может помочь мне решить проблему?

Джозеф Р.
источник
Вероятно, было бы полезно, если бы вы могли дать намек на то, какую ОС вы используете.
Дженни Д
В сети есть 4 ОС: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 и Ubuntu 11.04. Я не осознавал, что это зависит от ОС; редактирование моего вопроса ...
Джозеф Р.
2
Я думаю, что это больше связано с ОС, чем с SSH. Это не то, с чем я столкнулся в Unixes, которые я запускаю; но опять же, я обычно делаю выключение как root.
Дженни Д
@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
kmort
источник
Звучит действительно хорошо. Я думаю, что более надежный способ состоит в том, чтобы дополнить sessionцепочку PAM SSH программой, которая обращается к файлу при входе пользователя через 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

Что-то вроде этого?

Я, вероятно, вставил бы некоторые переменные чтения, чтобы они подсказали мне, например: «Вы все равно хотите завершить работу?» и «Вы хотите выключить?».

Тогда вы можете использовать его в качестве псевдонима или аналогичного.

Adionditsak
источник
Это проверяет только входящие соединения. Просто упомяну.
Джамадагни