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

20

Estou administrando um ambiente de rede e tive uma situação interessante ontem. Quando um host é solicitado a desligar por um usuário comum, ele se recusa a fazer isso se outros usuários estiverem conectados localmente. Entretanto, esse não é o caso quando outros usuários estão conectados via SSH. Se um usuário estiver conectado localmente e um usuário estiver conectado via SSH e o usuário conectado localmente tentar desligar, ele será bem-sucedido sem nenhum 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 os usuários locais? Eu já procurei na página de manual sshd_confige não consegui encontrar nada que parecesse relacionado.


EDIT (Informações adicionais):

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 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, os hosts 2010.2 usam os hosts GNOME 2.32, 2011 usam o KDE Plasma e os hosts Ubuntu 11.04 usam o Unity.


Atualizar

Como observei nesta pergunta , examinei as polkitações abaixo /usr/share/polkit-1/actions/e encontrei (no arquivo org.freedesktop.consolekit.policy) uma ação chamada org.freedesktop.consolekit.system.stop-multiple-usersque lança a mensagem

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

Estou pensando (devido à org.freedesktop.*convenção de nomenclatura) que este é algum tipo de sinal enviado ao DM via D-BUS. Penso que, se descobrir qual sinal desencadeia essa polkitação, devo poder modificar seu comportamento. Alguma ideia?


Atualização 2

Eu tentei um pequeno experimento hoje e isso me deu resultados muito estranhos. Tentei efetuar login via SSH em uma caixa e verifiquei que nenhum outro usuário estava conectado em nenhum VT. Se eu optar Shutdownpelo menu "Ações" do GDM, a mensagem de política aguardada me informa que é impossível fazer isso sem autenticação, pois outros usuários estão conectados. No entanto , se eu usar o GDM para fazer login localmente e escolher Para fechar a caixa no menu do GNOME, a sessão SSH é bloqueada como antes. Como isso é possível? O comportamento é diferente quando eu inicio uma shutdownsolicitação do GDM e quando eu a inicio de dentro de um gnome-session? Isso diz a alguém algo que pode me ajudar a resolver o problema?

Joseph R.
fonte
Provavelmente ajudaria se você pudesse dar alguma dica sobre o SO que está executando.
Jenny D
Existem 4 sistemas operacionais na rede: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 e Ubuntu 11.04. Eu não sabia que isso era específico do sistema operacional; editar a minha pergunta ...
Joseph R.
2
Eu acho que tem mais a ver com o SO do que com o SSH. Não é algo que eu tenha enfrentado nos Unixes que corro; mas, novamente, eu costumo desligar como root.
Jenny D
@ JennyD: Uma solução pode ser impedir que os usuários se desliguem pela interface do usuário; mas acho que isso seria bastante irritante para eles.
Joseph R.
2
Em vez de ser um problema com o SSH, pode ser um problema com a configuração do PAM (no host sendo desligado). Você já viu como o PAM poderia ajudar o desligamento a determinar os usuários conectados e fornecer o mesmo aviso para um usuário que deseja desligar o sistema?
Rob Gibson,

Respostas:

3

Eu escreveria um pequeno programa que verificava todas as conexões SSH ativas via netstate / ou ps. Solte-o no lugar do shutdowncomando.

Se ninguém mais estiver usando a máquina, ligue shutdownquando o usuário tentar. Se alguém estiver usando a máquina, simplesmente avise o usuário que emitiu o shutdowncomando.

O Netstat fornecerá uma saída como essa e é muito fácil procurar .sshna 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               *.*

psfornecerá uma saída como essa, mas é um pouco mais difícil, pois você precisa se preocupar com as conexões de saída. Netstatprovavelmente é o caminho certo a seguir.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
kmort
fonte
Soa muito bem. Eu estou pensando que uma maneira mais robusta é aumentar a sessioncadeia SSH PAM com um programa que toca em um arquivo quando um usuário efetua login via SSH e o remove quando o usuário efetua logout e, em seguida, solicita que o programa sugerido simplesmente verifique a existência de esses arquivos. Se isso funcionar, estou aceitando sua resposta.
Joseph R.
11
Isso deve funcionar. Um pensamento: o que acontece se eles se desconectarem sem fazer logout? O arquivo é tocado se a sessão SSH simplesmente morre? Você gostaria de ter certeza de que sim
kmort 28/02
Hummm. Isso é realmente o que pensar ...
Joseph R.
11
Talvez sua abordagem possa ser simplificada analisando a saída who. Mostra quais usuários estão / estão conectados e de qual host.
Joseph R.
11
Muito provável. No shell que eu mais uso who, não dá muito resultado, mas a maioria dos outros shells. (Sistema bobo incorporado ...) De qualquer forma, se você quiser usar netstat, é muito simples obter a coluna que você precisa awk. Algo ao longo das linhas de netstat -a | awk '{print $4}'(pelo menos no meu shell.)
kmort
2

Você realmente encontrou as informações corretas. Pelo menos funcionou no Ubuntu até 13.04.

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

<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, essa política é totalmente ignorada. Até agora, ninguém foi capaz de me dizer o que o substituiria (se houver).

Observe que você também possui uma entrada para reinicialização (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: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password

Alexis Wilke
fonte
0

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

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

Provavelmente eu inseriria algumas variáveis ​​de leitura para que isso me levasse a perguntar: "Deseja desligar mesmo assim?" e "Deseja desligar?".

Então você pode usá-lo como um alias ou similar.

Adionditsak
fonte
Isso verifica apenas as conexões de entrada. Apenas mencionando.
jamadagni 6/10