ใครบ้างมีสคริปต์ทุบตีที่จะส่งอีเมลหรือแจ้งให้ใครบางคนในกรณีของการเข้าสู่ระบบที่ประสบความสำเร็จไปยังเซิร์ฟเวอร์ ssh หรือไม่? ฉันต้องการรับการแจ้งเตือนหากมีใครลงชื่อเข้าใช้ในกล่องส่วนตัวของฉัน
ฉันใช้ Ubuntu 12.04 กำลังเรียกใช้ xfce
ใครบ้างมีสคริปต์ทุบตีที่จะส่งอีเมลหรือแจ้งให้ใครบางคนในกรณีของการเข้าสู่ระบบที่ประสบความสำเร็จไปยังเซิร์ฟเวอร์ ssh หรือไม่? ฉันต้องการรับการแจ้งเตือนหากมีใครลงชื่อเข้าใช้ในกล่องส่วนตัวของฉัน
ฉันใช้ Ubuntu 12.04 กำลังเรียกใช้ xfce
คำตอบ:
คำเตือน:ตามความคิดเห็นสิ่งนี้จะไม่ทำงานหากผู้ใช้สร้างไฟล์ชื่อ
~/.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
วิธีนี้ใช้ได้กับทุกระบบ
คำเตือน:เช่นเคยเมื่อคุณเปลี่ยนการกำหนดค่าการเข้าสู่ระบบให้เปิดเซสชันการสำรองข้อมูลไว้ในพื้นหลังและทดสอบการเข้าสู่ระบบจากเทอร์มินัลใหม่
เนื่องจาก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 เป็นและวิธีการทำงานที่นี่เป็นหนึ่งที่ดีมาก
/etc/ssh/login-notify.sh failed: exit code 13
ทันทีหลังจากเข้าสู่ระบบ :(
UsePAM
ตั้งค่าyes
ใน sshd_config ของคุณ
unconfined_u:object_r:bin_t:s0
ซึ่งจะมีการกำกับโดยอัตโนมัติขณะที่ จากนั้นฉัน chmod +x /bin/login-notify.sh
และมันใช้งานได้
เราใช้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
ไฟล์
ปรับปรุง: เขียนโพสต์บล็อกรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้
ใส่ต่อไปนี้ใน/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 - การแจ้งเตือนที่รวดเร็วและสกปรกจะมีประโยชน์
ในคำถามอื่นคุณอาจมีสิ่งที่คุณกำลังมองหา โดยทั่วไปคุณสามารถเพิ่มการเรียกไปยังคำสั่ง mailในสคริปต์ที่รันเมื่อผู้ใช้ล็อกอินผ่าน ssh: /etc/pam.d/sshd
ฉันได้รับคำตอบที่ดีเยี่ยมจากชุดข้อความนี้และทำบางสิ่งที่สามารถคัดลอกและวางได้มากกว่าหรือน้อยกว่า มันใช้ 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
หลังจากโพสต์ฉันสังเกตว่า @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
) ดังนั้นผู้ใช้ที่เดินทางมาถึงจึงไม่จำเป็นต้องเข้าถึงการอ่านสคริปต์
สคริปต์นี้/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 ฉันตั้งค่าให้เรียกใช้เป็นบริการ 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
ฉันตัดสินใจว่าจะปลอดภัยกว่าถ้าจะไม่แตะต้องยากที่จะเข้าใจการตั้งค่าความปลอดภัย และทุกอย่างอยู่ในล็อกไฟล์ต่อไป
ฉันเพิ่งแก้ไข @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
ssh -N
กับการส่งต่อพอร์ตเท่านั้น