Comment empêcher l'arrêt lorsqu'un utilisateur SSH est connecté?

20

J'administre un environnement en réseau et j'ai eu une situation intéressante hier. Lorsqu'un hôte doit être arrêté par un utilisateur normal, il refuse de le faire si d'autres utilisateurs sont connectés localement. Ce n'est cependant pas le cas lorsque d'autres utilisateurs sont connectés via SSH. Si un utilisateur est connecté localement et qu'un utilisateur est connecté via SSH et que l'utilisateur connecté localement tente de l'arrêter, il réussit sans même un avertissement et la connexion SSH de l'autre utilisateur est brusquement interrompue. Ma question est, existe-t-il un moyen d'empêcher cela comme le fait la politique pour les utilisateurs locaux? J'ai déjà regardé la page de manuel sshd_configet je n'ai rien trouvé de apparenté.


EDIT (Informations supplémentaires.):

Il y a 4 OS sur le réseau: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 et Ubuntu 11.04. Le cas spécifique auquel je fais référence avait l'utilisateur SSH sur un hôte Mandriva 2009 et l'utilisateur local sur un hôte Mandriva 2011.

Les hôtes Mandriva 2009 utilisent l'environnement GNOME 2.28, les hôtes 2010.2 utilisent GNOME 2.32, les hôtes 2011 utilisent KDE Plasma et les hôtes Ubuntu 11.04 utilisent Unity.


Mise à jour

Comme je l'ai noté dans cette question , j'ai examiné les polkitactions sous /usr/share/polkit-1/actions/et trouvé (dans le fichier org.freedesktop.consolekit.policy) une action appelée org.freedesktop.consolekit.system.stop-multiple-usersqui lance le message

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

Je pense (en raison de la org.freedesktop.*convention de dénomination) qu'il s'agit d'une sorte de signal envoyé au DM via D-BUS. Je pense que si je peux découvrir quel signal déclenche cette polkitaction, je devrais pouvoir modifier son comportement. Des idées?


Update 2

J'ai essayé une petite expérience aujourd'hui et cela m'a donné des résultats très étranges. J'ai essayé de me connecter via SSH à une boîte et je me suis assuré qu'aucun autre utilisateur n'était connecté sur aucun VT. Si je choisis dans Shutdownle menu "Actions" de GDM, j'obtiens le message de politique tant attendu m'informant qu'il est impossible de le faire sans authentification car d'autres utilisateurs sont connectés. Cependant , si j'utilise GDM pour me connecter localement et choisir pour fermer la boîte à partir du menu de GNOME, la session SSH est encombrée comme auparavant. Comment est-ce possible? Le comportement est-il différent lorsque j'initie une shutdowndemande de GDM que lorsque je l'initie à partir d'un gnome-session? Est-ce que cela dit à quelqu'un quoi que ce soit qui puisse m'aider à résoudre le problème?

Joseph R.
la source
Il serait probablement utile que vous puissiez donner un indice sur le système d'exploitation que vous utilisez.
Jenny D
Il y a 4 OS sur le réseau: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 et Ubuntu 11.04. Je ne savais pas que c'était spécifique au système d'exploitation; modification de ma question ...
Joseph R.
2
Je pense que c'est plus à voir avec OS qu'avec SSH. Ce n'est pas quelque chose que j'ai rencontré dans les Unix que je dirige; mais là encore, je fais généralement l'arrêt en tant que root.
Jenny D
@JennyD: Une solution pourrait être d'empêcher les utilisateurs de fermer via l'interface utilisateur; mais je pense que ce serait plutôt ennuyeux pour eux.
Joseph R.
2
Plutôt que d'être un problème avec SSH, cela pourrait être un problème avec la configuration de PAM (sur l'hôte en cours d'arrêt). Avez-vous cherché à savoir comment PAM pourrait aider à arrêter les utilisateurs connectés et fournir le même avertissement à un utilisateur cherchant à arrêter le système?
Rob Gibson

Réponses:

3

J'écrirais un petit programme qui vérifiait toutes les connexions SSH actives via netstatet / ou ps. Déposez-le à la place de la shutdowncommande.

Si personne d'autre n'utilise la machine, appelez shutdownlorsque l'utilisateur essaie de le faire. Si quelqu'un utilise la machine, avertissez simplement l'utilisateur qui a émis la shutdowncommande.

Netstat vous donnera une sortie comme celle-ci, et c'est assez facile à rechercher .sshdans la sortie.

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

psvous donnera une sortie comme celle-ci, mais c'est un peu plus difficile car vous devez vous assurer de ne pas vous soucier des connexions sortantes. Netstatest probablement la bonne voie à suivre.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
kmort
la source
Sonne vraiment bien. Je pense qu'un moyen plus robuste consiste à augmenter la sessionchaîne SSH PAM avec un programme qui touche un fichier lorsqu'un utilisateur se connecte via SSH et le supprime lorsque l'utilisateur se déconnecte, puis que le programme que vous avez suggéré vérifie simplement l'existence de ces fichiers. Si cela fonctionne, j'accepte votre réponse.
Joseph R.
1
Cela devrait fonctionner. Une pensée: que se passe-t-il s'ils se déconnectent sans se déconnecter? Le fichier est-il touché si la session SSH se termine simplement? Vous voulez vous assurer que c'est le cas
kmort
Hmmm. C'est en effet matière à réflexion ...
Joseph R.
1
Peut-être que votre approche peut être simplifiée en analysant la sortie de à la whoplace. Il indique quel (s) utilisateur (s) est / sont connecté (s) et à partir de quel hôte.
Joseph R.
1
Très probable. Sur le shell que j'utilise le plus whone donne pas beaucoup de sortie, mais la plupart des autres shells le font. (Système embarqué idiot ...) Dans tous les cas, si vous souhaitez utiliser netstat, il est assez simple d'obtenir la colonne dont vous avez besoin awk. Quelque chose dans le sens de netstat -a | awk '{print $4}'(au moins sur ma coquille.)
kmort
2

Vous avez en fait trouvé la bonne information. Au moins, cela fonctionnait sous Ubuntu jusqu'au 13.04.

L'entrée de stratégie suivante, lors de la configuration avec "auth_admin_keep" comme ci-dessous, préférerait que l'arrêt se produise:

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

Mais d'une certaine manière, depuis le 13.10, cette politique est totalement ignorée. Jusqu'à présent, personne n'a pu me dire ce qui le remplacerait (le cas échéant).

Notez que vous disposez également d'une telle entrée pour le redémarrage (org.freedesktop.consolekit.system.restart-multiple-users) qui doit également être définie sur auth_admin_keep.

Voir aussi cette question / réponse sur AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password

Alexis Wilke
la source
0

Comptez les connexions SSH, et si plus que les vôtres, puis arrêtez:

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

Quelque chose comme ça?

J'insérerais probablement des variables de lecture pour que cela m'invite, comme "Voulez-vous quand même arrêter?" et "Voulez-vous arrêter?".

Ensuite, vous pouvez l'utiliser comme alias ou similaire.

Adionditsak
la source
Cela vérifie uniquement les connexions entrantes. Je viens de mentionner.
jamadagni