Wie kann ein Herunterfahren verhindert werden, wenn ein SSH-Benutzer angemeldet ist?

20

Ich verwalte eine vernetzte Umgebung und habe gestern eine interessante Situation erlebt. Wenn ein Host von einem normalen Benutzer heruntergefahren werden muss, wird dies abgelehnt, wenn andere Benutzer lokal angemeldet sind. Dies ist jedoch nicht der Fall, wenn andere Benutzer über SSH angemeldet sind. Wenn ein Benutzer lokal angemeldet ist und ein Benutzer über SSH angemeldet ist und der lokal angemeldete Benutzer versucht, den Computer herunterzufahren, ist dies ohne Warnung erfolgreich und die SSH-Verbindung des anderen Benutzers wird abrupt beendet. Meine Frage ist, gibt es eine Möglichkeit, dies zu verhindern, wie dies die Richtlinie für lokale Benutzer tut? Ich habe bereits auf der Manpage nachgesehen sshd_configund konnte nichts finden, was verwandt zu sein scheint.


EDIT (Zusatzinfo.):

Es gibt 4 Betriebssysteme im Netzwerk: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 und Ubuntu 11.04. Der spezielle Fall, auf den ich mich beziehe, hatte den SSH-Benutzer auf einem Mandriva 2009-Host und den lokalen Benutzer auf einem Mandriva 2011-Host.

Mandriva 2009-Hosts verwenden die GNOME 2.28-Umgebung, 2010.2-Hosts verwenden GNOME 2.32, 2011-Hosts verwenden KDE Plasma und die Ubuntu 11.04-Hosts verwenden Unity.


Aktualisieren

Wie ich in dieser Frage festgestellt habe , habe ich polkitunter Aktionen gesucht /usr/share/polkit-1/actions/und (in der Datei org.freedesktop.consolekit.policy) eine Aktion namens gefunden org.freedesktop.consolekit.system.stop-multiple-users, die die Nachricht auslöst

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

Ich denke (aufgrund der org.freedesktop.*Namenskonvention), dass dies eine Art Signal ist, das über den D-BUS an den DM gesendet wird. Ich denke, wenn ich herausfinden kann, welches Signal diese polkitAktion auslöst , sollte ich in der Lage sein, ihr Verhalten zu ändern. Irgendwelche Ideen?


Update 2

Ich habe heute ein kleines Experiment versucht und es hat mir sehr seltsame Ergebnisse gebracht. Ich habe versucht, mich über SSH an einer Box anzumelden, und habe sichergestellt, dass keine anderen Benutzer an VTs angemeldet waren. Wenn ich wählen Shutdownaus dem Menü „Aktionen“ von GDM, erhalte ich die lang erwartete Nachricht Politik mich darüber informiert , dass es unmöglich ist , so ohne Authentifizierung zu tun , wie andere Benutzer angemeldet sind. Allerdings , wenn ich GDM verwenden , um lokal anmelden und wählen Um die Box über das GNOME-Menü herunterzufahren, ist die SSH-Sitzung wie zuvor überlastet. Wie ist das möglich? Ist das Verhalten beim Initiieren einer shutdownAnforderung von GDM anders als beim Initiieren innerhalb von a gnome-session? Hat das jemandem etwas zu sagen, das mir helfen kann, das Problem zu lösen?

Joseph R.
quelle
Es würde wahrscheinlich helfen, wenn Sie einen Hinweis geben könnten, welches Betriebssystem Sie ausführen.
Jenny D
Es gibt 4 Betriebssysteme im Netzwerk: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 und Ubuntu 11.04. Ich wusste nicht, dass dies betriebssystemspezifisch ist. Bearbeitung meiner Frage ...
Joseph R.
2
Ich denke, es hat mehr mit dem Betriebssystem als mit SSH zu tun. Es ist nicht etwas, gegen das ich in den Unixen, die ich laufen lasse, gestoßen bin. Aber normalerweise fahre ich als root herunter.
Jenny D
@JennyD: Eine Lösung könnte darin bestehen, Benutzer daran zu hindern, über die Benutzeroberfläche herunterzufahren. aber ich denke das wäre ziemlich nervig für sie.
Joseph R.
2
Anstatt ein Problem mit SSH zu sein, könnte es ein Problem mit der Konfiguration von PAM sein (auf dem Host, der heruntergefahren wird). Haben Sie untersucht, wie PAM beim Herunterfahren dazu beitragen kann, angemeldete Benutzer zu ermitteln und einem Benutzer, der das System herunterfahren möchte, die gleiche Warnung zu übermitteln?
Rob Gibson

