ฉันจะตั้งค่าการแจ้งเตือนทางอีเมลได้อย่างไรเมื่อการเข้าสู่ระบบ ssh สำเร็จ


56

ใครบ้างมีสคริปต์ทุบตีที่จะส่งอีเมลหรือแจ้งให้ใครบางคนในกรณีของการเข้าสู่ระบบที่ประสบความสำเร็จไปยังเซิร์ฟเวอร์ 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


ใช้งานได้หรือไม่หากลูกค้าไม่ได้ร้องขอ TTY? เช่นssh -Nกับการส่งต่อพอร์ตเท่านั้น
gertvdijk

สิ่งนี้ยังใช้งานได้เมื่อเราใช้ gmail เป็นเซิร์ฟเวอร์ smtp?
user155073

สิ่งนี้จำเป็นต้องมีคำเตือน : สิ่งนี้จะไม่ทำงานหากผู้ใช้สร้างไฟล์ที่เรียกว่า~/.ssh/rcดังนั้นจึงค่อนข้างไร้ประโยชน์ในการวัดความปลอดภัย @adosaiguas 'คำตอบที่เกี่ยวข้องpam_execเป็นสิ่งที่ถูกต้อง
ฟริตซ์

2
@mchid: หากคุณพิจารณาคำถาม"ฉันต้องการรับการแจ้งเตือนหากมีใครลงชื่อเข้าใช้ในกล่องส่วนตัวของฉัน" จากนั้นอาจเป็นที่ยอมรับ หากคุณมีบัญชีผู้ใช้เดียวเท่านั้น มิฉะนั้นคุณต้องทำสำหรับทุกบัญชีรวมถึงทุกบัญชีที่เพิ่มใหม่ และในอุดมคติคุณต้องแน่ใจว่าผู้ใช้ไม่สามารถแก้ไขหรือลบ~/.ssh/rcไฟล์ได้ การใช้วิธีการทั้งระบบที่อิงกับpamมันน่าเชื่อถือและปลอดภัยกว่าเพราะrootสามารถยุ่งกับมันได้ ดังนั้นคำตอบคือ: sshrdวิธีการใช้งานได้ดีสำหรับระบบผู้ใช้คนเดียว แต่pamวิธีนี้ใช้ได้กับทุกระบบ
ฟริตซ์

70

คำเตือน:เช่นเคยเมื่อคุณเปลี่ยนการกำหนดค่าการเข้าสู่ระบบให้เปิดเซสชันการสำรองข้อมูลไว้ในพื้นหลังและทดสอบการเข้าสู่ระบบจากเทอร์มินัลใหม่

เนื่องจาก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จากนั้นเข้าสู่ระบบจะไม่สามารถดำเนินการได้เว้นแต่ว่าการดำเนินการของสคริปต์เบ็ดจะประสบความสำเร็จ (ถ้านั่นคือสิ่งที่คุณต้องการ)

สำหรับบรรดาของคุณในความต้องการของคำอธิบายของสิ่ง PAM เป็นและวิธีการทำงานที่นี่เป็นหนึ่งที่ดีมาก


1
มันบอกว่า: /etc/ssh/login-notify.sh failed: exit code 13ทันทีหลังจากเข้าสู่ระบบ :(
FelikZ

3
ขอบคุณมันใช้งานได้ดี เพียงให้แน่ใจว่าคุณได้UsePAMตั้งค่าyesใน sshd_config ของคุณ
Nicolas BADIA

2
เพียงทราบถึงตัวเองหรือคนอื่น ๆ ที่ยังใหม่กับ Selinux ฉันได้รับข้อผิดพลาดการอนุญาตเมื่อ pam_exec เรียกใช้สคริปต์ ต่อมาฉันก็พบว่ามันถูกระบุว่าไม่ถูกต้องสำหรับ Selinux ผมโคลนสคริปต์เพื่อ / bin / unconfined_u:object_r:bin_t:s0ซึ่งจะมีการกำกับโดยอัตโนมัติขณะที่ จากนั้นฉัน chmod +x /bin/login-notify.shและมันใช้งานได้
RedGiant

3
/etc/pam.d/login <- สำหรับการเข้าสู่ระบบ tty
Fernando André

2
@ 4wk_ ขอบคุณสำหรับคำใบ้ ฉันแทนที่มันด้วยลิงก์ไปยัง Internet Archive ดังนั้นจึงควรใช้งานได้อีกในขณะนี้
Fritz

9

เราใช้monitเพื่อตรวจสอบกระบวนการในกล่อง linux ของเรา monitยังสามารถแจ้งเตือนทางอีเมลเกี่ยวกับการเข้าสู่ระบบที่ประสบความสำเร็จมากกว่า ssh การปรับแต่งmonitของเรามีลักษณะเช่นนี้

 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

หมายเหตุ: การกำหนดค่า mailserver, รูปแบบอีเมล ฯลฯ ควรตั้งค่าใน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 shell) คำสั่ง if จะส่งคืนจริงเมื่อผู้ใช้เข้าสู่ระบบผ่าน ssh เท่านั้นซึ่งจะทำให้การบล็อกรหัสที่เยื้องเข้าไป

ต่อไปเราจะสร้างเนื้อความของข้อความ:

  • $(date)จะถูกแทนที่ด้วยผลลัพธ์ของdateคำสั่ง
  • ${USER} จะถูกแทนที่ด้วยชื่อเข้าสู่ระบบของผู้ใช้
  • $(hostname -f) จะถูกแทนที่ด้วยชื่อโฮสต์แบบเต็มของระบบที่ล็อกอิน

