使用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

使用OpenBSD在Vultr上配置BGP

使用OpenBSD在Vultr上配置BGP

Vultrs BGP功能使您可以拥有自己的IP空间并在我们的任何位置使用它,而OpenBSD实例则不需要其他软件!

如何在FreeBSD 12上使用Pkg软件包管理器

如何在FreeBSD 12上使用Pkg软件包管理器

简介FreeBSD是一种类似于Unix的开源操作系统,用于为现代服务器,台式机和嵌入式平台提供动力。Netflix,雅虎等巨人!

FreeBSD的Vultr块存储

FreeBSD的Vultr块存储

本文中的信息涉及修改磁盘,分区和文件系统,因此在执行任何示例之前,应先完全理解它们,因为它们会导致数据丢失或丢失。

如何在FreeBSD 11 FAMP VPS上安装Omeka Classic 2.4 CMS

如何在FreeBSD 11 FAMP VPS上安装Omeka Classic 2.4 CMS

使用其他系统?Omeka Classic 2.4 CMS是一个免费的开源数字发布平台和用于共享数字内容的内容管理系统(CMS)

如何在Debian,CentOS和FreeBSD上使用Sudo

如何在Debian,CentOS和FreeBSD上使用Sudo

在Linux和Unix系统管理员中,使用sudo用户访问服务器并在root级执行命令是一种非常普遍的做法。使用泡沫

如何在FreeBSD 12上安装osTicket

如何在FreeBSD 12上安装osTicket

使用其他系统?osTicket是一个开放源代码的客户支持票务系统。osTicket源代码公开托管在Github上。在本教程中

如何在FreeBSD 12上安装Dolibarr

如何在FreeBSD 12上安装Dolibarr

使用其他系统?Dolibarr是面向企业的开源企业资源计划(ERP)和客户关系管理(CRM)。多利巴尔

在OpenBSD 6上设置Ghost Professional发布平台

在OpenBSD 6上设置Ghost Professional发布平台

Ghost是与WordPress竞争的最新,最大的暴发户。主题开发既快速又容易学习,因为Ghost开发人员决定同时使用

如何在FreeBSD 12上安装Monica

如何在FreeBSD 12上安装Monica

使用其他系统?Monica是一个开源的个人关系管理系统。可以将其视为CRM(销售团队使用的一种流行工具

如何在FreeBSD 11 FAMP VPS上安装Couch CMS 2.0

如何在FreeBSD 11 FAMP VPS上安装Couch CMS 2.0

使用其他系统?Couch CMS是一个简单,灵活,免费和开源的内容管理系统(CMS),可让Web设计人员进行设计

如何在FreeBSD 12上安装LimeSurvey CE

如何在FreeBSD 12上安装LimeSurvey CE

使用其他系统?LimeSurvey是一个用PHP编写的开源调查软件。LimeSurvey源代码托管在GitHub上。本指南将向您展示

如何在FreeBSD 12的Nginx中启用TLS 1.3

如何在FreeBSD 12的Nginx中启用TLS 1.3

使用其他系统?TLS 1.3是传输层安全性(TLS)协议的版本,该协议于2018年作为RFC 8446中的建议标准发布

如何在FreeBSD 12上安装MyBB

如何在FreeBSD 12上安装MyBB

使用其他系统?MyBB是一个免费,开放源代码,直观且可扩展的论坛程序。MyBB源代码托管在GitHub上。本指南将

使用Prosody和FreeBSD设置XMPP服务器

使用Prosody和FreeBSD设置XMPP服务器

尽管ejabberd非常普遍,但最近有一个竞争对手-Prosody。本教程将向您展示如何在FreeBS上设置Prosody

用Poudriere建立自己的Pkg存储库

用Poudriere建立自己的Pkg存储库

从9.2版开始,FreeBSD引入了一个新工具来替换旧的pkg _ *-命令-pkg,也称为pkgng。它非常类似于Debians apt o

如何在FreeBSD 11上安装Matomo Analytics

如何在FreeBSD 11上安装Matomo Analytics

使用其他系统?Matomo(以前称为Piwik)是一个开源分析平台,是Google Analytics(分析)的一种开放替代方案。Matomo源托管o

如何在FreeBSD 11 FAMP VPS上安装ProcessWire CMS 3.0

如何在FreeBSD 11 FAMP VPS上安装ProcessWire CMS 3.0

使用其他系统?ProcessWire CMS 3.0是一个简单,灵活,功能强大,免费和开源的内容管理系统(CMS)。ProcessWire CMS 3。

如何在FreeBSD 12的Apache中启用TLS 1.3

如何在FreeBSD 12的Apache中启用TLS 1.3

使用其他系统?TLS 1.3是传输层安全性(TLS)协议的版本,该协议于2018年作为RFC 8446中的建议标准发布

如何在FreeBSD 11 FAMP VPS上安装Redaxscript 3.2 CMS

如何在FreeBSD 11 FAMP VPS上安装Redaxscript 3.2 CMS

使用其他系统?Redaxscript 3.2 CMS是一款现代,超轻量级,免费和开源的内容管理系统(CMS),具有火箭fas

如何在FreeBSD 12上安装BookStack

如何在FreeBSD 12上安装BookStack

使用其他系统?简介BookStack是一个简单的,自托管的易于使用的平台,用于组织和存储信息。BookStack已满

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

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 機器變磚。閱讀這篇文章以了解更多信息