Bir ssh girişi başarılı olduğunda bir e-posta uyarısını nasıl ayarlarım?


56

Bir ssh sunucusunda başarılı bir oturum açma durumunda birisine e-posta gönderecek veya bildirecek bir bash betiği var mı? Birisi kişisel kutuma giriş yaparsa bilgilendirilmek istiyorum.

Ubuntu 12.04 kullanıyorum xfce kullanıyorum

Yanıtlar:


46

Uyarı: yorumlara göre, kullanıcı adlı bir dosya oluşturursa bu çalışmaz ~/.ssh/rc. *

/etc/ssh/sshrcAşağıdaki içerikleri kullanarak değiştirin veya oluşturun :

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 &

Bu, herhangi biri SSH aracılığıyla oturum açtığında sizi e-posta ile etkili bir şekilde bilgilendirecek ve giriş syslog'da oturum açacaktır.

Not: E-posta bildiriminin çalışması için sendemailpakete ( sudo apt-get install sendemail) ihtiyacınız olacaktır.

Not: port yönlendirme ile çalışır, fakat -N seçeneği ile değildir.


Müşteri aynı zamanda bir TTY istemediğinde de çalışır mı? Örneğin ssh -Nsadece kapı yönlendirmesiyle.
gertvdijk

Bu, gmail’i smtp sunucusu olarak kullanırken de işe yarar mı?
user155073

Bunun bir Uyarıya ihtiyacı var : Bu, kullanıcı adı verilen bir dosya oluşturursa çalışmaz, bu ~/.ssh/rcnedenle güvenlik önlemi olarak kullanışsızdır. @adosaigua'nın cevabı pam_execdoğru mu?
Fritz

2
@mchid: "Birisi kişisel kutuma giriş yaparsa haberdar olmak istiyorum" sorusunu düşünürseniz . , O zaman bu olabilir kabul edilebilir. Eğer yalnızca bir kullanıcı hesabı var. Aksi halde , yeni eklenen her hesap dahil, tüm hesaplar için yapmanız gerekir . Ve ideal olarak, kullanıcıların dosyalarında değişiklik yapamayacağından veya silemediğinden emin olmalısınız ~/.ssh/rc. Tabanlı sistem çapında bir yöntem kullanmak pamsadece daha güvenilir ve daha güvenlidir, çünkü yalnızca rootbununla uğraşabilir. Yani cevap: sshrdMetodlar tek kullanıcılı sistemler için uygun, fakat pammetot tüm sistemler için güvenilir bir şekilde çalışıyor .
Fritz

70

Uyarı: Giriş yapılandırmasını her zaman yaptığınız gibi, arka planda bir yedekleme ssh oturumu açık bırakın ve girişi yeni bir terminalden test edin.

sshrcKullanıcı kendi ~/.ssh/rcdosyasına sahipse , yöntem çalışmadığı için, bunu pam_exec@adosaiguas'ın önerdiği şekilde nasıl yapacağınızı açıklayacağım . Bunun iyi bir yanı, bunun da ssh(yerel girişler ve hatta tüm girişler gibi) dışındaki giriş türlerine farklı bir dosyaya bağlanarak kolayca uyarlanabilmesidir /etc/pam.d/.

Öncelikle komut satırından posta gönderebilmeniz gerekir. Bununla ilgili başka sorular da var. Bir posta sunucusunda kurulumu muhtemelen en kolay olanıdır mailx(ki zaten zaten yüklenmiştir).

Sonra aşağıdaki içerikle çalıştırılabilir bir komut dosyası dosyasına login-notify.sh( /etc/ssh/örneğin, içine koydum ) ihtiyacınız var. E-posta bildiriminin konusunu ve içeriğini değiştirmek için değişkenleri değiştirebilirsiniz. chmod +x login-notify.shÇalıştırılabilir hale getirmek için yürütmeyi unutmayın .

#!/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

Bunu yaptıktan sonra, aşağıdaki satırı aşağıdakilere ekleyebilirsiniz /etc/pam.d/sshd:

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

