Esegui script (di sistema) all'accesso SSH e / o alla disconnessione


12

Vorrei che il mio server OpenSSH avvii uno script ogni volta che un utente accede utilizzando SSH, passando idealmente il nome host o IP, nonché il nome utente. Inoltre, vorrei che eseguisse uno script, ogni volta che una sessione è terminata (passando il nome utente). Questi script non devono essere eseguiti nella sessione dell'utente, ma a livello di sistema.

L'idea è quella di dare un avviso audio all'accesso e alla disconnessione, ad esempio utilizzando espeak, e di visualizzare le informazioni su un display esterno.

Ho visto che esiste un pam-scriptspacchetto ma non sono sicuro se questo fa quello che voglio, né come usarlo.

Risposte:


10

Puoi forzare un comando sui tuoi utenti SSH invece di quello richiesto (o della loro shell se non danno un comando specifico). Questo può essere fatto specificando quel comando con qualcosa come ForceCommand /root/ssh-wrapperin /etc/ssh/sshd_config(non importa dove si trova lo script o come è chiamato, basta assicurarsi che sia eseguibile da tutti gli utenti e che il file di configurazione sshd punti ad esso). È inoltre necessario riavviare / ricaricare sshd. Il comando originale è accessibile al comando forzato come $SSH_ORIGINAL_COMMAND.

Ho appena hackerato questo script insieme:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

Ora ogni volta che eseguo il login o il logout una voce me lo dice e una voce di registro viene scritta su syslog. Inoltre registra il comando. Puoi usare qualcosa come il seguente per "seguire" il tuo utilizzo di sshd:

tailf /var/log/syslog | grep ssh-wrapper

Si prega di notare che questo script è per lo più non testato, quindi utilizzare a proprio rischio! ;-)

PS: ricorda che questo script viene eseguito come l'utente che ha effettuato l'accesso, quindi non puoi fare tutto ciò che desideri se lo cambi per aggiungere altre funzionalità ...


Ciao, c'è un modo per rilevare la situazione quando l'utente ha appena chiuso la finestra con il client SSH. La tua sceneggiatura non aggancia questa situazione .. Grazie.
Dmitry Eskin,

In shell$ {SSH_ORIGINAL_COMMENT: -shell} deve essere sostituito con il percorso effettivo della shell, ad es. / bin / bash? Quando provo solo a eseguirlo, si lamenta che non esiste un comando come shell. In realtà, immagino che forse quello che volevi dire è $ SHELL? Ciò dovrebbe eseguire la shell specificata dall'utente.
Ibrahim,

1

Ho già visto questi eventi corrispondenti nel file di registro in precedenza (che ti consentirebbe la flessibilità di abbinare qualsiasi cosa). Questa pagina è mal formattata ma potrebbe aiutarti a iniziare: https://help.ubuntu.com/community/AudibleLogs#Play with esound


Penso che intendano espeakinvece di esound?
JanC

0

(Risposta inviata in corrispondenza della stessa domanda su ServerFault )

Basta scrivere una sceneggiatura per fare quello che vuoi e poi incollarla /etc/profileo eventualmente a /etc/bash.bashrcseconda delle tue esigenze. Le modifiche a tali file verranno applicate a tutti gli utenti. Tuttavia, non sono sicuro di come faresti per avvisarti del logout con questo approccio.

In alternativa, un altro modo per farlo sarebbe quello di avere un semplice monitoraggio daemon /var/log/authper le nuove (e chiuse) sessioni ssh. In questo modo sarebbe in grado di inviare notifiche sia per l'accesso che per la disconnessione.


0

Puoi usare sshrc (man sshd, cerca sshrc)

ssh eseguirà / etc / ssh / sshrc se esiste e puoi eseguire uno script (o chiamare più script) da lì

puoi chiamare qualsiasi variabile bash, come $USERo ottenere l'IP via

read -d " " ip <<< $SSH_CONNECTION

puoi scrivere uno script per testare o registrare ciò che vuoi.

Script di logout ... beh, questo è quello che sto cercando! : D


0

Penso che PAM sia l'opzione migliore. È a livello di sistema e non può essere sostituito dai file di configurazione dell'utente.

Puoi seguire questi passaggi. Hanno lavorato per me su Ubuntu 14.04.4 LTS.

Correre:

$ sudo pico /opt/custom/bin/info-session.sh

Modifica quel file vuoto e aggiungi queste righe:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

Dopodiché, autorizza l'esecuzione dello script:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

Ora esegui:

$ sudo pico /etc/pam.d/common-session

Aggiungi queste righe alla fine del file:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

Non è necessario riavviare alcun servizio. Si noti che questo script verrà eseguito anche quando un utente accede dal terminale anziché da SSH.

Nota 1: è possibile eseguire il pipe espeako qualsiasi altro processo adatto alle proprie esigenze (e-mail, notifica push e così via ...). Se si utilizza writee l' utente ha effettuato l'accesso, vedrà i messaggi di output direttamente sul proprio terminale.

Riferimenti:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -Login utente/

Relazionato:
Come posso impostare un avviso e-mail quando un accesso ssh ha esito positivo?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395.393 / email-notification-about-ogni-ssh-connection-to-linux server

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.