Bagaimana cara saya mengatur peringatan email ketika login ssh berhasil?

56

Adakah yang memiliki skrip bash yang akan mengirim email atau memberi tahu seseorang jika berhasil masuk ke server ssh? Saya ingin diberi tahu jika ada yang masuk ke kotak pribadi saya.

Saya menggunakan Ubuntu 12.04 menjalankan xfce

Rick T
sumber

Jawaban:

46

Peringatan: menurut komentar, ini tidak berfungsi jika pengguna membuat file bernama ~/.ssh/rc. *

Ubah atau buat /etc/ssh/sshrcdengan konten berikut:

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 <[email protected]>" -t "Your Name <[email protected]>" -s smtp.server.com &

Ini akan memberi tahu Anda secara efektif melalui email kapan saja seseorang masuk melalui SSH, dan login akan dicatat di syslog.

Catatan: Anda memerlukan sendemailpaket ( sudo apt-get install sendemail) agar pemberitahuan email berfungsi.

Catatan: berfungsi dengan penerusan porta, tetapi dengan opsi -N tidak.

TuanCharlo
sumber
Apakah ini juga berfungsi jika klien tidak meminta TTY? Misalnya ssh -Ndengan hanya penerusan porta.
gertvdijk
apakah ini juga berfungsi ketika kita menggunakan gmail sebagai server smtp?
user155073
Ini membutuhkan Peringatan : Ini tidak berfungsi jika pengguna membuat file yang dipanggil ~/.ssh/rcsehingga tidak berguna sebagai tindakan pengamanan. @adosaiguas menjawab tentang pam_execyang benar.
Fritz
2
@mchid: Jika Anda mempertimbangkan pertanyaan "Saya ingin diberi tahu jika ada yang masuk ke kotak pribadi saya." , maka ini mungkin dapat diterima. Jika Anda hanya memiliki satu akun pengguna. Kalau tidak, Anda harus melakukannya untuk semua akun, termasuk setiap akun yang baru ditambahkan. Dan idealnya Anda harus memastikan bahwa pengguna tidak dapat mengubah atau menghapus ~/.ssh/rcfile mereka . Menggunakan metode berbasis sistem pamhanya lebih dapat diandalkan dan lebih aman, karena hanya rootdapat mengacaukannya. Jadi jawabannya adalah: sshrdMetode ini berfungsi baik untuk sistem pengguna tunggal, tetapi pammetode ini bekerja dengan andal untuk semua sistem.
Fritz
70

Peringatan: Seperti biasa ketika Anda mengubah konfigurasi login, biarkan sesi ssh cadangan terbuka di latar belakang dan uji login dari terminal baru.

Karena sshrcmetode ini tidak berfungsi jika pengguna memiliki ~/.ssh/rcfile sendiri , saya akan menjelaskan bagaimana melakukan ini dengan yang pam_execdisarankan oleh @adosaiguas. Hal yang baik adalah bahwa ini juga dapat dengan mudah disesuaikan dengan tipe login selain ssh(seperti login lokal atau bahkan semua login) dengan menghubungkan ke file yang berbeda /etc/pam.d/.

Pertama, Anda harus dapat mengirim email dari baris perintah. Ada pertanyaan lain tentang ini. Di server email, mungkin paling mudah untuk menginstal mailx(yang mungkin sudah terpasang).

Maka Anda memerlukan file skrip yang dapat dieksekusi login-notify.sh(saya taruh /etc/ssh/misalnya) dengan konten berikut. Anda dapat mengubah variabel untuk mengubah subjek dan konten pemberitahuan email. Jangan lupa untuk mengeksekusinya chmod +x login-notify.shagar bisa dieksekusi.

#!/bin/sh

# Change these two lines:
sender="[email protected]"
recepient="[email protected]"

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

Setelah memilikinya, Anda dapat menambahkan baris berikut ke /etc/pam.d/sshd:

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