Antworten:

3

Ich würde ein kleines Programm schreiben, das nach aktiven SSH-Verbindungen über netstatund / oder sucht ps. Legen Sie es anstelle des shutdownBefehls ab.

Wenn das Gerät von niemand anderem verwendet wird, rufen Sie an, shutdownwenn der Benutzer dies versucht. Wenn jemand das Gerät verwendet, warnen Sie einfach den Benutzer, der den shutdownBefehl ausgegeben hat .

Netstat gibt Ihnen eine Ausgabe wie diese, und es ist ziemlich einfach, .sshin der Ausgabe zu suchen .

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

psDas gibt Ihnen eine Ausgabe wie diese, ist jedoch etwas schwieriger, da Sie sich keine Sorgen um ausgehende Verbindungen machen müssen. Netstatist wahrscheinlich der richtige Weg.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
kmort
quelle
Hört sich wirklich gut an. Ich denke, ein robusterer Weg ist, die SSH-PAM- sessionKette mit einem Programm zu erweitern, das eine Datei berührt, wenn sich ein Benutzer über SSH anmeldet, und sie entfernt, wenn sich der Benutzer abmeldet und das von Ihnen vorgeschlagene Programm einfach auf das Vorhandensein von überprüft diese Dateien. Wenn dies funktioniert, akzeptiere ich Ihre Antwort.
Joseph R.
1
Das sollte funktionieren. Ein Gedanke: Was passiert, wenn die Verbindung getrennt wird, ohne sich abzumelden? Wird die Datei berührt, wenn die SSH-Sitzung einfach abbricht? Sie sollten sicherstellen, dass dies der Fall ist
kmort
Hmmm. Das ist in der Tat ein Denkanstoß ...
Joseph R.
1
Vielleicht kann Ihr Ansatz vereinfacht werden, indem Sie whostattdessen die Ausgabe von analysieren . Es wird angezeigt, welche Benutzer verbunden sind und von welchem ​​Host.
Joseph R.
1
Sehr wahrscheinlich. Auf der Shell, die ich am häufigsten benutze, whowird nicht viel ausgegeben, aber auf den meisten anderen Shells. (Dumme eingebettete Systeme ...) Auf jeden Fall ist netstates ziemlich einfach, die Spalte zu finden, mit der Sie arbeiten möchten awk. Etwas in der Art von netstat -a | awk '{print $4}'(zumindest auf meiner Muschel.)
kmort
2

Sie haben tatsächlich die richtigen Informationen gefunden. Zumindest funktionierte es unter Ubuntu bis zum 13.04.

Der folgende Richtlinieneintrag würde bei der Einrichtung mit "auth_admin_keep" (siehe unten) das Herunterfahren vorziehen:

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

Aber irgendwie wird diese Politik seit 13.10 völlig ignoriert. Bisher konnte mir niemand sagen, was es ersetzen würde (wenn überhaupt).

Beachten Sie, dass Sie auch einen solchen Eintrag für den Neustart haben (org.freedesktop.consolekit.system.restart-multiple-users), der ebenfalls auf gesetzt werden sollte auth_admin_keep.

Sehen Sie diese Frage / Antwort auch auf AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password

Alexis Wilke
quelle
0

Zählen Sie SSH-Verbindungen und beenden Sie, wenn mehr als Ihre vorhanden sind:

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

Etwas wie das?

Ich würde wahrscheinlich einige Lesevariablen einfügen, damit ich dazu aufgefordert werde, z. B. "Möchten Sie trotzdem herunterfahren?" und "Möchten Sie herunterfahren?".

Dann könnten Sie es als Alias ​​oder ähnliches verwenden.

Adionditsak
quelle
Dies prüft nur auf eingehende Verbindungen. Nur erwähnen.
Jamadagni