Test amacıyla, modül olarak dahil edilmiştir optional, böylece yürütme başarısız olursa hala giriş yapabilirsiniz. Eğer bunun işe yaradığını hasıl olduktan sonra değiştirebileceğiniz optionaliçin required. O zaman kanca kodunuzun çalıştırılması başarılı olmazsa (istediğiniz şey buysa) giriş yapmak mümkün olmaz.

PAM'ın ne olduğunu ve nasıl çalıştığını açıklama ihtiyacı duyanlar için, işte burası çok iyi .


1
/etc/ssh/login-notify.sh failed: exit code 13
Yazıyor

3
Teşekkürler, harika çalışıyor. Sadece sshd_config içinde UsePAMayarlanmış olduğundan emin olun yes.
Nicolas BADIA

2
Sadece kendime veya Selinux'ta yeni olan diğer insanlara bir not. Pam_exec betiği çalıştırdığında izin hatası alıyorum. Daha sonra yanlış Selinux için etiketli olduğunu öğrendim. Komut dosyasını / bin / 'e klonladım ve otomatik olarak etiketlenecek unconfined_u:object_r:bin_t:s0. Sonra ben chmod +x /bin/login-notify.shve o çalışır.
RedGiant

3
/etc/pam.d/login <- tty oturum açmak için
Fernando André

2
@ 4wk_ İpucu için teşekkürler. Bunu İnternet Arşivi'ne bağladım, bu yüzden şimdi tekrar çalışması gerekiyor.
Fritz

9

Linux kutularımızdaki süreçleri izlemek için monit kullanıyoruz . monit , ssh üzerinden başarılı girişlerde bulunan e-postalarla da alarm verebilir. Bizim monit config bu gibi görünüyor

 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

Not: Posta sunucusu yapılandırması, e-posta formatı vb. monitrcDosyada ayarlanmalıdır.

Güncelleme: Bu konuda daha ayrıntılı bir blog yazısı yazdı


7

Aşağıdakileri yazın /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

Betik nasıl çalışır?

/etc/profileHer oturum açışında yürütülür (bash shell kullanıcıları için). İf ifadesi yalnızca kullanıcı ssh aracılığıyla giriş yaptıysa, sonuçta girintili kod bloğunun çalışmasına neden olacaksa true değerini döndürür.

Sonra, mesajın metnini oluştururuz:

  • $(date)datekomutun çıktısı ile değiştirilecektir
  • ${USER} kullanıcının giriş adıyla değiştirilecektir
  • $(hostname -f) Giriş yapılan sistemin tam ana bilgisayar adıyla değiştirilecektir

İkinci TEXTsatır, bu kullanıcının giriş yaptığı sistemin IP adresini vererek birinciye eklenir. Son olarak, oluşturulan metin adresinize bir e-posta ile gönderilir.

Özet Linux, varsayılan olarak, sistem günlüğü dosyalarında ssh ile olsun olmasın, her sistem girişini kaydedecektir, ancak bazen - özellikle ssh ile nadiren erişilen bir sistem için - hızlı ve kirli bir bildirim yararlı olabilir.


2

Bu diğer soruda muhtemelen aradığın şeye sahipsin. Temel olarak , bir kullanıcı ssh: /etc/pam.d/sshd ile oturum açtığında çalıştırılan komut dosyasındaki mail komutuna çağrı ekleyebilirsiniz.


2

Bu konudaki mükemmel cevapların bir kısmını aldım ve kopyalanabilir ve yapıştırılabilir bir şey yaptım. Mailgun, e-postaları göndermek için kullanır, böylece STMP kurulumuyla ilgili tüm sorunlarınızdan kurtulursunuz. Bir Mailgun API anahtarına ve gönderen bir etki alanına ihtiyacınız var.

SSH girişinin ardından, komut dosyası giriş bilgilerini (kullanıcı, ana bilgisayar adı, IP adresi ve tüm geçerli ortam değişkenleri) bir e-posta adresine gönderir. messageDeğişkeni özelleştirerek göndermek istediğiniz diğer parametreleri eklemek kolaydır .

#!/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

Bu bence en iyi cevap. Bu basittir ve makineden bir e-posta gönderilmesini gerektirmez; bu, düzgün bir şekilde yapılandırılmadığı sürece, kesinlikle spam klasörüne girer.
JayD3e,

