Answers:
警告:根据评论,如果用户创建名为
~/.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选项。
~/.ssh/rc
因此,它作为安全措施是完全没有用的。@adosaiguas的答案pam_exec
是正确的。
~/.ssh/rc
文件。使用基于的系统范围的方法pam
更可靠,更安全,因为只能root
与它混淆。因此答案是:该sshrd
方法适用于单用户系统,但该pam
方法对所有系统均可靠。
警告:与往常一样,当您更改登录配置时,请在后台打开备份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
,因此,如果执行失败,您仍然可以登录。确定其可用后,可以更改optional
为required
。然后,除非成功执行钩子脚本(如果您要执行此操作),否则将无法登录。
对于那些需要解释什么是PAM以及它如何工作的人,这是一个很好的指南。
/etc/ssh/login-notify.sh failed: exit code 13
登录后
UsePAM
设置为即可yes
。
unconfined_u:object_r:bin_t:s0
。然后我 chmod +x /bin/login-notify.sh
就可以了。
我们一直在使用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访问的系统而言),快速而肮脏的通知会很有用。
我从该线程中获得了一些出色的答案,并做出了或多或少可以复制粘贴的内容。它使用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
发布后,我注意到@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
)没有读取权限,因此到达的用户不需要对该脚本具有读取权限。
该脚本/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
我使用看门狗从样本包监视包含短语“的行失败中的”(不区分大小写)/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板上的说明
我认为不要碰到难以理解的安全设置会更安全。无论如何,所有内容都在日志文件中。
我实际上刚刚修改了@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警报
ssh -N
仅端口转发。