Untuk tujuan pengujian, modul ini disertakan sebagai optional, sehingga Anda masih bisa masuk jika eksekusi gagal. Setelah Anda memastikan itu berfungsi, Anda dapat mengubahnya optionalmenjadi required. Maka login tidak akan mungkin kecuali eksekusi skrip hook Anda berhasil (jika itu yang Anda inginkan).

Bagi Anda yang membutuhkan penjelasan tentang apa itu PAM dan bagaimana cara kerjanya, inilah yang sangat bagus .

Fritz
sumber
1
Dikatakan: /etc/ssh/login-notify.sh failed: exit code 13tepat setelah login :(
FelikZ
3
Terima kasih, ini bekerja dengan baik. Pastikan Anda telah UsePAMmengatur yesdi sshd_config Anda.
Nicolas BADIA
2
Hanya catatan untuk diriku sendiri atau orang lain yang baru mengenal Selinux. Saya mendapat kesalahan izin ketika pam_exec menjalankan skrip. Kemudian saya mengetahui bahwa label itu salah untuk Selinux. Saya mengkloning skrip ke / bin / yang secara otomatis akan diberi label sebagai unconfined_u:object_r:bin_t:s0. Lalu aku chmod +x /bin/login-notify.shdan itu berhasil.
RedGiant
3
/etc/pam.d/login <- untuk login tty
Fernando André
2
@ 4wk_ Terima kasih atas petunjuknya. Saya menggantinya dengan tautan ke Internet Archive, jadi itu seharusnya berfungsi lagi sekarang.
Fritz
9

Kami telah menggunakan monit untuk memantau proses pada kotak linux kami. monit juga dapat memberi peringatan melalui email tentang login yang berhasil melalui ssh. Konfigurasi monit kami terlihat seperti ini

 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

Catatan: Konfigurasi server surat, format email dll. Harus diatur dalam monitrcfile

Pembaruan: Menulis posting blog yang lebih rinci tentang ini

Lakmus
sumber
7

Masukkan yang berikut ini /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

Cara kerja skrip

/etc/profiledieksekusi di setiap login (untuk pengguna bash shell). Pernyataan if hanya akan mengembalikan true jika pengguna telah login melalui ssh, yang pada gilirannya akan menyebabkan blok kode indentasi dijalankan.

Selanjutnya, kami kemudian membangun teks pesan:

  • $(date)akan diganti oleh output dari dateperintah
  • ${USER} akan diganti dengan nama login pengguna
  • $(hostname -f) akan diganti dengan nama host lengkap dari sistem yang sedang login

Baris kedua TEXTmenambah baris pertama, memberikan alamat IP sistem tempat pengguna ini masuk. Akhirnya, teks yang dihasilkan dikirim dalam email ke alamat Anda.

Ringkasan Linux, secara default, akan merekam setiap login sistem, apakah dengan ssh atau tidak, dalam file log sistem, tetapi kadang-kadang - terutama untuk sistem yang jarang diakses melalui ssh - pemberitahuan cepat dan kotor dapat berguna.

pengguna476225
sumber
2

Dalam pertanyaan lain ini Anda mungkin memiliki apa yang Anda cari. Pada dasarnya Anda dapat menambahkan panggilan ke perintah surat dalam skrip yang dijalankan saat pengguna masuk melalui ssh: /etc/pam.d/sshd

adosaiguas
sumber
2

Saya telah mengambil beberapa jawaban luar biasa dari utas ini dan membuat sesuatu yang lebih atau kurang copy-dan-paste. Menggunakan Mailgun untuk mengirim email sehingga Anda terhindar dari masalah dengan mengatur STMP. Anda hanya perlu kunci API Mailgun dan domain pengirim.

Setelah login SSH, skrip akan mengirimkan detail login (pengguna, nama host, alamat IP, dan semua variabel lingkungan saat ini) ke alamat email. Sangat mudah untuk menambahkan parameter lain yang ingin Anda kirim dengan menyesuaikan messagevariabel.

#!/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
pacharanero
sumber
Ini jawaban terbaik menurut saya. Ini sederhana dan tidak perlu mengirim e-mail dari mesin, yang pasti akan berakhir di folder spam kecuali jika dikonfigurasi dengan benar.
JayD3e
2

Adaptasi Mailgun dari jawaban @Fritz

Setelah posting saya perhatikan @pacharanero juga menulis tentang mailgun, tapi saya tidak mengerti apa yang mereka lakukan dengan menggali, jadi saya akan memposting solusi saya juga.

Jika Anda menggunakan VM yang tidak memiliki SMTP, Anda mungkin perlu menggunakan sesuatu seperti mailgun, sendgrid, atau sejenisnya. Ini bekerja untuk saya di Google Cloud.

Salah satu risiko dari pendekatan ini adalah penyerang dapat membuat email keluar Anda mengirimkan kredensial jika mereka dapat sudo sudan menemukan skrip atau Anda meninggalkan skrip agar pengiriman email dapat dibaca. mailgun memiliki daftar putih ip yang harus Anda atur, tapi itu tidak sempurna untuk kasus penggunaan khusus ini, jelas.

Skrip ini harus berfungsi dengan mailgun setelah Anda mengubah mydomain.comke domain Anda yang sebenarnya. Anda dapat menyimpan skrip di /root/login-alert.shatau beberapa lokasi yang tidak jelas.

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:your-mailgun-api-key-goes-here' 
    FROM='Login Alert <[email protected]>'
    TO='[email protected]'  
    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

Setelah itu Anda dapat mengikuti @Fritz jawaban untuk berubah /etc/pam.d/sshdtermasuk:

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

Saya perhatikan ini berfungsi tanpa izin baca untuk pengguna yang datang ( chmod 700 /root/login-alert.sh) sehingga pengguna yang datang tidak perlu membaca akses ke skrip.

Paul
sumber
1

Skrip ini dalam /etc/ssh/sshrcmengirim email dan menambahkan log ke logger sistem. Perbedaan dibuat (sehingga Anda dapat menonaktifkannya jika Anda mau) antara subnet pribadi Anda dan world wide web (memerlukan 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
Philippe Gachoud
sumber
1

Saya menggunakan swatchdog dari paket swatch untuk memonitor setiap baris yang mengandung frasa " gagal " (case-sensitive) di /var/log/auth.log . Saya mengaturnya untuk menjalankannya sebagai layanan systemd sederhana.

apt install swatch

Buat file configure /etc/swatch/swatch-auth-log.conf dengan root pemilik, izin 644 -

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

The "/ gagal / i" adalah regexp, dengan "i" menunjukkan itu adalah kasus sensitif. ( Sendmail saya adalah skrip yang mengirim semuanya ke alamat tetap melalui mailgun , jadi alamatnya tidak terlalu penting).

Buat file layanan systemd /etc/systemd/system/swatch-auth-log.service dengan root pemilik, izin 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

Kemudian aktifkan, mulai, dan lihat status layanan -

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

Contoh laporan status yang berhasil -

 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

Layanan akan secara otomatis dimulai saat boot dan dipantau oleh systemd .


Diskusi

Awalnya saya menggunakan solusi pam mirip dengan di atas, tetapi di /etc/pam.d/common-auth tidak sshd . Itu untuk menangkap ssh, sudo, dan login. Tetapi setelah pembaruan, semua kata sandi saya berhenti berfungsi, bahkan setelah mengubah kata sandi dalam mode penyelamatan. Akhirnya saya mengubah /etc/pam.d/common-auth kembali ke aslinya dan kata sandi berfungsi lagi. Berikut adalah deskripsi pada papan UNIX & Linux Stack Exchange

Saya memutuskan akan lebih aman untuk tidak menyentuh sulit untuk memahami pengaturan keamanan. Dan semuanya ada dalam file log.

Craig Hicks
sumber
0

Saya sebenarnya baru saja memodifikasi jawaban @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 <[email protected]>" &

Ini bekerja pada server 14,04, 16,04 dan Centos 6.5.x yang saya setup, saya cukup yakin Anda perlu memastikan mta dikonfigurasi, tetapi begitu selesai, ini berfungsi dengan baik. Langkah selanjutnya peringatan twilio

MrMesees
sumber