SSH - Connessioni remote e timeout

In passato ho spesso trovato su un server molte connessioni ssh degli utenti che rimanevano "appese" per giorni (a volte anche mesi).

Posso immaginare situazioni tipo: un utente si connette, lancia un programma/script/altro, poi se ne dimentica e spegne il suo client.

Lanciando il comando pstree e filtrando per ssh si possono vedere gli id dei processi, la loro relazione e effettuare il kill di quelli che si ritengono ormai morti.

Per evitare di agire a mano processo per processo, ho cercato di configurare i tempi di timeout della shell e di ssh per prevenire situazioni come quella precedente.

La prima cosa da fare è agire sul server su /etc/ssh/sshd_config scrivendo

-> Dopo 3600 secondi (1 ora) in cui  non riceve dati dal client, il demone sshd sul server manda un messaggio al client in cui gli richiede di rispondere.

-> Dopo aver mandato 3 richieste (una ogni ClientAliveInterval, nel mio caso  3600, ovvero 3*3600sec= 3 ore) al client senza ricevere risposta, la connessione viene interrotta.

Di default inoltre sul server dovrebbe esserci

che è utile per disconnettere le sessioni in caso di problemi con la connessione di rete.

Sul client è possibile effettuare le stesse configurazioni, modificando /etc/ssh/ssh_config e utilizzando le direttive ServerAliveInterval,  ServerAliveCountMax e TCPKeepAlive. Chiaramente agendo sul server impatto su tutti gli utenti senza dover mettere mano ai loro client...

Con un client per Windows come putty si può, nel tab Connection (specifico per ogni connessione che si salva), scrivere ogni quanti secondi di inattività spedire il messaggio di keepalive.

putty_timeout

Dopo aver effettuato queste modifiche ho trovato molto utile agire anche sulla shell, forzando bash a disconnettere l'utente dopo 1 giorno di inutilizzo. Per fare questo basta configurare la variabile d'ambiente TMOUT che, da manaule

Per aggiungere un tempo di timeout a cui tutti gli utenti debbano sottostare, ho inserito in /etc/profile

(ovvero 1 giorno).

Per vedere se la variabile d'ambiente è stata recepita ci si connette con un utente e si digita

Nel caso in cui si voglia che un utente in particolare (per esempio root) non venga disconnesso e non abbia quindi questa limitazione, inserisco nel ~/.bash_profile

 

 

 

 

 

 

 

Print Friendly, PDF & Email