如何在Ubuntu16.04上使用PyFilter阻止不需要的SSH登录尝试

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Code.org 来接受捐赠。

介绍

Secure Shell (SSH) 是一种用于安全运行网络服务的加密网络协议。 它通常用于远程控制计算机系统或传输文件。 当 SSH 暴露在公共互联网上时,它会成为一个安全问题。 例如,您会发现机器人试图通过暴力破解方法猜测您的密码。

PyFilter 旨在过滤掉所有对您服务器的非法登录请求,并在发送过多时阻止它们。 它通过读取日志文件并检查失败的请求是否在用户可配置的时间内来自同一 IP 地址来工作。 然后,如果它捕获太多失败的尝试,它会向防火墙添加规则,从而拒绝连接到您的服务器。

在本教程中,您将安装和配置 PyFilter 以阻止 SSH 请求。 然后,您将安装 PyFilter 作为服务,并可选择配置跨服务器禁止同步,该功能允许多个服务器共享禁止 IP 地址列表,并启用 PyFilter 记录有关 IP 地址的位置数据。 最后,您将探索如何取消禁止 IP 地址。

先决条件

要完成本教程,您需要:

  • 按照 Ubuntu 16.04 初始服务器设置指南 设置一台 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
  • Python 3,已默认安装在 Ubuntu 16.04 上。
  • PIP 与 sudo apt-get install python3-pip 一起安装。
  • (可选)如果您希望在Step 4中配置PyFilter的跨服务器禁止同步功能,请按照如何在Ubuntu 16.04上安装Redis安装Redis。

第 1 步 - 下载和配置 PyFilter

我们将通过从 Github 克隆其存储库来下载 PyFilter。 切换到您的主目录并克隆存储库:

cd ~
git clone https://github.com/Jason2605/PyFilter.git

这将创建一个名为 PyFilter 的目录。 将此文件夹移动到 /usr/local 文件夹:

sudo mv PyFilter /usr/local/PyFilter

然后切换到/usr/local/PyFilter目录:

cd /usr/local/PyFilter

接下来,我们需要制作一个配置文件。 PyFilter 附带一个位于 Config/config.default.json 的默认配置文件。 我们将复制它并编辑复制的版本,而不是直接编辑默认文件。 这样,如果出现问题,您可以使用默认配置文件进行比较。

复制默认配置文件:

sudo cp Config/config.default.json Config/config.json

可以使用less命令查看配置文件的内容:

less Config/config.json

默认设置要求请求在最后一个请求的 5 秒内,并且需要发生 5 次,它们足以开始。 让我们运行 PyFilter 并确保一切正常。

第 2 步——运行 PyFilter

PyFilter 下载包含一个名为 run.sh 的脚本,您应该使用它来启动 PyFilter。

首先,更改脚本的权限以使其可执行。

sudo chmod +x run.sh

授予权限后,运行脚本以启动 PyFilter:

./run.sh

PyFilter 将开始观察日志,您将在事件发生时看到输出:

OutputNo file to check within rule: Mysql
No file to check within rule: Apache
No file to check within rule: Nginx
Checking Ssh logs

默认情况下,PyFilter 禁止在前一个失败请求的 5 秒内发出五个或更多失败请求的 IP。 您可以在 PyFilter 配置文件中更改此设置。

这些结果也会记录到 /usr/local/PyFilter/Log 目录中。

当 IP 达到需要禁止的限制时,您将看到类似于以下内容的输出:

Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.

注意:如果你不小心因为你已经禁止自己而将自己锁定在你的Droplet之外,你可以按照教程如何使用DigitalOcean控制台访问你的Droplet重新进入。 然后按照步骤6中的步骤删除被禁止的IP。


要关闭 PyFilter,请按 CTRL+C

现在让我们将 PyFilter 安装为服务,以便它自动运行。

第三步——为 PyFilter 创建一个服务

现在您知道 PyFilter 可以工作了,让我们将其配置为作为服务运行,这样每次我们重新启动服务器时它都会启动。

PyFilter 目录中,有一个名为 install.sh 的脚本,它为 PyFilter 创建一个服务并使其能够在系统启动时运行。

修改脚本,以便您可以执行它:

sudo chmod +x install.sh

然后启动脚本:

./install.sh

您将看到以下输出,表明安装成功:

OutputService created and enabled, check the status of it by using "sudo systemctl status PyFilter"

因此,让我们这样做以确保一切正常运行:

sudo systemctl status PyFilter

您将看到此输出,表明服务是 active

