所以我有一个脚本,如果登录是从除了以“10.1.”开头的 IP 地址之外的任何地方登录,它都会向我发送电子邮件:
#!/usr/bin/python
import smtplib, os
server = "10.10.10.10"
From = "[email protected]"
to = ["[email protected]"] # must be a list
subject = "SSH Login from outside network"
ip = os.environ['SSH_CONNECTION'].split()[0]
user = os.environ['USER']
if '10.1.' in ip:
print "---SSH IP Check---"
print 'Inside address, no alert will be sent.'
exit(0)
text = user + " just logged in from " + ip
# Prepare actual message
message = """\
From: %s
To: %s
Subject: %s
%s
""" % (From, ", ".join(to), subject, text)
# Send the mail
server = smtplib.SMTP(server)
server.sendmail(From, to, message)
server.quit()
我已将其添加到 /root/.bashrc 的 .bashrc 中,当我以 root 身份登录到此远程服务器时,它会运行,检查 $SSH_CONNECTION 变量并发送电子邮件(如果它不是以 10.1 开头)。
但是如果有人以用户身份登录怎么办?或其他用户名?我最初有一个文件 /etc/ssh/sshrc ,我认为它是一个 bash 脚本(虽然第一行没有 #!/bin/sh )并且它工作正常,但我想检查 ip 所以这就是我这样做的原因在 python 中,在 bash 中,它不喜欢双 [[ 括号,我只是将其通过管道发送到 sendmail。
所以问题是如何让这个脚本在任何 ssh 登录上运行?我应该继续尝试使用 sshrc 文件吗?
我尝试用这个 python 脚本替换 sshrc 文件,但是当我登录时我得到了这个:
/etc/ssh/sshrc: 3: /etc/ssh/sshrc: import: not found
/etc/ssh/sshrc: 5: /etc/ssh/sshrc: server: not found
/etc/ssh/sshrc: 6: /etc/ssh/sshrc: From: not found
/etc/ssh/sshrc: 7: /etc/ssh/sshrc: to: not found
/etc/ssh/sshrc: 8: /etc/ssh/sshrc: subject: not found
/etc/ssh/sshrc: 10: /etc/ssh/sshrc: Syntax error: "(" unexpected
答案1
您可以在打开登录会话时触发该脚本。
pam 脚本是一个 PAM 模块,允许您在授权、密码更改以及会话打开或关闭期间执行 PAM 堆栈中的脚本。
在基于 Debian 的 Linux 发行版中,它由软件包提供libpam-script
。在 Fedora 中,该包简称为pam-script
。
pam-script 可以触发以下脚本:
pam_script_auth
- 身份验证期间执行pam_script_acct
- 在账户管理期间调用pam_script_passwd
- 更改密码时调用pam_script_ses_open
- 当会话打开时调用pam_script_ses_close
- 会话关闭时调用
要在会话打开时运行脚本,请将其添加到/etc/pam.d/common-session
:
# Attempt to run pam_script_ses_open and pam_script_ses_close.
# Report success even if script is not found.
session optional pam_script.so onerr=success
在 Debian 中,默认情况下,pam-script 将执行/usr/share/libpam-script/pam_script_ses_open
.可以使用选项配置脚本的位置dir=/path/to/scripts/
。
使用 pam-script 还可以方便地在 bash 脚本中访问远程主机的 IP 地址。每个脚本都将传递以下环境变量(所有环境变量都将存在,但如果不适用,有些可能为空):
PAM_SERVICE
- 调用 PAM 堆栈的应用程序PAM_TYPE
- 模块类型(例如身份验证、帐户、会话、密码)PAM_USER
- 正在验证的用户PAM_RUSER
- 远程用户,调用应用程序的用户PAM_RHOST
- 远程主机PAM_TTY
- 控制 ttyPAM_AUTHTOK
- 可读文本的密码
答案2
松弛设置
因此,首先您需要在 Slack 中配置传入 Web Hook:
https://YOUR_DOMAIN.slack.com/apps/manage/custom-integrations
配置此选项将为您提供一个 Webhook URL,您可以在其中发布消息。 机器设置
现在连接到您的计算机并在 ssh 文件夹中创建一个脚本:
sudo nano /etc/ssh/notify.sh
将以下代码添加到我们将配置为在每次用户登录时运行的脚本:
针对外部 IP 地址的 SSH SLACK 警报
我有一个脚本,如果从 IP 地址以外的任何地方登录,它都会向我发送电子邮件。
将以下代码添加到我们将配置为在每次用户登录时运行的脚本:
sudo nano /etc/ssh/notify.sh
if [ "$PAM_RHOST" != "10.0.4.61" -a "$PAM_TYPE" != "close_session" ] && \
[ "$PAM_RHOST" != "10.0.4.62" -a "$PAM_TYPE" != "close_session" ] && \
[ "$PAM_RHOST" != "10.0.4.63" -a "$PAM_TYPE" != "close_session" ] && \
[ "$PAM_RHOST" != "110.0.4.64" -a "$PAM_TYPE" != "close_session" ]; then
url="https://hooks.slack.com/ser..."
channel="#ssh-login"
host="`hostname`"
content="\"attachments\": [ { \"mrkdwn_in\": [\"text\", \"fallback\"], \"fallback\": \"SSH login: $PAM_USER connected to \`$host\`\", \"text\": \"SSH login to \`$host\`\", \"fields\": [ { \"title\": \"User\", \"value\": \"$PAM_USER\", \"short\": true }, { \"title\": \"IP Address\", \"value\": \"$PAM_RHOST\", \"short\": true } ], \"color\": \"#F35A00\" } ]"
curl -X POST --data-urlencode "payload={\"channel\": \"$channel\", \"mrkdwn\": true, \"username\": \"ssh-bot\", $content, \"icon_emoji\": \":computer:\"}" $url
fi"
现在使脚本可执行:
sudo chmod +x /etc/ssh/notify.sh
最后将以下行添加到 /etc/pam.d/sshd 中:
session optional pam_exec.so seteuid /etc/ssh/notify.sh
完毕