作者选择Code.org作为Write for DOnations计划的一部分获得200美元的捐赠。
介绍
安全外壳(SSH)是用于安全操作网络服务的加密网络协议。 它通常用于远程控制计算机系统或传输文件。 当SSH暴露于公共互联网时,它成为一个安全问题。 例如,你会发现机器人试图通过暴力方法猜测你的密码。
PyFilter旨在过滤掉所有对您的服务器的非法登录请求,并在发送过多时阻止它们。 它通过读取日志文件并在用户可配置的时间内检查失败请求是否来自同一IP地址来工作。 然后,如果防火墙捕获失败的尝试次数过多,则会向防火墙添加规则,从而拒绝连接到服务器的能力。
在本教程中,您将安装并配置PyFilter以阻止SSH请求。 然后,您将安装PyFilter作为服务,并可选择配置跨服务器禁止同步功能,该功能允许多个服务器共享禁止的IP地址列表,并启用PyFilter以记录有关IP地址的位置数据。 最后,您将探索如何取消禁止IP地址。
先决条件
要完成本教程,您需要:
- 遵循Ubuntu 16.04初始服务器设置指南设置的一台Ubuntu 16.04服务器,包括sudo非root用户和防火墙。
- Python 3,默认情况下已安装在Ubuntu 16.04上。
- 使用
sudo apt-get install python3-pip
PIPsudo apt-get install python3-pip
。 - (可选)如果您希望在第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/lonfig.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作为服务安装,以便它自动运行。
第3步 - 为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
找到以下行:
"database": "sqlite"
将sqlite
更改为redis
:
"database": "redis"
接下来,更改Redis连接信息。 找到该文件的这一部分:
"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地址示例:
# 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
:
# 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将使用此文件更新您的防火墙规则。
有关使用iptables管理规则的更多信息,请参阅如何列出和删除iptables防火墙规则 。
您还可以通过将PyFilter添加到/usr/local/PyFilter/Config/config.json
文件中的白名单部分来忽略某些IP地址。
结论
你现在已经安装了PyFilter并监控你的SSH连接。
要详细了解配置文件的每个部分以及如何配置其他服务(例如MySQL和Apache)的监视 ,请检查PyFilter站点。 。