Output● PyFilter.service - PyFilter
   Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled)
   Active: <^>active^> (running) since Wed 2018-03-21 18:55:35 UTC; 12s ago
 Main PID: 8383 (bash)
   CGroup: /system.slice/PyFilter.service
           ├─8383 bash /usr/local/PyFilter/run.sh
           ├─8384 sudo python3 run.py
           └─8387 python3 run.py

如果您看到错误,请再次查看安装步骤。

接下来,我们看看如何配置 PyFilter 与其他服务器共享被禁止的 IP 地址。

第 4 步 — 为跨服务器禁止同步配置 PyFilter(可选)

跨服务器禁止同步允许被禁止的 IP 地址与使用 PyFilter 保护它们的所有其他服务器同步,并且即使该地址没有满足被禁止的条件,也可以禁止该地址。 这意味着它可能比针对您其他系统的潜在机器人领先一步,因为 IP 已经被禁止。

如先决条件所述,您需要安装和配置 Redis。

您还需要 redis Python 模块,您可以使用 pip 安装它:

pip3 install redis

然后编辑您的配置文件以使用 Redis 而不是 SQLite。 在文本编辑器中打开 Config/config.json 文件:

nano Config/config.json

找到以下行:

配置/config.json

"database": "sqlite"

sqlite 更改为 redis

配置/config.json

"database": "redis"

接下来,更改 Redis 连接信息。 找到文件的这一部分:

配置/config.json

  "redis": {
    "host": "127.0.0.1",
    "password": null,
    "database": 0,
    "sync_bans": {
      "active": true,
      "name": "your_hostname",
      "check_time": 600
    }
  },

修改此部分,使其包含 Redis 服务器的连接详细信息。 然后,在 sync_bans 部分中,将 name 更改为您的主机名。 对于使用相同 Redis 服务器运行 PyFilter 的每个单独系统,此名称必须是唯一的,以便跨服务器禁止同步正常工作。

保存文件并退出编辑器。 然后重新启动 PyFilter 以应用这些更改:

sudo systemctl restart PyFilter

PyFilter 现在已安装并正在运行。

第 5 步 — 配置 PyFilter 以收集有关 IP 地址的位置数据(可选)

PyFilter 可以检索有关被禁止 IP 的位置数据,以提供有关大多数攻击来自何处的统计信息。 这个可选模块会将此信息附加到 PyFilter 的日志中。

要使用此功能,您首先需要 geoip2 Python 模块,您可以使用 pip 安装该模块:

pip3 install geoip2

安装此模块后,重新启动 PyFilter 以使其识别新模块:

sudo systemctl restart PyFilter

现在,当您看到被禁止的 IP 地址时,您将看到有关该 IP 的其他信息:

Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.

PyFilter 现在成功地记录了请求来自哪个国家。

最后,让我们看看如何取消禁止地址。

第 6 步 — 取消禁止 IP 地址

PyFilter 纯粹是一种通过创建 iptables 规则来禁止 IP 地址的手段。 当它禁止一个 IP 时,它会更新防火墙规则,然后将规则的快照保存到文件 /usr/local/PyFilter/Config/blacklist.v4/usr/local/PyFilter/Config/blacklist.v6 中。

以下是 /usr/local/PyFilter/Config/blacklist.v4 中几个被禁止的 IPv4 地址的示例:

/usr/local/PyFilter/Config/blacklist.v4

# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.13/32 -j DROP
-A INPUT -s 203.0.113.14/32 -j DROP
-A INPUT -s 203.0.113.15/32 -j DROP
COMMIT
# Completed on Thu Mar 22 19:53:04 2018

要取消禁止此 IP 地址,请在文本编辑器中打开相关的黑名单文件:

sudo nano /usr/local/PyFilter/Config/blacklist.v4

从文件中删除关联的 iptables 规则。 在这种情况下,我们从文件中删除了 203.0.113.13

/usr/local/PyFilter/Config/blacklist.v4

# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.14/32 -j DROP
-A INPUT -s 203.0.113.15/32 -j DROP
COMMIT
# Completed on Thu Mar 22 19:53:04 2018

然后保存文件并关闭编辑器。 使用 sudo systemctl restart PyFilter 重新启动 PyFilter,PyFilter 将使用此文件更新您的防火墙规则。

有关使用 iptables 管理规则的更多信息,请参阅 如何列出和删除 iptables 防火墙规则

您还可以通过将某些 IP 地址添加到 /usr/local/PyFilter/Config/config.json 文件中的白名单部分来告诉 PyFilter 忽略某些 IP 地址。

结论

您现在已安装 PyFilter 并监控您的 SSH 连接。

要详细了解配置文件的每个部分以及如何为其他服务(例如 MySQL 和 Apache)配置监控,请查看 PyFilter 站点。