Mailgun 改编自 @Fritz 的回答

Mailgun 改编自 @Fritz 的回答

是否有人有 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,这样即使执行失败,您仍然可以登录。您可以更改optionalrequired。但是,除非脚本成功运行,否则这将阻止任何 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),因此到达的用户不需要具有对脚本的读取权限。

相关内容