Come prevenire l'arresto quando un utente SSH è connesso?


20

Sto amministrando un ambiente di rete e ieri ho avuto una situazione interessante. Quando un host deve arrestare un utente normale, si rifiuta di farlo se altri utenti sono connessi localmente. Questo, tuttavia, non è il caso in cui altri utenti hanno effettuato l'accesso tramite SSH. Se un utente ha effettuato l'accesso localmente e un utente ha effettuato l'accesso tramite SSH e l'utente che ha effettuato l'accesso localmente tenta di arrestarsi, riesce anche senza un avviso e la connessione SSH dell'altro utente viene interrotta bruscamente. La mia domanda è: c'è un modo per impedirlo come fa la politica per gli utenti locali? Ho già guardato la pagina di manuale sshd_confige non sono riuscito a trovare nulla di simile.


MODIFICA (Ulteriori informazioni):

Ci sono 4 sistemi operativi in ​​rete: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 e Ubuntu 11.04. Il caso specifico a cui mi riferisco ha avuto l'utente SSH su un host Mandriva 2009 e l'utente locale su un host Mandriva 2011.

Gli host Mandriva 2009 usano l'ambiente GNOME 2.28, gli host 2010.2 usano GNOME 2.32, gli host 2011 usano KDE Plasma e gli host Ubuntu 11.04 usano Unity.


Aggiornare

Come ho notato in questa domanda , ho esaminato le polkitazioni sotto /usr/share/polkit-1/actions/e ho trovato (nel file org.freedesktop.consolekit.policy) un'azione chiamata org.freedesktop.consolekit.system.stop-multiple-usersche lancia il messaggio

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

Sto pensando (a causa della org.freedesktop.*convenzione di denominazione) che si tratta di una sorta di segnale inviato al DM tramite D-BUS. Penso che se posso scoprire quale segnale attiva questa polkitazione, dovrei essere in grado di modificarne il comportamento. Qualche idea?


Aggiornamento 2

Ho provato un piccolo esperimento oggi e mi ha dato risultati molto strani. Ho provato ad accedere tramite SSH a una casella e mi sono assicurato che nessun altro utente fosse connesso a nessun VT. Se scelgo Shutdowndal menu "Azioni" di GDM, ricevo il messaggio di politica tanto atteso che mi informa che è impossibile farlo senza autenticazione poiché altri utenti hanno effettuato l'accesso. Tuttavia , se utilizzo GDM per accedere localmente e scegliere per chiudere la finestra dal menu di GNOME, la sessione SSH è bloccata come prima. Com'è possibile? Il comportamento è diverso quando avvio una shutdownrichiesta da GDM rispetto a quando la avvio da all'interno di un gnome-session? Questo dice a qualcuno qualcosa che può aiutarmi a risolvere il problema?


Probabilmente sarebbe d'aiuto se potessi dare qualche suggerimento su quale sistema operativo stai eseguendo.
Jenny D,

Ci sono 4 sistemi operativi in ​​rete: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 e Ubuntu 11.04. Non mi ero reso conto che questo fosse specifico del sistema operativo; modifica la mia domanda ...
Joseph R.,

2
Penso che abbia più a che fare con il sistema operativo che con SSH. Non è qualcosa contro cui mi imbatto negli Unix in cui corro; ma poi di nuovo, di solito faccio l'arresto come root.
Jenny D,

@JennyD: una soluzione potrebbe essere quella di impedire agli utenti di chiudere tramite l'interfaccia utente; ma penso che sarebbe piuttosto fastidioso per loro.
Joseph R.,

2
Invece di essere un problema con SSH, potrebbe essere un problema con la configurazione di PAM (sull'host in fase di arresto). Hai esaminato come PAM potrebbe aiutare l'arresto a determinare gli utenti che hanno effettuato l'accesso e fornire lo stesso avviso a un utente che desidera arrestare il sistema?
Rob Gibson,

Risposte:


3

Scriverei un piccolo programma che controllava eventuali connessioni SSH attive tramite netstate / o ps. Rilascialo al posto del shutdowncomando.

Se nessun altro utilizza la macchina, chiamare shutdownquando l'utente tenta di farlo. Se qualcuno sta utilizzando la macchina, avvisa semplicemente l'utente che ha emesso il shutdowncomando.

Netstat ti darà un output in questo modo, ed è abbastanza facile da cercare .sshnell'output.

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

psti darà un output del genere, ma è un po 'più difficile perché devi assicurarti di non preoccuparti delle connessioni in uscita. Netstatè probabilmente la strada giusta da percorrere.

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

Suona davvero bene. Sto pensando che un modo più robusto è quello di aumentare la sessioncatena SSH PAM con un programma che tocca un file quando un utente accede tramite SSH e lo rimuove quando l'utente si disconnette e quindi il programma che hai suggerito è sufficiente verificare l'esistenza di questi file. Se funziona, accetto la tua risposta.
Joseph R.,

1
Dovrebbe funzionare. Un pensiero: cosa succede se si disconnettono senza disconnettersi? Il file viene toccato se la sessione SSH muore semplicemente? Dovresti assicurarti che lo faccia
kmort

Hmmm. Questo è davvero uno spunto di riflessione ...
Joseph R.,

1
Forse il tuo approccio può essere semplificato analizzando invece l'output di who. Mostra quali utenti sono / sono connessi e da quale host.
Joseph R.,

1
Molto probabilmente. Sulla shell che uso di più whonon dà molto output, ma la maggior parte delle altre shell lo fa. (Sistema stupido incorporato ...) In ogni caso, se vuoi usarlo netstat, è abbastanza semplice ottenere la colonna di cui hai bisogno awk. Qualcosa del genere di netstat -a | awk '{print $4}'(almeno sul mio guscio.)
kmort

2

Hai effettivamente trovato le informazioni giuste. Almeno ha funzionato sotto Ubuntu fino al 13.04.

La seguente voce della politica, quando impostata con "auth_admin_keep" come di seguito, preferirebbe che si verificasse l'arresto:

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

Ma in qualche modo, dal 13.10, questa politica è totalmente ignorata. Nessuno finora è stato in grado di dirmi cosa lo sostituirà (se non altro.)

Nota che hai anche una voce del genere per il riavvio (org.freedesktop.consolekit.system.restart-multiple-users) che dovrebbe anche essere impostata su auth_admin_keep.

Vedi questa domanda / risposta anche su AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

Conta le connessioni SSH e, se più delle tue, quindi spegni:

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

Qualcosa come questo?

Vorrei probabilmente inserire alcune variabili di lettura in modo che mi venga richiesto, ad esempio "Vuoi spegnere comunque?" e "Vuoi spegnere?".

Quindi potresti usarlo come alias o simile.


Controlla solo le connessioni in entrata. Sto solo citando.
Jamadagni,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.