Làm cách nào để thiết lập cảnh báo email khi đăng nhập ssh thành công?


56

Có ai có một tập lệnh bash sẽ gửi email hoặc thông báo cho ai đó trong trường hợp đăng nhập thành công vào máy chủ ssh không? Tôi muốn được thông báo nếu có ai đăng nhập vào hộp cá nhân của tôi.

Tôi đang sử dụng Ubuntu 12.04 đang chạy xfce

Câu trả lời:


46

Cảnh báo: theo các nhận xét, điều này không hoạt động nếu người dùng tạo một tệp có tên ~/.ssh/rc. *

Sửa đổi hoặc tạo /etc/ssh/sshrcvới các nội dung sau:

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 &

Điều này sẽ thông báo hiệu quả cho bạn qua email bất cứ khi nào ai đó đăng nhập thông qua SSH và thông tin đăng nhập sẽ được đăng nhập vào syslog.

Lưu ý: Bạn sẽ cần sendemailgói ( sudo apt-get install sendemail) để thông báo email hoạt động.

Lưu ý: hoạt động với chuyển tiếp cổng, nhưng với tùy chọn -N thì không.


Điều này cũng hoạt động nếu khách hàng không yêu cầu TTY? Ví dụ: ssh -Nchỉ với cổng chuyển tiếp.
gertvdijk

điều này cũng hoạt động khi chúng ta đang sử dụng gmail làm máy chủ smtp?
dùng155073

Điều này cần một Cảnh báo : Điều này không hoạt động nếu người dùng tạo một tệp được gọi ~/.ssh/rcvì vậy nó hoàn toàn vô dụng như một biện pháp bảo mật. Câu trả lời của @adosaiguas là câu trả lời pam_execđúng.
Fritz

2
@mchid: Nếu bạn xem xét câu hỏi "Tôi muốn được thông báo nếu có ai đăng nhập vào hộp cá nhân của tôi." , sau đó điều này có thể được chấp nhận. Nếu bạn chỉ có một tài khoản người dùng. Nếu không, bạn phải làm điều đó cho tất cả các tài khoản, bao gồm mọi tài khoản mới được thêm vào. Và lý tưởng nhất là bạn đã đảm bảo rằng người dùng không thể sửa đổi hoặc xóa ~/.ssh/rctệp của họ . Sử dụng một phương pháp toàn hệ thống dựa trên pamchỉ đáng tin cậy và an toàn hơn, bởi vì chỉ rootcó thể gây rối với nó. Vì vậy, câu trả lời là: Các sshrdphương thức hoạt động ổn đối với các hệ thống người dùng đơn, nhưng pamphương thức này hoạt động đáng tin cậy cho tất cả các hệ thống.
Fritz

70

Cảnh báo: Như mọi khi bạn thay đổi cấu hình đăng nhập, hãy để phiên ssh dự phòng mở trong nền và kiểm tra đăng nhập từ thiết bị đầu cuối mới.

sshrcphương thức này không hoạt động nếu người dùng có ~/.ssh/rctệp riêng của họ , tôi sẽ giải thích cách thực hiện điều này với pam_execnhư @adosaiguas đề xuất. Điều tốt là điều này cũng có thể dễ dàng thích nghi với các loại đăng nhập khác ssh(chẳng hạn như thông tin đăng nhập cục bộ hoặc thậm chí tất cả thông tin đăng nhập) bằng cách nối vào một tệp khác /etc/pam.d/.

Đầu tiên bạn cần có thể gửi thư từ dòng lệnh. Có những câu hỏi khác về điều này. Trên máy chủ thư có thể dễ cài đặt nhất mailx(dù sao có lẽ đã được cài đặt).

Sau đó, bạn cần một tệp kịch bản thực thi login-notify.sh( /etc/ssh/ví dụ tôi đặt nó ) với nội dung sau. Bạn có thể thay đổi các biến để thay đổi chủ đề và nội dung của thông báo email. Đừng quên thực hiện chmod +x login-notify.shđể làm cho nó thực thi.

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

Khi bạn đã có, bạn có thể thêm dòng sau vào /etc/pam.d/sshd:

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

Đối với mục đích thử nghiệm, mô-đun được bao gồm dưới dạng optional, để bạn vẫn có thể đăng nhập nếu thực hiện không thành công. Sau khi bạn chắc chắn rằng nó hoạt động, bạn có thể thay đổi optionalthành required. Sau đó, đăng nhập sẽ không thể thực hiện được trừ khi việc thực thi tập lệnh hook của bạn thành công (nếu đó là điều bạn muốn).

