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


56

是否有人有bash脚本,如果成功登录ssh服务器,该脚本会通过电子邮件发送通知或通知某人?如果有人登录我的个人邮箱,我希望得到通知。

我正在使用运行xfce的Ubuntu 12.04

Answers:


46

警告:根据评论,如果用户创建名为~/.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选项。


如果客户不要求TTY,这也可以吗?例如ssh -N仅端口转发。
gertvdijk 2013年

当我们使用gmail作为smtp服务器时,这也可以工作吗?
user155073

这需要一个警告:如果用户创建了一个名为的文件,则该警告将不起作用,~/.ssh/rc因此,它作为安全措施是完全没有用的。@adosaiguas的答案pam_exec是正确的。
Fritz

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

70

警告:与往常一样,当您更改登录配置时,请在后台打开备份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

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

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

为了进行测试,该模块以形式包含在内optional,因此,如果执行失败,您仍然可以登录。确定其可用后,可以更改optionalrequired。然后,除非成功执行钩子脚本(如果您要执行此操作),否则将无法登录。

对于那些需要解释什么是PAM以及它如何工作的人,这是一个很好的指南


1
它说:/etc/ssh/login-notify.sh failed: exit code 13登录后
立即::

3
谢谢,它很好用。只需确保已在sshd_config中UsePAM设置为即可yes
Nicolas BADIA 2015年

2
只是给自己或其他对Selinux陌生的人的笔记。pam_exec运行脚本时出现权限错误。后来我发现它被错误地标记为Selinux。我将脚本克隆到/ bin /中,该脚本将自动标记为 unconfined_u:object_r:bin_t:s0。然后我 chmod +x /bin/login-notify.sh就可以了。
RedGiant

3
/etc/pam.d/login <-tty登录
FernandoAndré18

2
@ 4wk_感谢您的提示。我将其替换为指向Internet存档的链接,因此它现在应该可以再次使用。
弗里茨

9

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

更新:在此 撰写了更详细的博客文章


7

将以下内容放入/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访问的系统而言),快速而肮脏的通知会很有用。



2

我从该线程中获得了一些出色的答案,并做出了或多或少可以复制粘贴的内容。它使用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, e.g. 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

我认为这是最好的答案。它很简单,不需要从计算机发送电子邮件,除非配置正确,否则电子邮件肯定会发送到垃圾邮件文件夹中。
JayD3e

2

Mailgun改编@Fritz答案

发布后,我注意到@pacharanero也写了有关mailgun的文章,但是我不了解他们在使用dig做些什么,所以我也将发布我的解决方案。

如果您使用的是没有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 <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

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

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

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


1

该脚本/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

1

我使用看门狗样本包监视包含短语“的行失败中的”(不区分大小写)/var/log/auth.log。我将其设置为作为简单的systemd服务运行。

apt install swatch

创建一个配置文件/etc/swatch/swatch-auth-log.conf,所有者为root,权限为644-

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t auth.log@xxx.com

“/失败/ I”是一个正则表达式,与第“i”指示它不区分大小写。(我的sendmail是一个脚本,它通过mailgun将所有内容发送到固定地址,因此该地址并不重要)。

创建一个systemd服务文件/etc/systemd/system/swatch-auth-log.service与业主根,许可644 -

[Unit]
Description=monitor /var/log/auth.log, send fail notices by mail

[Service]
ExecStart=/usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log

[Install]
#WantedBy=multi-user.target
WantedBy=pre-network.target

然后启用,启动并查看服务状态-

sudo systemctl enable swatch-auth-log.service
sudo systemctl start swatch-auth-log.service
sudo systemctl status swatch-auth-log.service

成功状态报告的示例-

 swatch-auth-log.service - monitor /var/log/auth.log, send fail notices by mail
   Loaded: loaded (/etc/systemd/system/swatch-auth-log.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-31 21:41:52 PST; 17min ago
 Main PID: 27945 (swatchdog)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/swatch-auth-log.service
           ├─27945 /usr/bin/perl /usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log
           ├─27947 /usr/bin/perl /.swatchdog_script.27945
           └─27949 /usr/bin/tail -n 0 -F /var/log/auth.log

Jan 31 21:41:52 ub18 systemd[1]: Started monitor /var/log/auth.log, send fail notices by mail.
Jan 31 21:41:52 ub18 swatchdog[27945]: *** swatchdog version 3.2.4 (pid:27945) started at Thu Jan 31 21:41:52 PST 2019

该服务将在启动时自动启动并由systemd监视。


讨论区

最初,我使用与上述类似的pam解决方案,但在/etc/pam.d/common-auth中不是sshd。那是为了捕获ssh,sudo和登录名。但是之后,即使在应急模式下更改了密码,我的所有密码也停止了工作。最终,我将/etc/pam.d/common-auth更改回原始状态,并且密码再次起作用。这是Stack Exchange UNIX&Linux板上的说明

我认为不要碰到难以理解的安全设置会更安全。无论如何,所有内容都在日志文件中。


0

我实际上刚刚修改了@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 <who-to@youremail.com>" &

这在我已设置的14.04、16.04和Centos 6.5.x服务器上有效,我敢肯定您需要确保已配置mta,但是一旦完成,它就会很有吸引力。下一步twilio警报

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.