当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

有没有人有一个bash脚本,在成功登录ssh服务器的情况下会发送电子邮件或通知某人?如果有人登录我的个人邮箱,我希望收到通知。

我正在使用运行xfce的Ubuntu 12.04

最佳解决思路

Warning: according to the comments, this does not work if the user creates a file called ~/.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 &

只要有人通过SSH登录,这将有效地通过电子邮件通知您,登录将记录在syslog中。

注意:您需要sendemail软件包(sudo apt-get install sendemail)才能使电子邮件通知正常工作。

注意:适用于端口转发,但不使用-N选项。

次佳解决思路

Warning: As always when you change the login configuration, leave a backup ssh session open in the background and test the login from a new terminal.

由于如果用户拥有自己的~/.ssh/rc文件,sshrc方法不起作用,我将解释如何使用pam_exec执行此操作,如@adosaiguas建议的那样。好处是,通过挂接到/etc/pam.d/中的不同文件,这也可以很容易地适应ssh以外的登录类型(例如本地登录甚至所有登录)。

首先,您需要能够从命令行发送邮件。还有其他问题。在邮件服务器上,最简单的方法是安装mailx(可能已经安装了)。

然后你需要一个可执行的脚本文件login-notify.sh(例如我把它放在/etc/ssh/中),内容如下。您可以更改变量以更改e-mail通知的主题和内容。不要忘记执行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

完成后,您可以将以下行添加到/etc/pam.d/sshd

session optional pam_exec.so seteuid /path/to/login-notify.sh

出于测试目的,该模块包含在optional中,因此如果执行失败,您仍然可以登录。确认它有效后,可以将optional更改为required。除非执行钩子脚本成功(如果这是你想要的),否则无法登录。

对于那些需要解释PAM是什么以及如何工作的人,here is a very good one

第三种解决思路

我们一直在使用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

注意:应在monitrc文件中设置邮件服务器配置,电子邮件格式等

更新:在此上写了更详细的blog post

第四种思路

将以下内容放入/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(对于bash shell用户)。如果用户已通过ssh登录,则if语句将仅返回true,这反过来将导致缩进的代码块运行。

接下来,我们构建消息的文本:

  • $(date)将被date命令的输出替换

  • ${USER}将替换为用户的登录名

  • $(hostname -f)将被登录系统的完整主机名替换

第二个TEXT行添加到第一行,提供该用户登录的系统的IP地址。最后,生成的文本将通过电子邮件发送到您的地址。

总结默认情况下,Linux将在系统日志文件中记录每个系统登录,无论是否通过ssh,但有时 – 特别是对于通过ssh很少访问的系统 – 快速而脏的通知可能很有用。

第五种思路

在这个其他question你可能有你想要的。基本上,您可以在用户通过ssh登录时运行的脚本中添加对mail command的调用:/etc/pam.d/sshd

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2161.html,未经允许,请勿转载。