Jak zapobiec zamknięciu, gdy użytkownik SSH jest zalogowany?

20

Administruję środowiskiem sieciowym i miałem wczoraj ciekawą sytuację. Gdy host musi zostać zamknięty przez zwykłego użytkownika, odmawia tego, jeśli inni użytkownicy są zalogowani lokalnie. Nie dzieje się tak jednak, gdy inni użytkownicy są zalogowani za pośrednictwem SSH. Jeśli jeden użytkownik jest zalogowany lokalnie, a jeden użytkownik jest zalogowany za pośrednictwem SSH, a użytkownik zalogowany lokalnie próbuje zamknąć system, to udaje się to bez ostrzeżenia, a połączenie SSH drugiego użytkownika zostaje nagle przerwane. Moje pytanie brzmi: czy istnieje sposób, aby temu zapobiec, podobnie jak zasady obowiązujące lokalnych użytkowników? Już szukałem strony podręcznika użytkownika sshd_configi nie mogłem znaleźć niczego, co mogłoby się wydawać powiązane.


EDYCJA (dodatkowe informacje.):

W sieci znajdują się 4 systemy operacyjne: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 i Ubuntu 11.04. Konkretny przypadek, o którym mówię, to użytkownik SSH na hoście Mandriva 2009 i użytkownik lokalny na hoście Mandriva 2011.

Hosty Mandriva 2009 używają środowiska GNOME 2.28, hosty 2010.2 używają GNOME 2.32, hosty 2011 używają KDE Plazmy, a hosty Ubuntu 11.04 używają Unity.


Aktualizacja

Jak zauważyłem w tym pytaniu , przejrzałem polkitakcje poniżej /usr/share/polkit-1/actions/i znalazłem (w pliku org.freedesktop.consolekit.policy) akcję wywoływaną, org.freedesktop.consolekit.system.stop-multiple-usersktóra rzuca komunikat

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

Myślę (ze względu na org.freedesktop.*konwencję nazewnictwa), że jest to jakiś sygnał wysyłany do DM przez D-BUS. Myślę, że jeśli mogę dowiedzieć się, jaki sygnał wyzwala to polkitdziałanie, powinienem być w stanie zmodyfikować jego zachowanie. Jakieś pomysły?


Aktualizacja 2

Próbowałem dzisiaj małego eksperymentu, który dał mi bardzo dziwne wyniki. Próbowałem zalogować się przez SSH do jednego urządzenia i upewniłem się, że żaden inny użytkownik nie jest zalogowany na żadnym VT. Jeśli wybiorę Shutdownz menu „Działania” GDM, dostaję długo oczekiwany komunikat o polityce, który informuje mnie, że nie można tego zrobić bez uwierzytelnienia, ponieważ inni użytkownicy są zalogowani. Jeśli jednak używam GDM do lokalnego logowania i wybrania aby zamknąć okno z menu GNOME, sesja SSH jest zablokowana jak poprzednio. Jak to jest możliwe? Czy zachowanie różni się, gdy inicjuję shutdownżądanie od GDM, niż gdy inicjuję je z poziomu gnome-session? Czy to mówi komukolwiek coś, co może mi pomóc rozwiązać problem?

Joseph R.
źródło
Prawdopodobnie pomogłoby to, gdybyś mógł podpowiedzieć, jakiego systemu operacyjnego używasz.
Jenny D
W sieci znajdują się 4 systemy operacyjne: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 i Ubuntu 11.04. Nie zdawałem sobie sprawy, że było to specyficzne dla systemu operacyjnego; edytowanie mojego pytania ...
Joseph R.
2
Myślę, że bardziej dotyczy to systemu operacyjnego niż SSH. To nie jest coś, z czym się spotykam w Uniksach, które prowadzę; ale z drugiej strony zwykle wyłączam się jako root.
Jenny D
@JennyD: Rozwiązaniem może być zapobieganie zamykaniu się użytkowników za pomocą interfejsu użytkownika; ale myślę, że byłoby to dla nich irytujące.
Joseph R.
2
Zamiast być problemem z SSH, może to być problem z konfiguracją PAM (na zamykanym hoście). Czy zastanawiałeś się, w jaki sposób PAM może pomóc w zamknięciu w ustaleniu zalogowanych użytkowników i zapewnić to samo ostrzeżenie użytkownikowi, który chce zamknąć system?
Rob Gibson

