Come posso impostare un avviso e-mail quando un accesso ssh ha esito positivo?


56

Qualcuno ha uno script bash che invierà un'e-mail o avviserà qualcuno nel caso di un accesso riuscito a un server SSH? Voglio essere avvisato se qualcuno accede alla mia casella personale.

Sto usando Ubuntu 12.04 con xfce

Risposte:


46

Attenzione: secondo i commenti, questo non funziona se l'utente crea un file chiamato ~/.ssh/rc. *

Modifica o crea /etc/ssh/sshrccon i seguenti contenuti:

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | sendemail -q -u "SSH Login" -f "Originator <from@address.com>" -t "Your Name <your.email@domain.com>" -s smtp.server.com &

Questo ti avviserà efficacemente via e-mail ogni volta che qualcuno accede tramite SSH e il login verrà registrato nel syslog.

Nota: è necessario il sendemailpacchetto ( sudo apt-get install sendemail) affinché la notifica e-mail funzioni.

Nota: funziona con il port forwarding, ma con l'opzione -N no.


Funziona anche se il client non richiede un TTY? Ad esempio ssh -Ncon solo il port forwarding.
gertvdijk,

funziona anche quando usiamo gmail come server smtp?
user155073,

Questo ha bisogno di un avvertimento : non funziona se l'utente crea un file chiamato, ~/.ssh/rcquindi è abbastanza inutile come misura di sicurezza. La risposta di @adosaiguas in merito pam_execè quella corretta.
Fritz,

2
@mchid: se consideri la domanda "Voglio essere avvisato se qualcuno accede alla mia casella personale". , quindi questo potrebbe essere accettabile. Se hai un solo account utente. Altrimenti devi farlo per tutti gli account, incluso ogni account appena aggiunto. E idealmente devi assicurarti che gli utenti non possano modificare o eliminare il loro ~/.ssh/rcfile. L'uso di un metodo a livello di sistema basato su pamè solo più affidabile e più sicuro, perché solo rootpuò rovinarlo. Quindi la risposta è: i sshrdmetodi funzionano bene per i sistemi a utente singolo, ma il pammetodo funziona in modo affidabile per tutti i sistemi.
Fritz,

70

Avvertenza: come sempre quando si modifica la configurazione di accesso, lasciare aperta una sessione ssh di backup in background e testare l'accesso da un nuovo terminale.

Poiché il sshrcmetodo non funziona se l'utente ha il proprio ~/.ssh/rcfile, spiegherò come farlo pam_execcome suggerito da @adosaiguas. La cosa buona è che questo può anche essere facilmente adattato a tipi di login diversi da ssh(come accessi locali o anche tutti gli accessi) collegandosi a un altro file /etc/pam.d/.

Per prima cosa devi essere in grado di inviare posta dalla riga di comando. Ci sono altre domande a riguardo. Su un server di posta è probabilmente più facile da installare mailx(che probabilmente è già installato comunque).

