Como evitar o desligamento quando um usuário SSH está logado?

20

Estou administrando um ambiente de rede e tive uma situação interessante surgindo ontem. Quando um host é solicitado a ser desligado por um usuário comum, ele se recusa a fazê-lo se outros usuários estiverem conectados localmente. Isso, no entanto, não é o caso quando outros usuários estão logados via SSH. Se um usuário estiver logado localmente e um usuário estiver conectado via SSH e o usuário conectado localmente tentar encerrar, ele será bem-sucedido mesmo sem um aviso e a conexão SSH do outro usuário será encerrada abruptamente. Minha pergunta é, existe uma maneira de evitar isso como a política faz para usuários locais? Eu já olhei para a página do manual para sshd_config e não consegui encontrar nada que pareça relacionado.

EDIT (Informação adicional):

Existem 4 sistemas operacionais na rede: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 e Ubuntu 11.04. O caso específico ao qual estou me referindo tinha o usuário do SSH em um host do Mandriva 2009 e o usuário local em um host do Mandriva 2011.

Os hosts do Mandriva 2009 usam o ambiente GNOME 2.28, 2010.2 hosts usam o GNOME 2.32, os hosts de 2011 usam o KDE Plasma e os hosts do Ubuntu 11.04 usam o Unity.

Atualizar

Como eu observei em esta pergunta , examinei as ações polkit em /usr/share/polkit-1/actions/ e localizei (no arquivo org.freedesktop.consolekit.policy ) uma ação chamada org.freedesktop.consolekit.system.stop-multiple-users que envia a mensagem

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

Estou pensando (devido à convenção de nomenclatura org.freedesktop.* ) que este é algum tipo de sinal enviado ao DM via D-BUS. Eu acho que se eu puder descobrir qual sinal aciona essa ação polkit , eu deveria ser capaz de modificar seu comportamento. Alguma idéia?

Atualização 2

Eu tentei uma pequena experiência hoje e isso me deu resultados muito estranhos. Eu tentei fazer o login via SSH para uma caixa e certifiquei-me de que nenhum outro usuário estivesse logado em qualquer VT. Se eu escolho Shutdown do menu "Ações" do GDM, recebo a mensagem política há muito aguardada informando que é impossível fazer isso sem autenticação, já que outros usuários estão conectados. No entanto , se eu usar o GDM para efetuar login local e optar por encerrar a caixa do menu do GNOME, a sessão SSH será destruída como antes. Como isso é possível? O comportamento é diferente quando inicio uma solicitação shutdown do GDM do que quando eu inicio a partir de um gnome-session ? Isso diz alguma coisa a alguém que possa me ajudar a resolver o problema?

    
por Joseph R. 28.02.2013 / 13:32

3 respostas

3

Eu escreveria um pequeno programa que verificava as conexões SSH ativas via netstat e / ou ps . Solte-o no lugar do comando shutdown .

Se ninguém mais estiver usando a máquina, chame shutdown quando o usuário tentar. Se alguém estiver usando a máquina, simplesmente avise o usuário que emitiu o comando shutdown .

O Netstat dará a você uma saída assim, e é muito fácil procurar .ssh na saída.

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 fornecerá uma saída como essa, mas é um pouco mais difícil, porque você precisa se preocupar em não se preocupar com conexões de saída. Netstat é provavelmente o caminho certo a seguir.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
    
por 28.02.2013 / 18:40
2

Você encontrou a informação correta. Pelo menos funcionou no Ubuntu até 13.04.

A seguinte entrada de política, quando configurada com "auth_admin_keep" como abaixo, preferiria que o desligamento acontecesse:

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

Mas de alguma forma, desde 13,10, esta política é totalmente ignorada. Até agora ninguém foi capaz de me dizer o que iria substituí-lo (se alguma coisa).

Note que você também tem uma entrada para reiniciar (org.freedesktop.consolekit.system.restart-multiple-users) que também deve ser definida como auth_admin_keep .

Veja esta pergunta / resposta também no AskUbuntu: link

    
por 15.10.2014 / 06:34
0

Conte as conexões SSH e, se forem mais que as suas, encerre:

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 parecido com isto?

Eu provavelmente inseriria algumas variáveis de leitura, o que me perguntaria, como "Deseja desligar de qualquer maneira?" e "Você quer desligar?".

Você pode usá-lo como um alias ou similar.

    
por 15.10.2014 / 07:04