PiAlert V1保护服务器安全

有一天我有了一个主意。这个想法体现在PiAlert项目中。你可以找出它是从这个视频。简而言之,PiAlert证明是一种设备,如果尝试侵入服务器,则彩色灯会亮起。系统计算此类事件的总数。我大部分时间都在观看尝试连接到服务器上的端口22(SSH)的情况。通常,这些事件是机器人活动的结果。白天,在启用了常规登录系统的我的一个VPS上,记录了1,633次入侵尝试。在另一台使用SSH密钥进行无密码登录的服务器上,记录了9次攻击。一旦检测到未经授权的登录尝试,便可以访问WordPress项目的控制面板。上述视频显示了系统投入运行之前的测试。



这是一些镜头。





PiAlert在行动





关闭设备,正视图





禁用的设备,侧视图



我必须说,我得到的充其量只能称为设备的Alpha版本。我共享了用于在公共领域进行3D打印案例的项目代码模型,希望如果有人对我的项目感兴趣,他们将帮助我为共同利益进行改进。



项目概况



在最近与我的一台服务器发生事件之后,我意识到我真的很想翻阅日志并找出发生了什么。我通常使用以下命令:



tail -n 80 -f /var/log/apache2/error.log
tail -n 80 -f /var/log/apache2/access.log
tail -n 80 -f /var/log/auth.log


有趣的是,这些僵尸程序试图从任何地方尝试访问哪些页面,或者它们试图通过SSH登录哪些帐户。它也看起来像黑客电影。然后我想我可以创建比终端窗口更具吸引力的东西。这时,我在这里谈论的项目就诞生了。



监视登录尝试的结果最近已更改。这是在我实施了更严格的登录过程之后发生的。即,登录系统的尝试次数急剧下降。在我创建的服务器监视系统运行24小时后,这一点变得显而易见。下面我将讨论这个。



该材料分为三个部分。第一个与硬件有关,第二个与设置服务器有关,第三个与Raspberry Pi的程序有关。



硬件



我的设备由以下组件组装而成:





这是连接图。





将组件连接到板上



的示意图要将Blinkt LED面板连接到Raspberry Pi!使用杜邦连接线。一方面,我将它们切割并焊接到面板的40针GPIO端口的相应针上。我仍然无法将显示器直接连接到板上,因此无法将其直接连接到板上。



我花了很长时间才使小组工作。起初,我以为我的实例在连接器中连接不良。为了弄清楚这一点,我不得不经历反复试验,花费比我想花更多的时间。在我通过TwitterPimoroni联系之后,原来是Blinkt的早期版本!使用2号引脚提供5V电压,而不是如pinout.xyz所示使用4号引脚。但是,直到我弄清楚了,我赶紧下令订购另一个Blinkt!LED面板,以防我的键盘无法正常工作。现在,在我成功启动第一个项目之后,我需要考虑一个可以使用第二个项目的新项目。



我将所有这些组件放在我在Tinkercad设计的盒子中... 机身已在Ender 3 Pro 3D打印机上打印。我明白了,但我仍然想不起来如何制造零件,以使它们可以紧密地相互配合,或者可以通过闩锁相互固定。结果,我在其中一个用于M5螺钉的主体部分上形成了几个柱子,这些柱子用于组装完成的设备。这些柱子沿边缘放置,以便为Raspberry Pi留出足够的空间。



为了打印主体,我使用了未知制造商的PLA塑料(打印温度-217°C,填充率-10%)。在YouTube观看了 各种视频后,我应用了通常的设置





几次尝试打印机箱的结果





组装外壳



第九次尝试时,我仅设法创建了一个外观不错的前面板。每次打印时,结果表明都需要稍微移动一些东西,或者稍微移动一些地方,需要纠正一些东西。在编辑模型时,我只使用过Tinkercad几次,而我几乎必须从一开始就开始进行研究。我想修复Blinkt LED灯条!使用快照,但经过几次失败的尝试后放弃了这个想法,并用胶枪解决了这个问题(我喜欢这个东西!)。结果,我用它固定了显示器和Raspberry Pi板。在完成案子的工作后,我正在解决将板子放入其中的问题。起初,我没有以任何方式固定板子,但是正因如此,将USB电缆连接到它变成了一次真正的冒险。在表壳的最终版本中(如果可以说它的某些版本将是“最终的”),我想摆脱螺钉,螺丝孔以及表壳内部的柱子,找到一种连接表壳各部分的方法,例如使用闩锁。如果有人想参加语料库的工作并更改其中的所有内容,欢迎您!而且我还想用半透明的玻璃或一块丙烯酸树脂来关闭机箱的前面板。这样可以使设备看起来更美观,同时也隐藏了“技术”细节。如果有人想参加语料库的工作并更改其中的所有内容,欢迎您!而且我还想用半透明玻璃或一块丙烯酸树脂覆盖外壳的前面板。这样可以使设备看起来更美观,同时也隐藏了“技术”细节。如果有人想参加语料库的工作并更改其中的所有内容,欢迎您!而且我还想用半透明的玻璃或一块丙烯酸树脂来关闭机箱的前面板。这样可以使设备看起来更美观,同时也隐藏了“技术”细节。



