使用IPFW和SSHGuard增强FreeBSD的安全性

VPS服务器经常是入侵者的目标。在系统日志中,常见的攻击类型是数百次未经授权的ssh登录尝试。设置防火墙非常有用,但仅靠防火墙本身可能无法充分控制破坏性入侵尝试。

本教程显示了如何使用防火墙和两种程序为FreeBSD 构建增强的入侵屏障。SSHGuard是一个小型附加程序,用于监视系统日志中的“滥用”条目。当违规者试图获得访问权限时,将指示其阻止来自违规者IP地址的流量。犯罪者随后被有效拒之门外。ipfwsshguardsshguardipfw

了解了这些程序的工作原理后,管理服务器保护就非常简单。尽管本指南侧重于配置FreeBSD,但它的一部分适用于其他OS和防火墙软件。

步骤1.配置IPFW

FreeBSD提供3个防火墙在默认(GENERIC)内核ipfwpfipfilter。每个都有优点和ipfw支持者,但是它们是FBSD的本机防火墙软件,非常容易用于我们的目的。值得注意的是,ipfw它的手册页显示了许多功能,但是对于典型的VPS情况,并不需要诸如NAT,流量整形等功能。幸运的是,防火墙的基本功能可以轻松满足我们的要求。

要在启动时启动防火墙,请将以下内容添加到/etc/rc.conf

firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"

service命令可用于手动启动/停止防火墙:

[user@vultr ~]$ sudo service ipfw start

自然,ipfw在添加规则之前,它不会做任何事情,通常是从文件中获取规则(在此示例中位于)/usr/local/etc/IPFW.rules。规则文件实际上可以位于任何位置或具有任何名称,只要它与“ firewall_script”参数匹配即可。规则文件将在下面详细描述。

步骤2.安装和配置SSHGuard

sshguard有多种口味可用于不同的防火墙。使用该pkg实用程序获取并安装sshguard-ipfw

[user@vultr ~]$ sudo pkg install sshguard-ipfw

在大多数情况下,这就是所有要做的事情。相应的变量将自动插入以/etc/rc.conf用于启动:

sshguard_enable="YES"

默认值通常可以正常工作。如果需要不同的值,则sshguard手册页会提供有关参数的详细信息:

# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"

您可以从sshguard通常的service调用开始:

[user@vultr ~]$ sudo service sshguard start

步骤3.创建一个规则脚本

最困难的部分是创建防火墙规则集。ipfw可以使用提供的/etc/rc.firewall脚本,但是必须对其进行修改以适应SSHGuard以及不同的操作方案。许多网页和FreeBSD手册中都有关于此操作的有用信息。但是,编写规则文件并不难,此外,自定义规则集可以更容易理解并在必要时进行更改。

ipfw规则的一个重要特征是首轮比赛获胜,这意味着规则顺序很重要。在中ipfw,每个规则是一个命令,而规则文件是一个可执行的Shell脚本。这样就可以通过更改规则来更改规则集,然后将规则文件作为shell脚本运行:

[user@vultr /usr/local/etc]$ sudo ./IPFW.rules

通常,规则文件将为ipfw命令定义一个变量,然后清除当前规则,发布通用规则,然后继续设置“ out”规则,再设置“ in”规则。ipfw手册页和其他资源包含有关规则结构和选项的大量信息,至少可以说很多。

由于FreeBSD sshguard版本已更新为1.6.2版,因此插入了对违规者的阻止规则的方法已更改。现在,罪犯的地址保存在ipfw表中(具体来说是表22),而不是像以前那样插入55000以上的规则中。

幸运的是,设置规则文件以使用表非常简单。只需将表规则放在正确的位置,并确保在编写规则时使用正确的语法即可。

sshguard找到违规者时,它将违规者的地址放入其黑名单,并将该地址插入ipfw表中,以便“触发”拒绝访问。该规则将实现以下目的:

01000 deny ip from table\(22\) to any