TEXTบรรทัดที่สองเพิ่มเป็นบรรทัดแรกโดยให้ที่อยู่ IP ของระบบที่ผู้ใช้รายนี้ลงชื่อเข้าใช้ ในที่สุดข้อความที่สร้างขึ้นจะถูกส่งในอีเมลไปยังที่อยู่ของคุณ

สรุปโดยปกติแล้ว Linux จะบันทึกทุกการเข้าสู่ระบบไม่ว่าจะโดย ssh หรือไม่ก็ตามในไฟล์บันทึกของระบบ แต่บางครั้ง - โดยเฉพาะอย่างยิ่งสำหรับระบบที่ไม่ค่อยเข้าถึงผ่าน ssh - การแจ้งเตือนที่รวดเร็วและสกปรกจะมีประโยชน์


2

ในคำถามอื่นคุณอาจมีสิ่งที่คุณกำลังมองหา โดยทั่วไปคุณสามารถเพิ่มการเรียกไปยังคำสั่ง mailในสคริปต์ที่รันเมื่อผู้ใช้ล็อกอินผ่าน ssh: /etc/pam.d/sshd


2

ฉันได้รับคำตอบที่ดีเยี่ยมจากชุดข้อความนี้และทำบางสิ่งที่สามารถคัดลอกและวางได้มากกว่าหรือน้อยกว่า มันใช้ Mailgun ในการส่งอีเมลเพื่อให้คุณได้รับปัญหาเกี่ยวกับการตั้งค่า STMP คุณต้องใช้คีย์ Mailgun API และโดเมนที่ส่ง

เมื่อเข้าสู่ระบบ SSH สคริปต์จะส่งรายละเอียดของการเข้าสู่ระบบ (ผู้ใช้ชื่อโฮสต์ที่อยู่ IP และตัวแปรสภาพแวดล้อมปัจจุบันทั้งหมด) ไปยังที่อยู่อีเมล การเพิ่มพารามิเตอร์อื่น ๆ ที่คุณต้องการส่งทำได้ง่าย ๆ โดยการปรับแต่ง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

การปรับ Mailgun ของคำตอบ @ Fritz

หลังจากโพสต์ฉันสังเกตว่า @pacharanero เขียนเกี่ยวกับ mailgun ด้วยเช่นกัน แต่ฉันไม่เข้าใจว่าพวกเขากำลังทำอะไรกับขุดดังนั้นฉันจะโพสต์โซลูชันของฉันด้วย

หากคุณอยู่บน VM ที่ไม่มี SMTP คุณอาจต้องใช้บางสิ่งบางอย่างเช่นปืนลูกซอง sendgrid หรือสิ่งที่คล้ายกัน สิ่งนี้ใช้ได้กับฉันใน Google Cloud

ความเสี่ยงอย่างหนึ่งของวิธีการนี้คือผู้โจมตีอาจได้รับอีเมลส่งข้อมูลรับรองของคุณหากพวกเขาสามารถsudo suและค้นหาสคริปต์หรือคุณออกจากสคริปต์เพื่อส่งอีเมลที่อ่านได้ mailgun มีรายชื่อ IP ที่คุณควรตั้งค่า แต่นั่นไม่สมบูรณ์สำหรับกรณีการใช้งานนี้โดยเฉพาะ

สคริปต์นี้ควรทำงานกับ 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

หลังจากนั้นคุณสามารถทำตาม @Fritz คำตอบเพื่อเปลี่ยน/etc/pam.d/sshdเป็น:

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 ฉันตั้งค่าให้เรียกใช้เป็นบริการ systemd อย่างง่าย

apt install swatch

สร้างไฟล์กำหนดค่า/etc/swatch/swatch-auth-log.confด้วย root เจ้าของสิทธิ์ 644 -

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

"/ ล้มเหลว / i"เป็น regexp กับ "i" แสดงให้เห็นว่ามันเป็นกรณีตาย ( sendmailของฉันคือสคริปต์ที่ส่งทุกอย่างไปยังที่อยู่คงที่ผ่านทางmailgunดังนั้นที่อยู่จึงไม่สำคัญ)

สร้างไฟล์เซอร์วิสsystemd /etc/systemd/system/swatch-auth-log.serviceด้วย root เจ้าของสิทธิ์ 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

บริการนี้จะเริ่มต้นโดยอัตโนมัติที่บูตและตรวจสอบโดยsystemd


อภิปรายผล

เดิมผมใช้แพมแก้ปัญหาคล้ายกับข้างต้น แต่ใน/etc/pam.d/common-authไม่sshd นั่นคือการจับ ssh, sudo และการเข้าสู่ระบบ แต่หลังจากอัปเดตรหัสผ่านทั้งหมดของฉันหยุดทำงานแม้หลังจากเปลี่ยนรหัสผ่านในโหมดช่วยเหลือ ในที่สุดฉันเปลี่ยน/etc/pam.d/common-authกลับไปเป็นต้นฉบับและรหัสผ่านทำงานอีกครั้ง นี่คือคำอธิบายเกี่ยวกับบอร์ด Exchange Exchange UNIX & Linux

ฉันตัดสินใจว่าจะปลอดภัยกว่าถ้าจะไม่แตะต้องยากที่จะเข้าใจการตั้งค่าความปลอดภัย และทุกอย่างอยู่ในล็อกไฟล์ต่อไป


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 ฉันค่อนข้างมั่นใจว่าคุณต้องมั่นใจว่า mta ได้รับการกำหนดค่า แต่เมื่อทำเสร็จแล้วจะทำงานได้ดี ขั้นตอนถัดไปแจ้งเตือน twilio

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.