जवाबों:
चेतावनी: टिप्पणियों के अनुसार, यह काम नहीं करता है यदि उपयोगकर्ता एक फ़ाइल बनाता है जिसे कहा जाता है
~/.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/rc
तो यह सुरक्षा उपाय के रूप में काफी बेकार है। @adosaiguas का उत्तर pam_exec
सही है।
~/.ssh/rc
फ़ाइल को संशोधित या हटा नहीं सकते हैं । सिस्टम-आधारित पद्धति का उपयोग करना pam
अधिक विश्वसनीय और सुरक्षित है, क्योंकि इससे केवल root
गड़बड़ हो सकती है। तो इसका उत्तर है: sshrd
एकल-उपयोगकर्ता प्रणालियों के लिए विधियां ठीक काम करती हैं, लेकिन pam
विधि सभी प्रणालियों के लिए मज़बूती से काम करती है।
चेतावनी: जब आप लॉगिन कॉन्फ़िगरेशन बदलते हैं, तो पृष्ठभूमि में एक बैकअप 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
। तब तक लॉगिन संभव नहीं होगा, जब तक कि आपकी हुक स्क्रिप्ट का निष्पादन सफल न हो (यदि आप चाहते हैं तो)।
पीएएम क्या है और यह कैसे काम करता है, इसकी व्याख्या के लिए आप में से उन लोगों के लिए, यहाँ एक बहुत अच्छा है ।
/etc/ssh/login-notify.sh failed: exit code 13
लॉगिन के ठीक बाद :(
UsePAM
सेट किया yes
है।
unconfined_u:object_r:bin_t:s0
। तब मैं chmod +x /bin/login-notify.sh
और यह काम करता है।
हम अपने 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
फ़ाइल में सेट किया जाना चाहिए
अपडेट: इस पर एक अधिक विस्तृत ब्लॉग पोस्ट लिखा
निम्नलिखित डालें /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 के माध्यम से शायद ही कभी एक्सेस की जाने वाली प्रणाली के लिए - एक त्वरित और गंदी सूचना उपयोगी हो सकती है।
इस अन्य प्रश्न में आपके पास संभवतः वह है जो आप खोज रहे हैं। मूल रूप से आप स्क्रिप्ट में मेल कमांड के लिए एक कॉल जोड़ सकते हैं जब उपयोगकर्ता ssh के माध्यम से लॉग इन करता है: /etc/pam.d/sshd
मैंने इस धागे से कुछ उत्कृष्ट उत्तर लिए हैं और कुछ ऐसा बनाया है जो अधिक-या-कम कॉपी-और-पेस्ट करने योग्य है। यह ईमेल भेजने के लिए 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
पोस्ट करने के बाद मैंने देखा @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
) इसलिए आने वाले यूजर्स को स्क्रिप्ट पढ़ने की जरूरत नहीं है।
यह स्क्रिप्ट /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
मैं उपयोग कर रहा हूँ 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 को मूल में बदल दिया और पासवर्ड फिर से काम किया। यहाँ स्टैक एक्सचेंज यूनिक्स और लिनक्स बोर्ड पर एक विवरण है
मैंने तय किया कि सुरक्षा सेटिंग्स को समझने के लिए मुश्किल को छूना सुरक्षित नहीं होगा। और सब कुछ वैसे भी लॉग फ़ाइलों में है।
मैंने वास्तव में @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 सर्वर पर काम करता है जो मैंने सेटअप किया है, मुझे पूरा यकीन है कि आपको यह सुनिश्चित करने की आवश्यकता है कि मांटा कॉन्फ़िगर किया गया है, लेकिन एक बार जो किया जाता है, यह एक आकर्षण का काम करता है। अगला चरण टवीलियो अलर्ट
ssh -N
केवल पोर्ट फॉरवर्डिंग के साथ।