在防火墙生成器中使用自定义服务对象
作者:vadim@fwbuilder.org http://www.fwbuilder.org |
本文继续关于Fireall Builder的一系列文章,一个支持许多开源防火墙平台以及Cisco IOS访问列表和Cisco ASA(PIX)的图形化防火墙配置和管理工具。 防火墙生成器早期在此站点上引入, 使用 防火墙生成器入门,在防火墙生成器中使用内置版本控制,在防火墙生成器中使用内置策略安装程序 , 在防火墙生成器中使用防火墙对象 。 本文演示如何使用防火墙构建器中的自定义服务对象。
有关Firewall Builder,预构建的二进制包和源代码,文档和Firewall Builder Cookbook的更多信息 ,请访问项目网站www.fwbuilder.org 。 观看项目博客 ,了解使用Firewall Builder的所有方面的公告和文章。
在防火墙生成器中使用自定义服务对象
Custom Service对象可用于将任意代码注入到生成的防火墙脚本中。 目标防火墙命令行语言中允许的不符合严格标准服务对象类型模型的任何组合可以使用Custom Service对象来表示。 例如,iptables附带了一组模块,它们增加了匹配标准代码不支持的分组参数或报头字段的复杂组合的能力。 其中一个模块增加了匹配数据包有效负载中的任何字符串的能力,这对于快速构建防火墙规则来阻止一些使用非特定组合的端口和其他参数的新协议非常有用。 这种能力有时用于编写规则来阻止具有已知签名的网络木马或病毒。
以下屏幕截图表示使用字符串模块功能的Custom Service对象。 特定于此模块的命令行选项位于“代码字符串”字段中。
注意:Custom Service中指定的代码是字面上使用的; 防火墙生成器GUI或策略编译器无法进行验证。
“自定义服务”对话框提供以下控件:
- 名称:这是对象的名称。
- 平台:这是一个下拉菜单,显示防火墙构建器中可用的所有防火墙平台目标的列表。
- 代码字符串:这是目标防火墙语言中的一行代码。 (这是Custom Service对象的核心。)
- 协议名称:如果要将自定义服务对象限制为特定协议,请使用此协议:TCP,UDP或ICMP。 默认为“任何”。 例如,如果此字段设置为“tcp”,则iptables的策略编译器将生成带有参数“-p tcp”的命令,然后插入在定制服务对象的“代码字符串”字段中定义的代码。
- 地址族:指定IPv4或IPv6。 策略编译器在编译IPv4或IPv6规则集时,使用有关地址族的信息来正确使用对象。
- 评论:这是一个用于评论的自由式文本字段。
在规则中使用自定义服务对象
以下示例使用iptables模块“近”。 从iptables手册引用,该模块“允许您动态创建IP地址列表,然后以几种不同的方式与该列表进行匹配”。 我们可以使用此模块来遏制暴力ssh扫描攻击,攻击者重复连接到ssh守护程序,试图猜测登录名和密码。 在Firewall Builder CookBook中可以找到有关如何在Linux上使用Custom Service对象与swatch脚本结合停止这些攻击的完整说明。 这里我们仅关注可以通过它获得的Custom Service对象和iptables规则。
此对象中定义的代码字符串为“--dport 22 -m recent --set”。 这匹配端口22(ssh),激活模块,并将数据包的源地址添加到模块维护的默认列表中。
第二个Custom Service对象也匹配端口22,并检查地址是否已经在列表中,并在过去1分钟内看到两次:
请注意,我们的目标是匹配协议ssh(tcp端口22),并同时激活iptables模块“recent”并为其添加一些参数。 这两个都是通过fwbuilder中的一个服务对象来完成的,但是将两个服务对象放在规则的“Service”字段中。 也就是说,如果要在同一规则的“Service”字段中放置定义“recent”模块的TCP服务对象“ssh”和“Custom Service”对象,那么我们最终会得到两个iptables命令,一个匹配的tcp端口22,另一个试图使用模块“近期”。 因为我们需要在同一条规则中匹配,所以我们必须在Custom Service对象中定义的代码添加“--dport 22”。
现在,使用这些对象的规则:
以下是为这两个规则生成的iptables命令(从自定义服务对象复制的代码为红色):
# Rule 0 (global)
#
$IPTABLES -N In_RULE_0
$IPTABLES -A INPUT -i + -p tcp -m tcp \
--dport 22 -m recent --rcheck --seconds 60 --hitcount 2 -j In_RULE_0
$IPTABLES -A In_RULE_0 -j LOG --log-level info --log-prefix "RULE 0 -- DENY "
$IPTABLES -A In_RULE_0 -j DROP
#
# Rule 1 (global)
#
$IPTABLES -A INPUT -i + -p tcp -m tcp \
--dport 22 -m recent --set \
-m state --state NEW -j ACCEPT
#
首先,我们匹配端口22,并检查我们是否在过去1分钟内看到此源地址至少2次。 如果是,模块“recent”返回匹配,数据包匹配第一个iptables规则。 Iptables将控制权传递给数据包被记录和删除的链“In_RULE_0”中的规则。 如果数据包不符合为“近期”模块设置的条件,则它与第一个iptables规则不匹配,并且将被下一个规则检查(为原始规则#1生成)。 如果这是一个新会话的打开数据包,它将匹配状态“NEW”,并将被允许。 由于此规则中还调用了“recent”模块,因此该数据包的源地址被添加到模块“recent”的内部表中,因此可以在之前的iptables规则中使用。
自定义服务允许您在生成的防火墙配置中注入任意字符串,在出现正常端口匹配的位置。 防火墙生成器中还允许在生成的代码中插入代码的另一个功能是自定义操作。 自定义服务与自定义操作的组合提供了一个非常灵活的系统,您可以在几乎任何所需的配置行中组合,如果标准方式不支持此功能。 假设我们只是放弃ssh扫描连接到我们的系统,我们想减慢它们,从而绑定攻击者的资源。 Iptables只有一个目标,它被称为TARPIT。 不幸的是,这个目标是针对iptables的,而在fwbuilder支持的其他防火墙上则不存在,并没有为它引入标准的动作。 然而,Custom Action是我们可以用来为此目标生成iptables命令的机制。 这是规则,其中的操作设置为“自定义操作”。 双击规则中的操作将打开其参数(如果有)的对话框。 Custom Action有一个参数,它是一个空闲的样式字符串,您可以在其中输入要在生成的命令中显示的代码。 以下屏幕截图显示了规则和编辑器面板:
当我们为iptables编译此策略时,我们现在得到的是:
#
# Rule 0 (global)
#
$IPTABLES -N In_RULE_0
$IPTABLES -A INPUT -i + -p tcp -m tcp \
--dport 22 -m recent --rcheck --seconds 60 --hitcount 2 -j In_RULE_0
$IPTABLES -A In_RULE_0 -j LOG --log-level info --log-prefix "RULE 0 -- CUSTOM "
$IPTABLES -A In_RULE_0 -j TARPIT
#
# Rule 1 (global)
#
$IPTABLES -A INPUT -i + -p tcp -m tcp --dport 22 -m recent --set \
-m state --state NEW -j ACCEPT
#
现在第一个规则最终将数据包发送到“TARPIT”目标,而不是我们想要的“DROP”。
用于生成目标防火墙配置的自定义服务对象和自定义操作实现机制,这些配置使用广义的核心fwbuilder防火墙模型所不具备的独特且罕见的功能。 这是使用许多iptables模块生成iptables命令的方法,该模块执行其他防火墙平台不可用的异常操作。 这种方法也可以用于在fwbuilder捕获之前使用新的模块和特征生成配置,并在其核心功能集中实现对它们的支持。