如何在 ssh 登录成功时设置电子邮件警报?

Ric*_*k T 72 ssh bash

有没有人有一个 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,以便在执行失败时您仍然可以登录。确定它有效后,您可以更改optionalrequired. 然后,除非您的钩子脚本执行成功(如果这是您想要的),否则无法登录。

对于那些需要解释什么是 PAM 及其工作原理的人,这里有一个非常好的

  • 谢谢,效果很好。只需确保在 sshd_config 中将 `UsePAM` 设置为 `yes`。 (5认同)
  • /etc/pam.d/login <- 用于 tty 登录 (3认同)
  • 如果“sshd”文件中有“required”,您可能应该删除分叉(“&”),因为“mailx”可能会失败,但用户可能仍然已登录。另外,该脚本以 root 身份运行,因此请确保“mailx”也配置为 root (2认同)
  • 只是给我自己或其他 Selinux 新手的注意事项。pam_exec 运行脚本时出现权限错误。后来我发现它被错误地标记为Selinux。我将脚本克隆到 /bin/,它将自动标记为“unconfined_u:object_r:bin_t:s0”。然后我`chmod +x /bin/login-notify.sh` 并且它有效。 (2认同)
  • @4wk_ 感谢您的提示。我用 Internet Archive 的链接替换了它,所以它现在应该可以再次使用了。 (2认同)

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 选项。

  • @mchid:如果您考虑这个问题 *“如果有人登录我的个人邮箱,我希望收到通知。”*,那么这 * 可能* 是可以接受的。*如果*您只有一个用户帐户。否则,您必须为*所有* 帐户执行此操作,包括每个新添加的帐户。理想情况下,您必须确保用户无法修改或删除他们的 `~/.ssh/rc` 文件。使用基于 `pam` 的系统范围的方法更可靠和更安全,因为只有 `root` 可以弄乱它。所以答案是:`sshrd` 方法适用于单用户系统,但`pam` 方法适用于*所有*系统。 (2认同)

小智 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文件中设置

更新: 写了一篇关于这个的更详细的博客文章


Pau*_*aul 5

@Fritz 答案的 Mailgun 改编

发布后,我注意到@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)没有读取权限有效,因此到达的用户不需要对脚本具有读取权限。