如何检测从外部网络启动的远程 ssh 会话?

如何检测从外部网络启动的远程 ssh 会话?

如何设置 monit 来通知我来自特定子网之外的新远程 SSH 会话?

我曾考虑将连接尝试记录为~/.bashrc脚本的一部分,但我不确定这是否可行,因为我不确定一些实施细节。

具体来说,我需要知道如何在~/bashrc脚本中执行以下操作:

  1. 如何获取与新连接关联的 IP 地址和子网
  2. 如何检查 IP 是否在我选择的特定子网之外

我想象该脚本可能看起来像这样的伪代码:

# 检查这是否是 SSH 连接
# 检查 SSH 连接是否来自所选子网之外
echo "来自 $SSH_CLIENT 的新连接" > /var/log/_ssh.log

监控配方:

检查文件 _ssh 的路径为 /var/log/_ssh.log
   如果校验失败则发出警报

答案1

您无法从~/.bashrc或类似位置执行此日志记录,因为它仅针对某些交互式会话执行,而不是在有人执行时执行ssh yourserver mycommandsftp yourserver等等。

所有 ssh 登录尝试,无论失败还是成功,都会通过 syslog 进行记录auth。日志消息包括源 IP 地址、身份验证方法以及身份验证是否成功。我认为最好的选择是使用一些日志监控软件。

我不知道 monit,但它的工作似乎是监视 sshd,如果 sshd 死机则重新启动它,这是一个不同的问题。

答案2

除了 $SSH_CLIENT,还有 $SSH_CONNECTION。要查看可用变量,请在命令提示符下运行“env”(不带引号)。-Tim

答案3

我不知道 monit,但你可以通过防火墙轻松地做到这一点。用特殊标签记录所有外部连接,而不记录内部连接。如果你使用 Linux,iptables 是你的好朋友。

您也可以通过 hosts.allow/hosts.deny 阻止所有 ssh 连接。您将在 ssh 日志中看到日志。

答案4

环境变量 $SSH_CLIENT 是当前用户 SSH 会话的 IP、远程端口和本地端口。

话虽如此,你为什么不直接删除安全子网以外的任何子网中的所有内容呢?这样可以省去很多麻烦。

另外:请花点时间正确地表述你的问题。ServerFault 应该是一个人们可以找到答案的地方,不仅可以找到自己的答案,还可以找到其他人的答案。如果你不介意的话,你的问题有点混乱。

相关内容