जब एक ssh लॉगिन सफल होता है तो मैं ईमेल अलर्ट कैसे सेट करूँ?


56

क्या किसी के पास एक bash स्क्रिप्ट है जो किसी ssh सर्वर के सफल लॉगिन के मामले में ईमेल या किसी को सूचित करेगा? अगर कोई मेरे निजी बॉक्स में लॉग इन करता है तो मुझे सूचित किया जाना चाहिए।

मैं Ubuntu 12.04 रनिंग xfce का उपयोग कर रहा हूं

जवाबों:


46

चेतावनी: टिप्पणियों के अनुसार, यह काम नहीं करता है यदि उपयोगकर्ता एक फ़ाइल बनाता है जिसे कहा जाता है ~/.ssh/rc। *

/etc/ssh/sshrcनिम्नलिखित सामग्री के साथ संशोधित करें या बनाएं :

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 &

यह आपको ईमेल द्वारा प्रभावी रूप से सूचित करेगा कि कोई भी व्यक्ति SSH के माध्यम से लॉग इन करता है, और लॉगिन syslog में लॉग इन किया जाएगा।

नोट: आपको ईमेल सूचना के काम करने के लिए sendemailपैकेज ( sudo apt-get install sendemail) की आवश्यकता होगी ।

नोट: पोर्ट अग्रेषण के साथ काम करता है, लेकिन -N विकल्प के साथ नहीं।


क्या यह भी काम करता है अगर ग्राहक टीटीवाई का अनुरोध नहीं करता है? जैसे ssh -Nकेवल पोर्ट फॉरवर्डिंग के साथ।
gertvdijk

क्या यह भी काम करता है जब हम smtp सर्वर के रूप में gmail का उपयोग कर रहे हैं?
user155073

इसके लिए चेतावनी की जरूरत है : यह काम नहीं करता है यदि उपयोगकर्ता एक फाइल बनाता है, ~/.ssh/rcतो यह सुरक्षा उपाय के रूप में काफी बेकार है। @adosaiguas का उत्तर pam_execसही है।
फ्रिट्ज़

2
@ एमकिड: यदि आप इस प्रश्न पर विचार करते हैं कि "यदि कोई मेरे व्यक्तिगत बॉक्स में लॉग इन करता है, तो मुझे सूचित किया जाना चाहिए।" , तो यह स्वीकार्य हो सकता है। यदि आपके पास केवल एक उपयोगकर्ता खाता है। अन्यथा आपको इसे हर नए जोड़े गए खाते सहित सभी खातों के लिए करना होगा । और आदर्श रूप से आपने यह सुनिश्चित कर लिया है कि उपयोगकर्ता अपनी ~/.ssh/rcफ़ाइल को संशोधित या हटा नहीं सकते हैं । सिस्टम-आधारित पद्धति का उपयोग करना pamअधिक विश्वसनीय और सुरक्षित है, क्योंकि इससे केवल rootगड़बड़ हो सकती है। तो इसका उत्तर है: sshrdएकल-उपयोगकर्ता प्रणालियों के लिए विधियां ठीक काम करती हैं, लेकिन pamविधि सभी प्रणालियों के लिए मज़बूती से काम करती है।
फ्रिट्ज़

70

चेतावनी: जब आप लॉगिन कॉन्फ़िगरेशन बदलते हैं, तो पृष्ठभूमि में एक बैकअप ssh सत्र खोलें और नए टर्मिनल से लॉगिन का परीक्षण करें।

चूंकि sshrcविधि काम नहीं करती है यदि उपयोगकर्ता के पास अपनी ~/.ssh/rcफ़ाइल है, तो मैं pam_execबताऊंगा कि यह कैसे करना है जैसा कि @adosaiguas ने सुझाव दिया है। अच्छी बात यह है कि इसे आसानी से sshएक अलग फ़ाइल में हुक करके (जैसे स्थानीय लॉगिन या यहां तक ​​कि सभी लॉगिन) के अलावा अन्य लॉगिन प्रकारों के लिए अनुकूलित किया जा सकता है /etc/pam.d/