2

@Fritz cevabının mailgun uyarlaması

Pacharanero yazdıktan sonra, mailgun hakkında da yazılar yazdığını fark ettim, ancak kazı ile ne yaptıklarını anlamıyorum, ben de çözümümü göndereceğim.

SMTP'si olmayan bir VM'deyseniz, mailgun, sendgrid veya benzeri bir şey kullanmanız gerekebilir. Bu benim için Google Cloud’da çalıştı.

Bu yaklaşımın bir riski, bir saldırganın sudo sukomut dosyasını bulabilmesi ve bulması veya okunabilir e-posta göndermek için komut dosyasından çıkması durumunda giden e-posta gönderme kimlik bilgilerinizi alabilmesidir . mailgun kurmanız gereken bir ip beyaz listesi var, ancak bu özel kullanım durumu için açık bir şekilde kusurlu.

Bu komut dosyası mydomain.com, asıl etki alanınızı değiştirdikten sonra mailgun ile çalışmalıdır . Senaryoyu /root/login-alert.shya da daha karanlık bir yere kaydedebilirsiniz .

#!/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

Bundan sonra /etc/pam.d/sshdeklemek için değiştirmek için @Fritz cevabını takip edebilirsiniz :

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

Bunun, gelen kullanıcılar ( chmod 700 /root/login-alert.sh) için okuma izni olmadan çalıştığını ve bu nedenle gelen kullanıcıların komut dosyasına okuma erişiminin olması gerekmediğini unutmayın.


1

Bu komut dosyası /etc/ssh/sshrcbir e-posta gönderir ve sistem günlüğüne bir günlük ekler. Kişisel alt ağınız ve dünya çapındaki ağ (ihtiyaç duyduğunuz sudo apt-get install mailutils) arasında bir fark yaratılır (böylece isterseniz devre dışı bırakabilirsiniz ).

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

Ben kullanıyorum swatchdog gelen renk örneği ifadeyi "içeren herhangi hatları için izlemek için pakette başarısız içinde" (harf duyarsız) /var/log/auth.log . Basit bir systemd servisi olarak çalıştırmak için ayarladım.

apt install swatch

Bir yapılandırma dosyası /etc/swatch/swatch-auth-log.conf sahibi root ile izin 644 oluşturun -

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

"/ İ / başarısız" , "i" bu duyarsız olduğu belirtilerek, bir düzenli ifade olduğunu. ( Sendmail , her şeyi mailgun aracılığıyla sabit bir adrese gönderen bir betiktir , bu nedenle adres gerçekten önemli değildir).

Bir systemd servis dosyası /etc/systemd/system/swatch-auth-log.service sahibi root, izin 644 ile oluşturun -

[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

Ardından hizmetin durumunu etkinleştirin, başlatın ve görüntüleyin -

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

Başarılı bir durum raporu örneği -

 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

Servis açılışta otomatik olarak başlatılacak ve systemd tarafından izlenecektir .


Tartışma

Başlangıçta yukarıdakilere benzer bir pam çözümü kullandım , ancak /etc/pam.d/common-auth içinde sshd değil . Bu, ssh, sudo ve girişleri yakalamaktı. Ancak bir güncellemeden sonra kurtarma modundaki şifreleri değiştirdikten sonra bile bütün şifrelerim çalışmayı kesti. Sonunda /etc/pam.d/common-auth orjinaline döndüm ve şifreler tekrar çalıştı. İşte Stack Exchange UNIX ve Linux panosunda bir açıklama

Güvenlik ayarlarını anlamakta zorlanmanın daha güvenli olacağına karar verdim. Ve her şey zaten günlük dosyalarında.


0

Aslında sadece @SirCharlo cevabını değiştirdim

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>" &

Bu işlem 14.04, 16.04 ve Centos 6.5.x sunucularında çalışır, kurulumunu yaptığımdan eminim, mta'nın yapılandırıldığından emin olmanız gerekir, ancak bir kez yapıldığında, bu bir çekicilik sağlar. Bir sonraki adım twilio uyarıları

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.