在这种情况下,仍然有必要制定允许入站服务高于 01000的规则。例如,假设10.20.30.40表22中的地址是一个违法者,并且我们有以下ipfw规则:

56420 allow tcp from any to me dst-port 22 in via $vif

由于规则56420 之前ipfw遇到规则01000 ,因此被阻止。“允许22英寸”规则根本不会看到它。如果允许规则具有“常规”数字(如00420),则不良流量将被允许进入并且从不阻止(因为00420小于01000且“首个比赛获胜”)。10.20.30.40

更新版本的一个不错的功能是,现在,当sshguard启动时,黑名单中的所有地址都将添加到表中,并且可以用来阻止传入的违规者而不会延迟。黑名单是累积的,并且在会话之间保留。

此时,显示为ipfw修改的完整规则集可能是明智的sshguard。注释应该使遵循规则逻辑变得非常容易:

#!/bin/sh

# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.

# Flush all rules before we begin.
ipfw -q -f flush

# Set rules command prefix
cmd="ipfw -q add "

vif="vtnet0"

# allow all for localhost
$cmd 00010 allow ip from any to any via lo0

# checks stateful rules.  If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state

# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state

# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state

# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state

# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state

# allow icmp re: ping, et. al. 
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state

# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state

# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state

# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state

# otherwise deny outbound packets
# outbound catchall.  
$cmd 00299 deny log ip from any to any out via $vif

# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif

# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81 
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif

# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif

# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif

# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state

$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2

# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any

# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range 
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state

# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif

# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any

步骤4.启动和测试

系统需求各不相同,阻止或取消阻止的端口选择也反映在规则集中。规则集完成后,将文件保存到/usr/local/etc/IPFW.rules,然后启动FBSD服务:

 # service ipfw start
 # service sshguard start

增强型防火墙现在应该正在运行!检查sshguard

 [user@vultr ~]$ sudo pgrep -lfa ssh

如果sshguard正在运行,将显示其pid和full命令行:

720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid

这将显示具有统计信息的防火墙规则集以及数据包最后一次与该规则匹配的时间:

 [user@vultr ~]$ sudo ipfw -cat list

在数小时或数天之后,将违法者的地址添加到黑名单以及表22中。要查看表中的所有地址,请使用以下命令:

ipfw table 22 list

结果显示为:

10.10.10.118/32 0
10.10.10.72/32 0
...

如上所述,不允许来自这些地址的连接。当然,第一次运行sshguard时,列表中没有任何地址,但是随着时间的流逝,地址可能会变得很长。一种选择是为表中具有多个条目的地址创建单独的阻止规则,然后将其从黑名单中删除。

步骤5.保持警惕...

偶尔检查日志以确保入侵受到控制是一个好主意。一般来说,/var/log/auth.log/var/log/security是资料。涵盖网络服务的间隙或错误可能会变得明显。根据需要修改防火墙规则集是服务器管理的正常部分。

在以前的sshguard版本中,当/var/db/sshguard/blacklist.db文件变大时,它可能会阻止sshguard系统启动。删除或重命名允许sshguard启动的黑名单文件。此问题似乎已在最新的sshguard版本中修复,因此可能不再需要此解决方法。

确保将您连接到SSH会话的IP地址列入白名单。如果您不小心将自己锁定在外,则始终可以连接到https://my.vultr.com中的noVNC控制台,并将您的IP列入白名单。

总结ipfw和结合使用,sshguard可以帮助您的FreeBSD系统保持安全并正常工作。最大限度地减少侵入性网络活动的另一个好处是:更少的“噪音”使跟踪和调整系统操作变得更加容易,从而有助于获得更安全,运行更好的服务器。

有效地保护FreeBSD系统/服务器并不是特别复杂。尽管需要花费一些精力才能使其启动并运行,但它可以带来更高的VPS和项目安全性。


Tags: #BSD #Security

Leave a Comment

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。