该项目所基于的Raspberry Pi板已经在另一个项目中使用,该项目需要在板的背面安装40针GPIO端口。原来是一个加号。在这种情况下,该板是牢固固定的,我可能不会在其他项目中使用它。因此,我弯曲了一些针脚,以便将所有东西更好地放在箱子中。





一切都适合!



最后,我有另一个想法,那就是我应该为设备配备至少两个按钮。也许甚至没有把它们带出来,而只是将它们隐藏在箱子中的某个地方。需要一种在不同类型的固定攻击之间进行切换并显示其数量。第二个应该通过短按关闭显示器,然后长按轻轻关闭Raspberry Pi。如有必要,我可以始终通过SSH连接到我的设备,如果确实需要它,我可以创建一个调用该命令的URL路由sudo halt



服务器配置



在发生上述事件之后,当我加强对服务器的保护并设置监视功能时,我检查了是否在它们上安装了fail2ban程序这是很棒的自由-项目。 Fail2ban监视服务器上的日志,并记录有关在正常情况下不应该发生的事情的信息,例如多次SSH登录尝试失败。接下来,该程序禁止发出可疑请求的IP地址,如果这是一个潜在的严重问题,或者在预定时间段内重复某些事件,则禁止这样做。默认情况下,fail2ban监视SSH流量,但可以将程序配置为关注其他内容,例如404错误的数量或登录WordPress项目的管理面板的尝试失败的数量



Fail2ban允许您创建自己的动作,这些动作在发生各种事件时被调用。事实证明,这比做一个简单的curl请求要复杂得多,所以我最终还是向GitHub寻求帮助。无论我做什么,我都无法使系统按应有的方式工作。为了使您更轻松地解决类似的问题,我将告诉您最终我是如何完成所有设置的。即,我们正在谈论在基于Debian的服务器上使用fail2ban。



让我们创建一个文件,jail.local并添加以下内容:



[sshd]
enabled = true
port = ssh
banaction = pinotifyred[myhost="SCRIPTHOSTSERVER"]


在这里,SCRIPTHOSTSERVER您需要将其替换为合适的URL(例如-on dev.testing:8080)。请注意,此URL的开头没有协议信息,结尾没有路径,并且地址不得以斜杠结尾。



结果,事实证明,我们将执行与SSHD相关的常规操作,该程序将继续禁止可疑IP地址,但我们还能够创建其他操作。不幸的是,您不能简单地描述将在此处执行的命令(这是我的问题)。相反,您需要确切地告诉系统要采取什么措施。从存储在文件夹中的文件调用该动作action.d。该文件夹中.conf文件的名称与操作的名称相对应(在我们的示例中为pinotifyred.conf)。这些文件如下所示:



[Definition]
#  get-  "http://example.com/red"

actionban = curl --fail "http://<my-host>/red" >> /dev/null

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


同样,在这里,您需要更改SCRIPTHOSTSERVER为合适的URL(或dev.testing:8080),并遵循文件描述中上面讨论的相同规则jail.local



该代码调用动作并更改变量my-host。没有这样的变量,我无法使一切正常工作。



此代码执行所需的命令。它声明了一些使fail2ban工作所需的变量。此外,此配置方式意味着我们可以发送带有不同参数的curl或wget请求。例如,在这些参数中,可能存在有关禁止使用哪个IP以及何时发生的信息。因此,如果您希望获得比仅在其编号数据上的攻击更详细的信息(例如本例),则可以使用此方法。即,为此,您可以将action.d具有以下内容的文件放置在文件夹中



[Definition]
# get-  "http://example.com/ban.php?jail=sshd&ip=192.0.2.100":