Odpowiedzi:

3

Napisałbym mały program, który sprawdzał, czy nie ma aktywnych połączeń SSH przez netstati / lub ps. Upuść go w miejsce shutdownpolecenia.

Jeśli nikt inny nie korzysta z urządzenia, zadzwoń, shutdowngdy użytkownik spróbuje. Jeśli ktoś korzysta z urządzenia, po prostu ostrzeż użytkownika, który wydał shutdownpolecenie.

Netstat da ci taki wynik, i dość łatwo jest poszukać .sshw wynikach.

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               *.*

psda ci taki wynik, ale jest to trochę trudniejsze, ponieważ musisz się martwić o połączenia wychodzące. Netstatjest prawdopodobnie właściwą drogą.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
kmort
źródło
Brzmi naprawde dobrze. Myślę, że bardziej niezawodnym sposobem jest rozszerzenie sessionłańcucha SSH PAM o program, który dotyka pliku, gdy użytkownik loguje się przez SSH i usuwa go, gdy użytkownik się wylogowuje, a następnie program, który zasugerowałeś, po prostu sprawdza istnienie te pliki. Jeśli to zadziała, przyjmuję twoją odpowiedź.
Joseph R.
1
To powinno działać. Jedna myśl: co się stanie, jeśli rozłączą się bez wylogowania? Czy plik zostanie dotknięty, jeśli sesja SSH po prostu umrze? Chcesz się upewnić, że tak jest
kmort
Hmmm. To jest rzeczywiście przemyślenie ...
Joseph R.
1
Być może twoje podejście można uprościć, analizując wyniki whozamiast. Pokazuje, którzy użytkownicy są podłączeni i z którego hosta.
Joseph R.
1
Bardzo możliwe. W powłoce, której używam najczęściej who, nie daje dużej mocy wyjściowej, ale robi to większość innych powłok. (Silly embedded system ...) W każdym razie, jeśli chcesz użyć netstat, uzyskanie kolumny, której potrzebujesz, jest dość proste awk. Coś w stylu netstat -a | awk '{print $4}'(Przynajmniej na mojej skorupie)
kmort
2

Właściwie znalazłeś właściwą informację. Przynajmniej działało pod Ubuntu do 13.04.

Poniższy wpis zasad, gdy zostanie skonfigurowany za pomocą „auth_admin_keep” jak poniżej, wolałby, aby zamknięcie systemu miało miejsce:

<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>

Ale w jakiś sposób, od 13.10, ta polityka jest całkowicie ignorowana. Jak dotąd nikt nie był w stanie mi powiedzieć, co by go zastąpiło (jeśli w ogóle).

Zauważ, że masz również taki wpis dotyczący restartu (org.freedesktop.consolekit.system.restart-wielu-użytkowników), który również powinien być ustawiony na auth_admin_keep.

Zobacz także to pytanie / odpowiedź na AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password

Alexis Wilke
źródło
0

Policz połączenia SSH, a jeśli więcej niż twoje, zamknij:

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

Coś takiego?

Prawdopodobnie wstawiłbym kilka odczytanych zmiennych, aby wyświetliło się pytanie: „Czy mimo to chcesz się zamknąć?” i „Czy chcesz się zamknąć?”.

Następnie możesz użyć go jako aliasu lub podobnego.

Adionditsak
źródło
Sprawdza tylko połączenia przychodzące. Właśnie wspominam.
jamadagni