Risposte:
Attenzione: secondo i commenti, questo non funziona se l'utente crea un file chiamato
~/.ssh/rc
. *
Modifica o crea /etc/ssh/sshrc
con 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 sendemail
pacchetto ( sudo apt-get install sendemail
) affinché la notifica e-mail funzioni.
Nota: funziona con il port forwarding, ma con l'opzione -N no.
~/.ssh/rc
quindi è abbastanza inutile come misura di sicurezza. La risposta di @adosaiguas in merito pam_exec
è quella corretta.
~/.ssh/rc
file. L'uso di un metodo a livello di sistema basato su pam
è solo più affidabile e più sicuro, perché solo root
può rovinarlo. Quindi la risposta è: i sshrd
metodi funzionano bene per i sistemi a utente singolo, ma il pam
metodo funziona in modo affidabile per tutti i sistemi.
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 sshrc
metodo non funziona se l'utente ha il proprio ~/.ssh/rc
file, spiegherò come farlo pam_exec
come 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.sh
per 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 optional
a 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 .
/etc/ssh/login-notify.sh failed: exit code 13
subito dopo il login :(
UsePAM
impostato su yes
nel tuo sshd_config.
unconfined_u:object_r:bin_t:s0
. Quindi io chmod +x /bin/login-notify.sh
e funziona.
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 monitrc
file
Aggiornamento: ha scritto un post sul blog più dettagliato su questo
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
/etc/profile
viene 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 date
comando${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 TEXT
riga 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.
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
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 message
variabile.
#!/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
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 su
e 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.com
tuo dominio reale. È possibile salvare lo script in /root/login-alert.sh
una 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/sshd
per 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.
Questo script in /etc/ssh/sshrc
invia 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
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.
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
ssh -N
con solo il port forwarding.