针对外部 IP 地址的 SSH 警报

针对外部 IP 地址的 SSH 警报

所以我有一个脚本,如果登录是从除了以“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 - 控制 tty
  • PAM_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 完毕

相关内容