actionban = curl -G --data-urlencode "jail=%(name)s" --data-urlencode "ip=" --fail "http://<my-host>/ban.php"

[Init]
#     jail-    :
my-host = SCRIPTHOSTSERVER


我想指出的是,这里可能存在一个错误,因为该操作被调用了两次-当IP被阻止和被取消阻止时。我计划稍后解决这个问题,也许这会使攻击次数增加一倍。



Raspberry Pi软件



老实说,我的代码是一团糟。它是由不认识Python但能够在Internet上搜索问题答案的人(我)用Python 3编写的。这加上一般的编程知识,使我能够用Python编写程序。



我不会在这里谈论为SSH工作准备Raspberry Pi的问题,因为许多人已经讨论过了。有问题的代码托管在GitHub上。它由几个文件表示。第一个文件是this pialert.py,它在系统启动时启动。第二个文件,tm1637.py是一个图书馆,我从了这个从材料RaspberryTips网站



我的Python程序充当HTTP服务器(我知道它不是用于生产的,但它仍然是一个简单的家庭项目),用于侦听所有请求。这是一个单线程程序,因此,如果有很多请求,则很可能会失败。程序等待URL到达,如果已向URL注册,它将执行操作。操作是打开Larson Scanner样式的Blinkt!上的LED并增加计数器。LED颜色的选择取决于URL。



我正在使用4种颜色:



  1. 蓝色-表示对我的WordPress网站进行了攻击
  2. 红色-服务器A上的SSH攻击。
  3. 紫色-服务器B上的SSH攻击。
  4. 绿色-针对服务器C的URL攻击。


也许,随着时间的推移,我将扩展设备记录的攻击集。但是,即使现在有了什么,您也可以随时了解事件,而无需连接到服务器。



在我的代码中,未处理错误,并且未监视可能的计数器溢出。该程序除其他外,向我表明,即使我的家庭网络也不断受到对特殊URL的请求形式的攻击。攻击者尝试通过发现的任何漏洞来访问网络(这会引发异常,但这不会停止程序)。



在该项目的工作期间,我必须解决的最后一项任务是设置Raspberry Pi。即,我需要板在加载后立即启动脚本,然后一切正常。通过编辑文件/etc/rc.local解决了此问题。我使用vi编辑器向通常用于启动程序的文件添加命令:



python3 /home/pi/PiAlert/pialert.py &


在那之后,我只剩下一个问题要解决。这是为了为我的VPS提供对Raspberry Pi的不间断访问,Raspberry Pi在家庭网络中,位于防火墙后面,并且具有动态IP地址。我可以使用动态DNS或那里的各种服务。但是,托管的Reddit社区的某人创建了免费服务freemyip.com。,它恰好解决了我需要解决的问题。他很好地解决了。这项服务还不是很流行,我确信由于免费,它不会长期保持这种状态。但是鉴于使用它很容易,我很乐意为此付费。我在同一个社区sliceport.com中找到了另一个有趣的服务我也有一天会尝试。



结果









PiAlert示范是不能相比的一些从电影最酷的黑客东西的设备。其目的是提醒您,每天都有成千上万的机器人试图访问他们不应该访问的内容。我创建的设备只是将有关此类尝试的信息传输到现实世界,使我们想起它们。它也很可爱。



关于PiAlert,我还能说些什么?该设备看起来中性且非常灵活。如果我决定不再需要它,可以重写代码并将其转换为时钟。或者,我可以将其变成访问我的网站页面的计数器。实际上-使用RGB LED和4位数字显示屏有很多选择。另外,该设备被证明是紧凑的。当我编写代码时,它站在我的面前,提醒我世界上有些人在做坏事。 PiAlert只需很少的电源即可运行,因此可以依靠电池运行。只要可以连接到WiFi网络,它就可以放置在房屋中的任何位置。在那里,它将简单地完成其工作。如果我需要另一个网络,通过SSH连接到Raspberry Pi或创建一个新文件就足够了wpa_supplicant.conf在中/boot



结果,我想指出我的代码当然看起来不太好。它可以并且应该被重构。如果我曾经学习过Python,那么我会在那里做。该案例也可以得到改进,如果我精通某种3D建模程序,我将继续研究该案例。但是,如果您不考虑这一点,我可以说我对所做的事情感到满意。



您是否打算制造类似PiAlert的设备?



All Articles