¿Cómo evitar el apagado cuando un usuario SSH está conectado?


20

Estoy administrando un entorno en red y ayer tuve una situación interesante. Cuando un usuario normal requiere que un host se apague, se niega a hacerlo si otros usuarios inician sesión localmente. Sin embargo, este no es el caso cuando otros usuarios inician sesión a través de SSH. Si un usuario inicia sesión localmente y un usuario inicia sesión a través de SSH y el usuario que inició sesión localmente intenta apagarse, tiene éxito sin siquiera una advertencia y la conexión SSH del otro usuario se interrumpe abruptamente. Mi pregunta es, ¿hay alguna manera de evitar esto como lo hace la política para los usuarios locales? Ya he buscado en la página del manual sshd_configy no pude encontrar nada que parezca relacionado.


EDITAR (Información adicional):

Hay 4 sistemas operativos en la red: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 y Ubuntu 11.04. El caso específico al que me refiero tenía el usuario SSH en un host Mandriva 2009 y el usuario local en un host Mandriva 2011.

Los hosts Mandriva 2009 usan el entorno GNOME 2.28, los hosts 2010.2 usan GNOME 2.32, los hosts 2011 usan KDE Plasma y los hosts Ubuntu 11.04 usan Unity.


Actualizar

Como señalé en esta pregunta , busqué polkitacciones debajo /usr/share/polkit-1/actions/y encontré (en el archivo org.freedesktop.consolekit.policy) una acción llamada org.freedesktop.consolekit.system.stop-multiple-usersque arroja el mensaje

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

Estoy pensando (debido a la org.freedesktop.*convención de nomenclatura) que se trata de algún tipo de señal enviada al DM a través de D-BUS. Creo que si puedo averiguar qué señal desencadena esta polkitacción, debería poder modificar su comportamiento. ¿Algunas ideas?


Actualización 2

Intenté un pequeño experimento hoy y me dio resultados muy extraños. Intenté iniciar sesión a través de SSH en una casilla y me aseguré de que ningún otro usuario iniciara sesión en ningún VT. Si elijo en Shutdownel menú "Acciones" de GDM, recibo el mensaje de política largamente esperado que me informa que es imposible hacerlo sin autenticación ya que otros usuarios están conectados. Sin embargo , si uso GDM para iniciar sesión localmente y elegir Para cerrar la caja desde el menú de GNOME, la sesión SSH se cierra como antes. ¿Cómo es esto posible? ¿El comportamiento es diferente cuando inicio una shutdownsolicitud de GDM que cuando la inicio desde dentro de a gnome-session? ¿Eso le dice a alguien algo que pueda ayudarme a resolver el problema?


Probablemente ayudaría si pudiera dar alguna pista sobre qué sistema operativo está ejecutando.
Jenny D

Hay 4 sistemas operativos en la red: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 y Ubuntu 11.04. No me di cuenta de que esto era específico del sistema operativo; editando mi pregunta ...
Joseph R.

2
Creo que tiene más que ver con el sistema operativo que con SSH. No es algo con lo que me haya topado en los Unixes con los que corro; pero, de nuevo, generalmente hago el apagado como root.
Jenny D

@ JennyD: Una solución podría ser evitar que los usuarios se apaguen a través de la interfaz de usuario; pero creo que eso sería bastante molesto para ellos.
Joseph R.

2
En lugar de ser un problema con SSH, podría ser un problema con la configuración de PAM (en el host que se está cerrando). ¿Ha investigado cómo PAM podría ayudar al apagado a determinar los usuarios conectados y proporcionar la misma advertencia a un usuario que busca apagar el sistema?
Rob Gibson

Respuestas:


3

Escribiría un pequeño programa que verificara las conexiones SSH activas a través de netstaty / o ps. Déjalo en el lugar del shutdowncomando.

Si nadie más está usando la máquina, llame shutdowncuando el usuario lo intente. Si alguien está usando la máquina, simplemente avise al usuario que emitió el shutdowncomando.

Netstat le dará una salida como esta, y es bastante fácil de buscar .sshen la salida.

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

psle dará una salida como esta, pero es un poco más difícil porque debe asegurarse de no preocuparse por las conexiones salientes. Netstates probablemente el camino correcto a seguir.

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

Suena muy bien. Estoy pensando que una forma más sólida es aumentar la sessioncadena SSH PAM con un programa que toca un archivo cuando un usuario inicia sesión a través de SSH y lo elimina cuando el usuario cierra sesión y luego hace que el programa que sugirió simplemente verifique la existencia de estos archivos Si esto funciona, estoy aceptando tu respuesta.
Joseph R.

1
Eso debería funcionar. Un pensamiento: ¿qué sucede si se desconectan sin cerrar sesión? ¿Se toca el archivo si la sesión SSH simplemente muere? Querrás asegurarte de que así sea
kmort

Hmmm De hecho, eso es algo para pensar ...
Joseph R.

1
Quizás su enfoque pueda simplificarse analizando la salida de en su wholugar. Muestra qué usuario (s) está (n) conectado (s) y desde qué host.
Joseph R.

1
Muy probable. En el shell que uso más whono da mucha salida, pero la mayoría de los otros shells lo hacen. (Sistema embebido tonto ...) En cualquier caso, si quieres usarlo netstat, es bastante simple obtener la columna que necesitas awk. Algo en la línea de netstat -a | awk '{print $4}'(Al menos en mi caparazón)
kmort

2

En realidad encontraste la información correcta. Al menos funcionó en Ubuntu hasta 13.04.

La siguiente entrada de política, cuando se configura con "auth_admin_keep" como se muestra a continuación, preferiría que ocurriera el apagado:

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

Pero de alguna manera, desde 13.10, esta política es totalmente ignorada. Hasta ahora, nadie ha podido decirme qué lo reemplazaría (si es que hay algo).

Tenga en cuenta que también tiene dicha entrada para reiniciar (org.freedesktop.consolekit.system.restart-multiple-users) que también debe establecerse en auth_admin_keep.

Vea esta pregunta / respuesta también en AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

Cuente las conexiones SSH, y si es más que la suya, apague:

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

¿Algo como esto?

Probablemente inserte algunas variables de lectura para que me pregunte, como "¿Desea cerrar de todos modos?" y "¿Quieres cerrar?".

Entonces podría usarlo como un alias o similar.


Esto verifica solo las conexiones entrantes. Solo mencionando.
jamadagni
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.