Quindi è necessario un file di script eseguibile login-notify.sh(l'ho inserito /etc/ssh/ad esempio) con il seguente contenuto. È possibile modificare le variabili per modificare l'oggetto e il contenuto della notifica e-mail. Non dimenticare di eseguire chmod +x login-notify.shper renderlo eseguibile.

#!/bin/sh

# Change these two lines:
sender="sender-address@example.com"
recepient="notify-address@example.org"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    message="`env`"
    echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi

Una volta che lo hai, puoi aggiungere la seguente riga a /etc/pam.d/sshd:

session optional pam_exec.so seteuid /path/to/login-notify.sh

A scopo di test, il modulo è incluso come optional, in modo che sia ancora possibile accedere se l'esecuzione non riesce. Dopo esserti accertato che funzioni, puoi passare optionala required. Quindi l'accesso non sarà possibile a meno che l'esecuzione dello script hook non abbia esito positivo (se è quello che vuoi).

Per quelli di voi che hanno bisogno di una spiegazione di cos'è PAM e di come funziona, eccone uno molto valido .


1
Dice: /etc/ssh/login-notify.sh failed: exit code 13subito dopo il login :(
FelikZ

3
Grazie, funziona benissimo. Assicurati di aver UsePAMimpostato su yesnel tuo sshd_config.
Nicolas BADIA,

2
Solo una nota per me o per altre persone che non conoscono Selinux. Ho ricevuto un errore di autorizzazione quando pam_exec ha eseguito lo script. Successivamente ho scoperto che era stato erroneamente etichettato per Selinux. Ho clonato lo script su / bin / che verrà automaticamente etichettato come unconfined_u:object_r:bin_t:s0. Quindi io chmod +x /bin/login-notify.she funziona.
RedGiant,

3
/etc/pam.d/login <- per accessi tty
Fernando André

2
@ 4wk_ Grazie per il suggerimento. L'ho sostituito con un collegamento a Internet Archive, quindi ora dovrebbe funzionare di nuovo.
Fritz,

9

Abbiamo usato monit per monitorare i processi sui nostri box Linux. monit può anche avvisare tramite e-mail di accessi riusciti su ssh. La nostra configurazione del monit è simile a questa

 check file ssh_logins with path /var/log/auth.log  
     # Ignore login's from whitelist ip addresses
     ignore match "100.100.100.1"    
     # Else, alert
     if match "Accepted publickey" then alert

Nota: la configurazione del server di posta, il formato e-mail, ecc. Devono essere impostati nel monitrcfile

Aggiornamento: ha scritto un post sul blog più dettagliato su questo


7

Inserisci quanto segue /etc/profile:

if [ -n "$SSH_CLIENT" ]; then 
    TEXT="$(date): ssh login to ${USER}@$(hostname -f)" 
    TEXT="$TEXT from $(echo $SSH_CLIENT|awk '{print $1}')" 
    echo $TEXT|mail -s "ssh login" you@your.domain 
fi

Come funziona la sceneggiatura

/etc/profileviene eseguito ad ogni login (per gli utenti della shell bash). L'istruzione if restituirà vero solo se l'utente ha effettuato l'accesso tramite ssh, il che a sua volta provocherà l'esecuzione del blocco di codice rientrato.

Quindi, costruiamo il testo del messaggio:

  • $(date)sarà sostituito dall'output del datecomando
  • ${USER} sarà sostituito dal nome di accesso dell'utente
  • $(hostname -f) sarà sostituito dal nome host completo del sistema su cui si è effettuato l'accesso

La seconda TEXTriga si aggiunge alla prima, fornendo l'indirizzo IP del sistema da cui l'utente sta effettuando l'accesso. Infine, il testo generato viene inviato tramite e-mail al tuo indirizzo.

Riepilogo Linux, per impostazione predefinita, registra ogni accesso al sistema, sia tramite ssh o meno, nei file di registro del sistema, ma a volte - in particolare per un sistema a cui si accede raramente tramite ssh - può essere utile una notifica rapida e sporca.


2

In questa altra domanda probabilmente hai quello che stai cercando. Fondamentalmente è possibile aggiungere una chiamata al comando mail nello script che viene eseguito quando un utente accede tramite ssh: /etc/pam.d/sshd


2

Ho preso alcune delle risposte eccellenti da questo thread e ho creato qualcosa che è più o meno copia e incolla. Utilizza Mailgun per inviare le e-mail in modo da evitare qualsiasi problema con la configurazione di STMP. Hai solo bisogno di una chiave API Mailgun e un dominio di invio.

All'accesso SSH, lo script invierà i dettagli dell'accesso (utente, nome host, indirizzo IP e tutte le variabili di ambiente correnti) a un indirizzo e-mail. È facile aggiungere altri parametri che desideri inviare personalizzando la messagevariabile.

#!/bin/sh

# this script is triggered on SSH login and sends an email with details of the login
# such as user, IP, hostname, and environment variables

# script should be placed somewhere on the server, eg /etc/ssh
# to trigger on SSH login, put this line in /etc/pam.d/sshd:
#   session optional pam_exec.so seteuid /etc/ssh/snippet-for-sending-emails-on-SSH-login-using-PAM.sh

# Script settings
MAILGUN_API_KEY=
MAILGUN_DOMAIN=
SENDER_NAME=
SENDER_EMAIL_ADDRESS=
RECIPIENT_EMAIL_ADDRESS=

if [ "$PAM_TYPE" != "close_session" ]; then
    host=$(hostname)
    ip=$(dig +short myip.opendns.com @resolver1.opendns.com) # gets public IP
    # Message to send, e.g. the current environment variables.
    subject="SSH login - user:$USER pam-host:$PAM_RHOST host:$host ip:$ip" \
    message=$(env)
    curl -s --user '$MAILGUN_API_KEY' \
        https://api.mailgun.net/v3/$MAILGUN_DOMAIN/messages \
        -F from='$SENDER_NAME <$SENDER_EMAIL_ADDRESS>' \
        -F to=$RECIPIENT_EMAIL_ADDRESS \
        -F subject="$subject" \
        -F text="${subject} ${message}"
fi

Questa è la migliore risposta secondo me. È semplice e non richiede l'invio di un'e-mail dalla macchina, che finirà sicuramente nella cartella spam a meno che non sia configurato correttamente.
JayD3e

2

Adattamento Mailgun della risposta @Fritz

Dopo la pubblicazione ho notato che anche @pacharanero scrive di mailgun, ma non capisco cosa stiano facendo con lo scavo, quindi pubblicherò anche la mia soluzione.

Se si utilizza una macchina virtuale che non dispone di SMTP, potrebbe essere necessario utilizzare qualcosa come mailgun, sendgrid o simili. Questo ha funzionato per me su Google Cloud.

Un rischio di questo approccio è che un utente malintenzionato possa ottenere la tua e-mail in uscita inviando credenziali se può sudo sue trova lo script o lasci lo script per l'invio di e-mail leggibile. mailgun ha una whitelist ip che dovresti impostare, ma questo è imperfetto per questo particolare caso d'uso, ovviamente.

Questo script dovrebbe funzionare con mailgun dopo aver cambiato il mydomain.comtuo dominio reale. È possibile salvare lo script in /root/login-alert.shuna posizione più oscura.

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:your-mailgun-api-key-goes-here' 
    FROM='Login Alert <mailgun@mg.mydomain.com>'
    TO='me@mydomain.com'  
    SUBJECT="Login: $PAM_USER @ mydomain.com from $PAM_RHOST"
    DATE=$(date)
    TEXT="At $DATE a login occurred for $PAM_USER on mydomain.com from $PAM_RHOST"
    curl -s --user $APK \
     https://api.mailgun.net/v3/mg.mydomain.com/messages \
     -F from="$FROM" \
     -F to="$TO" \
     -F subject="$SUBJECT" \
     -F text="$TEXT"
fi

Dopodiché puoi seguire la risposta di @Fritz per modificare /etc/pam.d/sshdper includere:

session optional pam_exec.so seteuid /root/login-alert.sh

Noto che funziona senza autorizzazioni di lettura per gli utenti in arrivo ( chmod 700 /root/login-alert.sh), quindi gli utenti in arrivo non devono avere accesso in lettura allo script.


1

Questo script in /etc/ssh/sshrcinvia un'email e aggiunge un registro al logger di sistema. Viene fatta una differenza (quindi puoi disabilitarla se vuoi) tra la tua sottorete personale e il world wide web (richiesto sudo apt-get install mailutils).

SUBNET="192.168.0"

IP=`echo $SSH_CONNECTION | cut -d " " -f 1`
CURRENT_SUBNET="$(echo $IP|cut -d'.' -f1-3)"
if [ "$CURRENT_SUBNET" = "$SUBNET" ]; then
        msg="This message comes from same subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
else
        msg="This message comes from different subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
fi

logger -t ssh-wrapper $USER login from $IP

1

Sto usando swatchdog dal pacchetto swatch per monitorare eventuali righe contenenti la frase " fail " (senza distinzione tra maiuscole e minuscole) in /var/log/auth.log . L'ho impostato per eseguirlo come un semplice servizio systemd.

apt install swatch

Creare un file di configurazione /etc/swatch/swatch-auth-log.conf con root proprietario, autorizzazione 644 -

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t auth.log@xxx.com

Il "/ fallire / i" è un'espressione regolare, con la "i" indica è case insensitive. (Il mio sendmail è uno script che invia tutto a un indirizzo fisso tramite mailgun , quindi l'indirizzo non ha molta importanza).

Creare un file di servizio systemd /etc/systemd/system/swatch-auth-log.service con root proprietario, autorizzazione 644 -

[Unit]
Description=monitor /var/log/auth.log, send fail notices by mail

[Service]
ExecStart=/usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log

[Install]
#WantedBy=multi-user.target
WantedBy=pre-network.target

Quindi abilitare, avviare e visualizzare lo stato del servizio -

sudo systemctl enable swatch-auth-log.service
sudo systemctl start swatch-auth-log.service
sudo systemctl status swatch-auth-log.service

Un esempio di rapporto sullo stato corretto:

 swatch-auth-log.service - monitor /var/log/auth.log, send fail notices by mail
   Loaded: loaded (/etc/systemd/system/swatch-auth-log.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-31 21:41:52 PST; 17min ago
 Main PID: 27945 (swatchdog)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/swatch-auth-log.service
           ├─27945 /usr/bin/perl /usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log
           ├─27947 /usr/bin/perl /.swatchdog_script.27945
           └─27949 /usr/bin/tail -n 0 -F /var/log/auth.log

Jan 31 21:41:52 ub18 systemd[1]: Started monitor /var/log/auth.log, send fail notices by mail.
Jan 31 21:41:52 ub18 swatchdog[27945]: *** swatchdog version 3.2.4 (pid:27945) started at Thu Jan 31 21:41:52 PST 2019

Il servizio verrà avviato automaticamente all'avvio e monitorato da systemd .


Discussione

Inizialmente ho usato una soluzione pam simile alla precedente, ma in /etc/pam.d/common-auth non sshd . Quello era catturare ssh, sudo e login. Ma dopo un aggiornamento tutte le mie password hanno smesso di funzionare, anche dopo aver cambiato le password in modalità di salvataggio. Alla fine ho cambiato il file /etc/pam.d/common-auth con l'originale e le password hanno funzionato di nuovo. Ecco una descrizione sulla scheda UNIX e Linux di Exchange Exchange

Ho deciso che sarebbe stato più sicuro non toccare le impostazioni di sicurezza difficili da comprendere. E comunque tutto è nei file di registro.


0

In realtà ho appena modificato la risposta @SirCharlo

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | mail -s "SSH Login" "who to <who-to@youremail.com>" &

Funziona su server 14.04, 16.04 e Centos 6.5.x che ho installato, sono abbastanza sicuro che devi assicurarti che mta sia configurato, ma una volta fatto, funziona. Prossimo passo avvisi di twilio

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.