Đối với những người bạn cần giải thích về PAM là gì và cách thức hoạt động, đây là một cách rất tốt .


1
Nó nói: /etc/ssh/login-notify.sh failed: exit code 13ngay sau khi đăng nhập :(
FelikZ

3
Cảm ơn, nó hoạt động tuyệt vời. Chỉ cần đảm bảo rằng bạn đã UsePAMđặt thành yessshd_config.
Nicolas BADIA

2
Chỉ cần một lưu ý cho bản thân tôi hoặc những người khác mới biết về Selinux. Tôi gặp lỗi về quyền khi pam_exec chạy tập lệnh. Sau đó tôi phát hiện ra rằng nó được dán nhãn không chính xác cho Selinux. Tôi đã nhân bản tập lệnh thành / bin / sẽ tự động được gắn nhãn là unconfined_u:object_r:bin_t:s0. Sau đó tôi chmod +x /bin/login-notify.shvà nó hoạt động.
RedGiant

3
/etc/pam.d/login <- cho đăng nhập tty
Fernando André

2
@ 4wk_ Cảm ơn bạn đã gợi ý. Tôi đã thay thế nó bằng một liên kết đến Lưu trữ Internet, vì vậy nó sẽ hoạt động trở lại ngay bây giờ.
Fritz

9

Chúng tôi đã sử dụng monit để theo dõi các quá trình trên các hộp linux của chúng tôi. monit cũng có thể cảnh báo bằng email về thông tin đăng nhập thành công qua ssh. Cấu hình monit của chúng tôi trông như thế này

 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

Lưu ý: Cấu hình mailserver, định dạng email, v.v. nên được đặt trong monitrctệp

Cập nhật: Đã viết một bài đăng blog chi tiết hơn về điều này


7

Đặt những thứ sau vào /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

Kịch bản hoạt động như thế nào

/etc/profileđược thực thi tại mỗi lần đăng nhập (đối với người dùng bash shell). Câu lệnh if sẽ chỉ trả về true nếu người dùng đã đăng nhập thông qua ssh, điều này sẽ khiến khối mã thụt vào được chạy.

Tiếp theo, chúng tôi sau đó xây dựng văn bản của tin nhắn:

  • $(date)sẽ được thay thế bằng đầu ra của datelệnh
  • ${USER} sẽ được thay thế bằng tên đăng nhập của người dùng
  • $(hostname -f) sẽ được thay thế bằng tên máy chủ đầy đủ của hệ thống được đăng nhập vào

Dòng thứ hai TEXTthêm vào dòng đầu tiên, cung cấp địa chỉ IP của hệ thống mà người dùng này đang đăng nhập. Cuối cùng, văn bản được tạo sẽ được gửi trong một email đến địa chỉ của bạn.

Tóm tắt Linux, theo mặc định, sẽ ghi lại mọi lần đăng nhập hệ thống, cho dù bằng ssh hay không, trong các tệp nhật ký hệ thống, nhưng đôi khi - đặc biệt đối với một hệ thống hiếm khi được truy cập qua ssh - một thông báo nhanh và bẩn có thể hữu ích.


2

Trong câu hỏi khác này, bạn có thể có những gì bạn đang tìm kiếm. Về cơ bản, bạn có thể thêm một cuộc gọi vào lệnh mail trong tập lệnh được chạy khi người dùng đăng nhập thông qua ssh: /etc/pam.d/sshd


2

Tôi đã lấy một số câu trả lời xuất sắc từ chủ đề này và đưa ra một cái gì đó ít nhiều sao chép và dán. Nó sử dụng Mailgun để gửi email để bạn không gặp phải bất kỳ vấn đề nào khi thiết lập STMP. Bạn chỉ cần một khóa API Mailgun và một miền gửi.

Khi đăng nhập SSH, tập lệnh sẽ gửi chi tiết về thông tin đăng nhập (tên người dùng, tên máy chủ, địa chỉ IP và tất cả các biến môi trường hiện tại) đến một địa chỉ email. Thật dễ dàng để thêm các tham số khác mà bạn muốn gửi bằng cách tùy chỉnh messagebiến.

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

Đây là câu trả lời tốt nhất theo ý kiến ​​của tôi. Nó đơn giản và không yêu cầu gửi e-mail từ máy, điều này chắc chắn sẽ nằm trong thư mục thư rác trừ khi được cấu hình đúng.
JayD3e

2

Mailgun thích ứng với câu trả lời @Fritz

Sau khi đăng tôi nhận thấy @pacharanero cũng viết về mailgun, nhưng tôi không hiểu họ đang làm gì với đào, vì vậy tôi cũng sẽ đăng giải pháp của mình.

Nếu bạn đang sử dụng máy ảo không có SMTP, bạn có thể cần phải sử dụng một cái gì đó như mailgun, sendgrid hoặc tương tự. Điều này làm việc cho tôi trên Google Cloud.

Một rủi ro của phương pháp này là kẻ tấn công có thể nhận được email gửi đi của bạn nếu bạn có thể sudo suvà tìm tập lệnh hoặc bạn để lại tập lệnh để gửi email có thể đọc được. mailgun có một danh sách trắng ip bạn nên thiết lập, nhưng rõ ràng là không hoàn hảo cho trường hợp sử dụng cụ thể này.

Kịch bản này sẽ hoạt động với mailgun sau khi bạn thay đổi mydomain.comtên miền thực của mình. Bạn có thể lưu tập lệnh vào /root/login-alert.shhoặc một số vị trí tối nghĩa hơn.

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

Sau đó, bạn có thể làm theo câu trả lời @Fritz để thay đổi /etc/pam.d/sshdbao gồm:

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

Tôi lưu ý rằng điều này hoạt động không có quyền đọc đối với người dùng đến ( chmod 700 /root/login-alert.sh) vì vậy người dùng đến không cần phải có quyền truy cập đọc vào tập lệnh.


1

Kịch bản này trong việc /etc/ssh/sshrcgửi email và thêm nhật ký vào hệ thống logger. Một sự khác biệt được tạo ra (vì vậy bạn có thể vô hiệu hóa nó nếu bạn muốn) giữa mạng con cá nhân của bạn và web trên toàn thế giới (yêu cầu 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

Tôi đang sử dụng swatchdog từ gói swatch để theo dõi bất kỳ dòng nào có chứa cụm từ " fail " (không phân biệt chữ hoa chữ thường) trong /var/log/auth.log . Tôi thiết lập nó để chạy nó như một dịch vụ systemd đơn giản.

apt install swatch

Tạo tập tin cấu hình /etc/swatch/swatch-auth-log.conf với quyền sở hữu gốc, quyền 644 -

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

Các "/ không / i" là một regexp, với "i" chỉ ra đó là trường hợp nhạy cảm. ( Sendmail của tôi là một tập lệnh gửi mọi thứ đến một địa chỉ cố định qua mailgun , vì vậy địa chỉ đó không thực sự quan trọng).

Tạo tệp dịch vụ systemd /etc/systemd/system/swatch-auth-log.service với quyền sở hữu gốc, quyền 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

Sau đó kích hoạt, bắt đầu và xem trạng thái của dịch vụ -

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

Một ví dụ về báo cáo trạng thái thành công -

 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

Dịch vụ sẽ được tự động khởi động khi khởi động và được giám sát bởi systemd .


Thảo luận

Ban đầu tôi đã sử dụng một giải pháp pam tương tự như trên, nhưng trong /etc/pam.d/common-auth không sshd . Đó là bắt ssh, sudo và đăng nhập. Nhưng sau khi cập nhật, tất cả mật khẩu của tôi đã ngừng hoạt động, ngay cả sau khi thay đổi mật khẩu trong chế độ cứu hộ. Cuối cùng, tôi đã thay đổi /etc/pam.d/common-auth trở lại ban đầu và mật khẩu hoạt động trở lại. Dưới đây là mô tả về bảng Stack Exchange UNIX & Linux

Tôi quyết định sẽ an toàn hơn nếu không chạm vào các cài đặt bảo mật khó hiểu. Và mọi thứ đều nằm trong tệp nhật ký.


0

Tôi thực sự vừa sửa đổi câu trả lời @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>" &

Điều này hoạt động trên các máy chủ 14.04, 16.04 và Centos 6.5.x tôi đã thiết lập, tôi khá chắc chắn rằng bạn cần đảm bảo mta được cấu hình, nhưng một khi đã xong, điều này sẽ rất hấp dẫn. Bước tiếp theo cảnh báo twilio

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.