पहले आपको कमांड लाइन से मेल भेजने में सक्षम होना चाहिए। इस बारे में अन्य प्रश्न हैं। एक मेल सर्वर पर इसे स्थापित करना सबसे आसान है mailx(जो कि संभवतः पहले से ही वैसे भी स्थापित है)।

फिर आपको निम्नलिखित सामग्री के साथ एक निष्पादन योग्य स्क्रिप्ट फ़ाइल की आवश्यकता है login-notify.sh(मैंने इसे /etc/ssh/उदाहरण के लिए रखा है )। आप ई-मेल अधिसूचना के विषय और सामग्री को बदलने के लिए चर बदल सकते हैं। chmod +x login-notify.shयह निष्पादन योग्य बनाने के लिए निष्पादित करने के लिए मत भूलना ।

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

आपके पास एक बार, आप निम्न पंक्ति जोड़ सकते हैं /etc/pam.d/sshd:

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

परीक्षण के उद्देश्यों के लिए, मॉड्यूल को शामिल किया गया है optional, ताकि आप अभी भी लॉग इन कर सकें यदि निष्पादन विफल हो जाता है। के बाद आप यह सुनिश्चित करें कि यह काम करता है बनाया है, आप बदल सकते हैं optionalकरने के लिए required। तब तक लॉगिन संभव नहीं होगा, जब तक कि आपकी हुक स्क्रिप्ट का निष्पादन सफल न हो (यदि आप चाहते हैं तो)।

पीएएम क्या है और यह कैसे काम करता है, इसकी व्याख्या के लिए आप में से उन लोगों के लिए, यहाँ एक बहुत अच्छा है


