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

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

我正在使用运行xfce的Ubuntu 12.04

警告:根据注释,如果用户创建名为~/.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 " -t "Your Name " -s smtp.server.com & 

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

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

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

警告:与更改登录配置时一样,请在后台打开备份ssh会话,并从新终端测试登录。

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

首先,您需要能够从命令行发送邮件。 还有其他问题。 在邮件服务器上,最简单的方法是安装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, eg the current environment variables. message="`env`" echo "$message" | mailx -r "$sender" -s "$subject" "$recepient" fi 

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

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

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

对于那些需要解释PAM是什么以及它如何工作的人来说, 这是一个非常好的 。

我们一直在使用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文件中设置

更新:写了一篇更详细的博客文章

将以下内容放在/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很少访问的系统 – 快速而脏的通知可能很有用。

在另一个问题中,你可能有你想要的东西。 基本上,您可以在用户通过ssh登录时运行的脚本中添加对mail命令的调用:/etc/pam.d/sshd

/etc/ssh/sshrc此脚本发送电子邮件并将日志添加到系统记录器。 您的个人子网和万维网之间存在差异(因此您可以根据需要禁用它)(需要sudo apt-get install mailutils )。

 SUBNET="192.168.0" IP=`echo $SSH_CONNECTION | cut -d " " -f 1` CURRENT_SUBNET="$(echo $IP|cut -d'.' -f1-3)" if [ "$CURRENT_SUBNET" = "$SUBNET" ]; then msg="This message comes from same subnet! User $USER just logged in from $IP" echo $msg|mail -s "$msg" root else msg="This message comes from different subnet! User $USER just logged in from $IP" echo $msg|mail -s "$msg" root fi logger -t ssh-wrapper $USER login from $IP 

Mailgun改编为@Fritz的答案

发布后我注意到@pacharanero也写了关于mailgun,但我不明白他们在挖掘什么,所以我也会发布我的解决方案。

如果您使用的是没有SMTP的VM,则可能需要使用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 ' 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 

之后,您可以按照@Fritz的答案更改/etc/pam.d/sshd以包含:

 session optional pam_exec.so seteuid /root/login-alert.sh 

我注意到这对于到达的用户没有读取权限( chmod 700 /root/login-alert.sh ),因此到达的用户不需要具有对脚本的读取权限。

我其实只是修改了@SirCharlo的答案

 ip=`echo $SSH_CONNECTION | cut -d " " -f 1` logger -t ssh-wrapper $USER login from $ip echo "User $USER just logged in from $ip" | mail -s "SSH Login" "who to " & 

这适用于我设置的14.04,16.04和Centos 6.5.x服务器,我很确定你需要确保配置mta,但是一旦完成,这就有了魅力。 下一步twilio警报

我从这个线程中获得了一些优秀的答案,并制作了一些或多或少的可复制和可粘贴的东西。 它使用Mailgun发送电子邮件,因此您可以避免设置STMP的任何问题。 您只需要一个Mailgun API密钥和一个发送域。

SSH登录后,脚本会将登录的详细信息(用户,主机名,IP地址和所有当前环境变量)发送到电子邮件地址。 通过自定义message变量,可以轻松添加您想要发送的其他参数。

 #!/bin/sh # this script is triggered on SSH login and sends an email with details of the login # such as user, IP, hostname, and environment variables # script should be placed somewhere on the server, eg /etc/ssh # to trigger on SSH login, put this line in /etc/pam.d/sshd: # session optional pam_exec.so seteuid /etc/ssh/snippet-for-sending-emails-on-SSH-login-using-PAM.sh # Script settings MAILGUN_API_KEY= MAILGUN_DOMAIN= SENDER_NAME= SENDER_EMAIL_ADDRESS= RECIPIENT_EMAIL_ADDRESS= if [ "$PAM_TYPE" != "close_session" ]; then host=$(hostname) ip=$(dig +short myip.opendns.com @resolver1.opendns.com) # gets public IP # Message to send, eg the current environment variables. subject="SSH login - user:$USER pam-host:$PAM_RHOST host:$host ip:$ip" \ message=$(env) curl -s --user '$MAILGUN_API_KEY' \ https://api.mailgun.net/v3/$MAILGUN_DOMAIN/messages \ -F from='$SENDER_NAME <$SENDER_EMAIL_ADDRESS>' \ -F to=$RECIPIENT_EMAIL_ADDRESS \ -F subject="$subject" \ -F text="${subject} ${message}" fi