Câu trả lời:
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/sshrc
vớ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 sendemail
gó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.
~/.ssh/rc
vì 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.
~/.ssh/rc
tệp của họ . Sử dụng một phương pháp toàn hệ thống dựa trên pam
chỉ đáng tin cậy và an toàn hơn, bởi vì chỉ root
có thể gây rối với nó. Vì vậy, câu trả lời là: Các sshrd
phương thức hoạt động ổn đối với các hệ thống người dùng đơn, nhưng pam
phương thức này hoạt động đáng tin cậy cho tất cả các hệ thống.
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.
Vì sshrc
phương thức này không hoạt động nếu người dùng có ~/.ssh/rc
tệ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_exec
như @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 optional
thà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 .
/etc/ssh/login-notify.sh failed: exit code 13
ngay sau khi đăng nhập :(
UsePAM
đặt thành yes
sshd_config.
unconfined_u:object_r:bin_t:s0
. Sau đó tôi chmod +x /bin/login-notify.sh
và nó hoạt động.
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 monitrc
tệp
Cập nhật: Đã viết một bài đăng blog chi tiết hơn về điều này
Đặ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
/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 date
lệ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 TEXT
thê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.
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 message
biế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
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 su
và 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.com
tên miền thực của mình. Bạn có thể lưu tập lệnh vào /root/login-alert.sh
hoặ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/sshd
bao 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.
Kịch bản này trong việc /etc/ssh/sshrc
gử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
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ý.
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
ssh -N
chỉ với cổng chuyển tiếp.