是否有人有 bash 脚本,可以在成功登录 ssh 服务器时发送电子邮件或通知某人?如果有人登录我的个人邮箱,我希望收到通知。
我正在使用运行 xfce 的 Ubuntu 12.04
答案1
警告:与往常一样,当您更改登录配置时,请在后台打开备份 ssh 会话并从新终端测试登录。
如果用户有自己的文件,该sshrc
方法将不起作用~/.ssh/rc
,我将按照@adosaiguas 的建议解释如何执行此操作pam_exec
。好处是,ssh
通过挂接到 中的其他文件,这也可以轻松适应其他登录类型(例如本地登录甚至所有登录)/etc/pam.d/
。
首先,您需要能够从命令行发送邮件。关于这一点还有其他问题。在邮件服务器上安装可能最容易mailx
(邮件服务器可能已经安装了)。您需要进行配置mailx
以便用户root
可以发送邮件。
然后,您需要一个具有以下内容的可执行脚本文件login-notify.sh
。您可以更改变量以更改电子邮件通知的主题和内容。例如,您可以将文件放入/usr/local/bin
或中/etc/ssh/
。不要忘记运行chmod +x login-notify.sh
以使其可执行。并使用 赋予 root 所有权sudo chown root:root login-notify.sh
,这样就没有人可以弄乱脚本了。
#!/bin/sh
# Change these two lines:
sender="[email protected]"
recepient="[email protected]"
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
(当然是正确的/path/to/login-notify.sh
):
session optional pam_exec.so seteuid /path/to/login-notify.sh
出于测试目的,模块以 的形式包含在内optional
,这样即使执行失败,您仍然可以登录。您可以更改optional
为required
。但是,除非脚本成功运行,否则这将阻止任何 SSH 登录。不确定这是否是个好主意...
对于那些需要解释 PAM 是什么以及它如何工作的人来说,这是一个非常好的。
答案2
警告:
~/.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 <[email protected]>" -t "Your Name <[email protected]>" -s smtp.server.com &
每当有人通过 SSH 登录时,这将有效地通过电子邮件通知您,并且登录信息将记录在系统日志中。
笔记:您需要该sendemail
包(sudo apt-get install sendemail
)才能使电子邮件通知正常工作。
笔记:适用于端口转发,但不能适用于 -N 选项。
答案3
输入以下内容/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" [email protected]
fi
脚本的工作原理
/etc/profile
每次登录时都会执行(对于 bash shell 用户)。如果用户已通过 ssh 登录,则 if 语句将仅返回 true,这反过来会导致运行缩进的代码块。
接下来,我们构建消息文本:
$(date)
date
将被命令的输出替换${USER}
将被用户的登录名替换$(hostname -f)
将被登录系统的完整主机名替换
第二TEXT
行添加到第一行,给出此用户登录的系统的 IP 地址。最后,生成的文本将通过电子邮件发送到您的地址。
摘要 Linux 默认会在系统日志文件中记录每次系统登录(无论是否通过 ssh),但有时 - 特别是对于很少通过 ssh 访问的系统 - 快速而粗略的通知可能会很有用。
答案4
Mailgun 改编自 @Fritz 的回答
发帖后,我注意到@pacharanero 也写了关于 mailgun 的文章,但我不明白他们用 dig 做什么,所以我也会发布我的解决方案。
如果您使用的虚拟机没有 SMTP,则可能需要使用 mailgun、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 <[email protected]>'
TO='[email protected]'
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
),因此到达的用户不需要具有对脚本的读取权限。