1
यह कहता है: /etc/ssh/login-notify.sh failed: exit code 13लॉगिन के ठीक बाद :(
फेलिकजेड

3
धन्यवाद, यह बहुत अच्छा काम करता है। बस सुनिश्चित करें कि आपने अपने sshd_config में UsePAMसेट किया yesहै।
निकोलस बाडिया

2
बस खुद को या अन्य लोगों को एक नोट जो सेलिनक्स के लिए नया है। जब pam_exec स्क्रिप्ट चली तो मुझे एक अनुमति त्रुटि मिली। बाद में मुझे पता चला कि इसे गलत तरीके से सेलिनक्स के लिए लेबल किया गया था। मैंने स्क्रिप्ट को / बिन / पर क्लोन किया जो स्वचालित रूप से लेबल किया जाएगा unconfined_u:object_r:bin_t:s0। तब मैं chmod +x /bin/login-notify.shऔर यह काम करता है।
RedGiant

3
/etc/pam.d/login <- tty logins के लिए
फर्नांडो एंड्रे

2
@ 4wk_ संकेत के लिए धन्यवाद। मैंने इसे इंटरनेट आर्काइव के लिंक से बदल दिया, इसलिए इसे अब फिर से काम करना चाहिए।
फ्रिट्ज़

9

हम अपने linux box पर प्रक्रियाओं की निगरानी के लिए monit का उपयोग कर रहे हैं । ssh के सफल लॉगिन पर ईमेल द्वारा मोनिट भी अलर्ट कर सकता है। हमारा मॉनेट कॉन्फिग इस तरह दिखता है

 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

नोट: मेलस्वर कॉन्फ़िगरेशन, ईमेल प्रारूप आदि को monitrcफ़ाइल में सेट किया जाना चाहिए

अपडेट: इस पर एक अधिक विस्तृत ब्लॉग पोस्ट लिखा


7

निम्नलिखित डालें /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हर लॉगिन पर (bash शेल उपयोगकर्ताओं के लिए) निष्पादित किया जाता है। यदि उपयोगकर्ता ssh के माध्यम से लॉग इन किया है, जो बदले में केवल कथन सही होगा, जो बदले में इंडेंट कोड ब्लॉक को चलाने का कारण होगा।

इसके बाद, हम फिर संदेश का पाठ बनाते हैं:

  • $(date)dateकमांड के आउटपुट द्वारा प्रतिस्थापित किया जाएगा
  • ${USER} उपयोगकर्ता के लॉगिन नाम द्वारा प्रतिस्थापित किया जाएगा
  • $(hostname -f) सिस्टम के पूर्ण होस्टनाम द्वारा लॉग इन किया जा रहा है

दूसरी TEXTपंक्ति पहली में जुड़ती है, सिस्टम का आईपी पता देता है जिससे यह उपयोगकर्ता लॉग इन कर रहा है। अंत में, जनरेटेड टेक्स्ट आपके पते पर एक ईमेल में भेजा जाता है।

सारांश लिनक्स, डिफ़ॉल्ट रूप से, हर सिस्टम लॉगिन को रिकॉर्ड करेगा, चाहे ssh द्वारा या सिस्टम लॉग फाइलों में, लेकिन कभी-कभी - विशेष रूप से ssh के माध्यम से शायद ही कभी एक्सेस की जाने वाली प्रणाली के लिए - एक त्वरित और गंदी सूचना उपयोगी हो सकती है।


2

इस अन्य प्रश्न में आपके पास संभवतः वह है जो आप खोज रहे हैं। मूल रूप से आप स्क्रिप्ट में मेल कमांड के लिए एक कॉल जोड़ सकते हैं जब उपयोगकर्ता ssh के माध्यम से लॉग इन करता है: /etc/pam.d/sshd


2

मैंने इस धागे से कुछ उत्कृष्ट उत्तर लिए हैं और कुछ ऐसा बनाया है जो अधिक-या-कम कॉपी-और-पेस्ट करने योग्य है। यह ईमेल भेजने के लिए Mailgun का उपयोग करता है ताकि आप STMP की स्थापना के साथ किसी भी समस्या से बचे रहें। आपको बस एक Mailgun API कुंजी और एक भेजने वाला डोमेन चाहिए।

SSH लॉगिन करने पर, स्क्रिप्ट एक ईमेल पते पर लॉगिन (उपयोगकर्ता, होस्टनाम, आईपी पता और सभी मौजूदा पर्यावरण चर) का विवरण भेज देगी। अन्य मापदंडों को जोड़ना आसान है जिन्हें आप messageचर को अनुकूलित करके भेजना चाहते हैं ।

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

मेरी राय में यह सबसे अच्छा जवाब है। यह सरल है और मशीन से ई-मेल भेजने की आवश्यकता नहीं है, जो निश्चित रूप से ठीक से कॉन्फ़िगर नहीं होने तक स्पैम फ़ोल्डर में निश्चित रूप से समाप्त हो जाएगा।
JayD3e

2

@Fritz उत्तर का मेलगंज अनुकूलन

पोस्ट करने के बाद मैंने देखा @pacharanero mailgun के बारे में भी लिखता है, लेकिन मुझे समझ में नहीं आता है कि वे खुदाई के साथ क्या कर रहे हैं, इसलिए मैं अपना समाधान भी पोस्ट करूंगा।

यदि आप ऐसे VM पर हैं, जिसमें SMTP नहीं है, तो आपको mailgun, sendgrid, या जैसे कुछ का उपयोग करने की आवश्यकता हो सकती है। इसने मेरे लिए Google क्लाउड पर काम किया।

इस दृष्टिकोण का एक जोखिम यह है कि एक हमलावर को आपके आउटगोइंग ईमेल को क्रेडेंशियल्स भेजना पड़ सकता है यदि वे sudo suस्क्रिप्ट को ढूंढ सकते हैं या आप ईमेल पढ़ने योग्य भेजने के लिए स्क्रिप्ट छोड़ सकते हैं। mailgun में एक आईपी वाइटेलिस्ट है जिसे आपको सेट करना चाहिए, लेकिन यह विशेष रूप से उपयोग के मामले में अपूर्ण है, जाहिर है।

mydomain.comआपके वास्तविक डोमेन में परिवर्तन के बाद इस स्क्रिप्ट को मेलगुन के साथ काम करना चाहिए । आप स्क्रिप्ट को /root/login-alert.shया कुछ और अस्पष्ट स्थान पर सहेज सकते हैं ।

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

उसके बाद आप /etc/pam.d/sshdशामिल करने के लिए बदलने के लिए @Fritz जवाब का पालन कर सकते हैं:

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

मैं इस बात पर ध्यान देता हूं कि आने वाले उपयोगकर्ताओं के लिए कोई रीड परमिशन नहीं है ( chmod 700 /root/login-alert.sh) इसलिए आने वाले यूजर्स को स्क्रिप्ट पढ़ने की जरूरत नहीं है।


1

यह स्क्रिप्ट /etc/ssh/sshrcईमेल भेजता है और सिस्टम लॉगर में लॉग जोड़ता है। एक अंतर किया जाता है (इसलिए यदि आप चाहें तो इसे निष्क्रिय कर सकते हैं) अपने व्यक्तिगत सबनेट और वर्ल्ड वाइड वेब (आवश्यकताएं 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

मैं उपयोग कर रहा हूँ swatchdog से नमूना पैकेज किसी भी वाक्यांश "युक्त लाइनों के लिए नजर रखने के लिए असफल " (केस असंवेदी) में /var/log/auth.log । मैंने इसे एक सिंपल सिस्टमड सर्विस के रूप में चलाने के लिए स्थापित किया है।

apt install swatch

स्वामी रूट के साथ एक कॉन्फ़िगर फ़ाइल /etc/swatch/swatch-auth-log.conf बनाएं , अनुमति 644 -

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

"/ असफल / मैं" , एक regexp कि "मैं" इससे स्पष्ट है कि यह मामला असंवेदनशील है के साथ। (मेरा सेंडमेल एक स्क्रिप्ट है जो मेलगुन के माध्यम से एक निश्चित पते पर सब कुछ भेजती है , इसलिए पता वास्तव में मायने नहीं रखता है)।

मालिक रूट के साथ एक systemd सेवा फ़ाइल /etc/systemd/system/swatch-auth-log.service बनाएँ , अनुमति 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

फिर सेवा की स्थिति देखें, शुरू करें और देखें -

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

एक सफल स्थिति रिपोर्ट का एक उदाहरण -

 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

सेवा स्वतः बूट पर शुरू हो जाएगी और सिस्टमड द्वारा निगरानी की जाएगी ।


विचार-विमर्श

मूल रूप से मैंने उपरोक्त के समान एक पैम समाधान का उपयोग किया था , लेकिन /etc/pam.d/common-auth में sshd नहीं । यह ssh, sudo और logins को पकड़ना था। लेकिन फिर एक अपडेट के बाद मेरे सभी पासवर्ड ने बचाव मोड में पासवर्ड बदलने के बाद भी काम करना बंद कर दिया। अंततः मैंने /etc/pam.d/common-auth को मूल में बदल दिया और पासवर्ड फिर से काम किया। यहाँ स्टैक एक्सचेंज यूनिक्स और लिनक्स बोर्ड पर एक विवरण है

मैंने तय किया कि सुरक्षा सेटिंग्स को समझने के लिए मुश्किल को छूना सुरक्षित नहीं होगा। और सब कुछ वैसे भी लॉग फ़ाइलों में है।


0

मैंने वास्तव में @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>" &

यह 14.04, 16.04 और Centos 6.5.x सर्वर पर काम करता है जो मैंने सेटअप किया है, मुझे पूरा यकीन है कि आपको यह सुनिश्चित करने की आवश्यकता है कि मांटा कॉन्फ़िगर किया गया है, लेकिन एक बार जो किया जाता है, यह एक आकर्षण का काम करता है। अगला चरण टवीलियो अलर्ट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.