有没有人有一个 bash 脚本,可以在成功登录到 ssh 服务器的情况下发送电子邮件或通知某人?如果有人登录我的个人邮箱,我想收到通知。
我正在使用运行 xfce 的 Ubuntu 12.04
Fri*_*itz 86
警告:与往常一样,当您更改登录配置时,请在后台打开备份 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
Run Code Online (Sandbox Code Playgroud)
完成后,您可以将以下行添加到/etc/pam.d/sshd:
session optional pam_exec.so seteuid /path/to/login-notify.sh
Run Code Online (Sandbox Code Playgroud)
出于测试目的,该模块包含为optional,以便在执行失败时您仍然可以登录。确定它有效后,您可以更改optional为required. 然后,除非您的钩子脚本执行成功(如果这是您想要的),否则无法登录。
对于那些需要解释什么是 PAM 及其工作原理的人,这里有一个非常好的。
Sir*_*rlo 56
警告:根据评论,如果用户创建一个名为
~/.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 &
Run Code Online (Sandbox Code Playgroud)
这将在有人通过 SSH 登录时通过电子邮件有效地通知您,并且登录将记录在系统日志中。
注意:您需要sendemail包 ( sudo apt-get install sendemail) 才能使电子邮件通知正常工作。
注意:适用于端口转发,但不适用于 -N 选项。
小智 13
将以下内容放入/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
Run Code Online (Sandbox Code Playgroud)
/etc/profile在每次登录时执行(对于 bash shell 用户)。if 语句只会在用户通过 ssh 登录时返回 true,这反过来会导致缩进的代码块运行。
接下来,我们然后构建消息的文本:
$(date)将被date命令的输出替换${USER} 将替换为用户的登录名 $(hostname -f) 将替换为正在登录的系统的完整主机名 第二TEXT行添加到第一行,给出该用户登录的系统的 IP 地址。最后,生成的文本会通过电子邮件发送到您的地址。
总结 默认情况下,Linux 会在系统日志文件中记录每次系统登录,无论是否通过 ssh 登录,但有时——特别是对于很少通过 ssh 访问的系统——快速而脏的通知可能很有用。
Lit*_*mus 10
我们一直在使用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
Run Code Online (Sandbox Code Playgroud)
注意:邮件服务器配置、邮件格式等应在monitrc文件中设置
发布后,我注意到@pacharanero 也写了有关 mailgun 的文章,但我不明白他们在用 dig 做什么,所以我也会发布我的解决方案。
如果您在一个没有 SMTP 的虚拟机上,您可能需要使用类似 mailgun、sendgrid 之类的东西。这在 Google Cloud 上对我有用。
这种方法的一个风险是,攻击者可能会获取您的外发电子邮件发送凭据,如果他们可以sudo su找到脚本,或者您让发送电子邮件的脚本保持可读性。mailgun 有一个您应该设置的 ip 白名单,但这显然不适合这个特定用例。
更改mydomain.com为实际域后,此脚本应与 mailgun 一起使用。您可以将脚本保存在/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
Run Code Online (Sandbox Code Playgroud)
之后,您可以按照@Fritz 的回答进行更改/etc/pam.d/sshd以包括:
session optional pam_exec.so seteuid /root/login-alert.sh
Run Code Online (Sandbox Code Playgroud)
我注意到这对到达的用户 ( chmod 700 /root/login-alert.sh)没有读取权限有效,因此到达的用户不需要对脚本具有读取权限。
| 归档时间: |
|
| 查看次数: |
110552 次 |
| 最近记录: |