APP下载

一种采用配置文件对Windows Server防火墙进行设置的工具的设计与实现

2020-02-25赵庆明

福建质量管理 2020年19期
关键词:枚举对话框防火墙

赵庆明

(成都理工大学 四川 成都 610059)

一、引言

Windows Server在企事业单位中扮演了重要的角色,对于一些保存了重要数据的Windows Server来说,其安全问题尤为突出。虽然可以通过前置的安全设备对这些服务器进行保护以抵御外部网络上的攻击,但却无法抵御内部网络中的攻击。而Windows Server自身提供了一个“高级安全Windows防火墙”对自身系统的提供了“安全”防护。该管理界面对用户“简单”易用,同时却显得“简陋”。在系统管理员对防火墙规则的设置和检查的时候,这个“简陋”的界面难以有效管理“大量”的规则。本文探讨一种采用自定义的配置文件,编程的方式来设置Windows防火墙规则,以便系统管理员更高效、便捷地管理Windows Server自身的防火墙。

二、原理

Windows系统是一个友好的系统,其公开的API(应用程序接口)多达一万个以上,并且每一次发布的新版本都会增加数以千计的新API。除了Windows保留的一些特殊的API的外,对外公开API几乎包含了Window系统的方方面面。而这些API大多以dll文件存储在Windows系统相关目录中,还有不少以COM接口的方式公开了接口。

总体上,这些接口可以分如下几大类:基础服务,提供对Windows系统可用的基础资源的访问接口。比如文件系统、外部设备、进程、线程以及访问注册表和错误处理机制等等。图形设备接口,提供的功能为:输出图形内容到显示器、打印机以及其他外部输出设备。图形化用户界面,提供了创建和管理屏幕和大多数基本控件的功能,比如按钮和滚动条、接收鼠标和键盘输入以及其他与GUI有关的功能。通用对话框链接库,为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对画框和字体对话框等等。通用控件链接库,为应用程序提供接口来访问操作系统提供的一些高级控件。比如状态栏、进度条、工具栏和标签等等。网络服务,为访问操作系统提供的多种网络功能提供接口,包括NetBIOS、Winsock、NetDDE及RPC等等。

三、防火墙相关API

与防火墙相关的API由“C:WindowsSystem32FirewallAPI.dll”文件提供。如果使用Visual Studio 2019进行基于C#的开发,则在项目中引用名为“NetFwTypeLib”的COM组件即可。当然,也可以直接添加对于“FirewallAPI.dll”的引用,Visual Studio会自动将其封装成一个名为“NetFwTypeLib”的.NET的程序集,同时生成一个可以支持互操作的“Interop.NetFwTypeLib.dll”文件。作为一个工具的开发,无需开发太多功能,开发的功能可以满足自己需求即可,这样可以快速完成开发工作,进而快速投入使用。

在Visual Studio 2019的引用中,双击“NetFwTypeLib”,可打开“对象浏览器”窗口,聚焦在“Interop.NetFwTypeLib”子项之上,点击该子项可以看到其来自于本项目”Debug”目录中的“Interop.NetFwTypeLib.dll”之中。展开子项,里面仅仅可见9个枚举:“NET_FW_ACTION_、NET_FW_IP_PROTOCOL_、NET_FW_IP_VERSION_、NET_FW_MODIFY_STATE_、NET_FW_PROFILE_TYPE2_、NET_FW_PROFILE_TYPE_、NET_FW_RULE_DIRECTION_、NET_FW_SCOPE_、NET_FW_SERVICE_TYPE_”,由字面可以理解其表示的含义。进一步展开这些枚举,可以根据枚举成员的字面意思理解其表示的含义。

使用.net程序反编译器dnSpy打开“Interop.NetFwTypeLib.dll”文件,除了可以看到Visual Studio 2019“对象浏览器”可以看到的基本内容外,还能看到这些枚举中枚举项的常量值。另外,还可以看到反编译后的19个接口以及这些接口内部的定义。相关的说明,可以参考MSDN。

四、功能逻辑实现

(一)启用防火墙

在使用该工具的时候,通常需要启动防火墙。因此,无需检查Windows Server防火墙是否已经启用,调用API直接启用即可。可分别对“域网络”、“专用网络”和“公用网络”启用防火墙规则。“域网络”指工作区域中已加入域的网络;“专用网络”指家中或工作单位的网络;“公共网络”指如机场或咖啡店等公共场所的网络。通常无需区分,全部“启用”防火墙。

(二)删除指定名称的规则

防火墙中,以规则名称来辨认规则,但不同规则可以有相同的名称。实际使用过程中,尽可能避免不同的规则取相同的名称。无论是在程序中,还是在“高级安全Windows防火墙”,均可以通过选择“规则名”的方式来删除指定规则。虽然在“高级安全Windows防火墙”可以“修改”规则,但在Windows公开的API并无“修改”的功能,那么实现机制则为“读取+删除+添加”。

(三)添加一条新规则

删除指定名称的规则后,再重新创建一条同名的规则,将其添加至规则列表即可。使用开放的API对规则读取,无需管理员权限。但修改规则(删除、添加)则需管理员权限。在C#的项目中添加一个名为“app.manifest”的XML格式的“应用程序清单文件”,修改requestedExecutionLevel元素的level属性为”requireAdministrator”,编译好的程序在启动的时候会自动申请管理员权限。

五、核心代码实现

在代码编写之前,先引用“NetFwTypeLib”命名空间,接下来便可使用与防火墙相关的枚举和接口。由于设置的功能是通过COM接口来实现的,因此需要在本地创建“远程”对象的引用,然后对该对象进行相关的操作。

首先取得防火墙规则的COM对象的类型。

Type type=Type.GetTypeFromProgID(“HNetCfg.FwPolicy2”);

接下来,在本地创建该“远程”对象的引用,并将其强制转换为INetFwPolicy2类型。

INetFwPolicy2 INetFwPolicy=(INetFwPolicy2)Activator.CreateInstance(type);

在三个“网络”区域上,全部都启用防火墙。

INetFwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PUBLIC]=true;

INetFwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE]=true;

INetFwPolicy.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_DOMAIN]=true;

根据规则名称删除旧规则。这句需要管理员权限,否则报错。如果“规则名”存在,则会删除此规则,如果“规则名”不存在,执行此行代码也不会报错。

INetFwPolicy.Rules.Remove(“规则名”);

接下来创建一条规则,此功能同样通过COM接口实现,同样需要在本地创建“远程”对象的引用,然后对此规则进行相关的操作。

Type type2=Type.GetTypeFromProgID(“HNetCfg.FwRule”);

在本地创建该“远程”对象的引用,并将其强制转换为INetFwRule类型。

INetFwRule INetFwRule=(INetFwRule)Activator.CreateInstance(type2);

设置规则名称:

INetFwRule.Name=“规则名”;

设置规则描述:

INetFwRule.Description=“我的规则名”;

启用规则:

INetFwRule.Enabled=true;

将规则的“行为”设置为“允许”

INetFwRule.Action=NET_FW_ACTION_.NET_FW_ACTION_ALLOW;

设置数据的流动的方向

INetFwRule.Direction=NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;

设置协议类型,6代表TCP协议。

INetFwRule.Protocol=6;

设置本地地址,星号”*”代表全部本地地址。

INetFwRule.LocalAddresses=“*”;

设置本地端口,多个端口之间使用逗号分割。

INetFwRule.LocalPorts=“1555”;

设置网络接口类型,全部。

INetFwRule.InterfaceTypes=“ALL”;

设置允许的某些远程地址来访问,各个地址之间使用英文逗号进行分割。

INetFwRule.RemoteAddresses=“10.5.100.29/255.255.255.255,10.5.100.130/255.255.255.255”;

设置远程端口,星号(“*”)代表全部,或者不限。

INetFwRule.RemotePorts=“*”;

添加规则。这一句需要管理员权限执行,否则会出现异常。解决方法,前文有述。

INetFwPolicy.Rules.Add(INetFwRule);

总结

Windows系统提供了非常简单易用的图形化工具来对自身的防火墙进行管理,对于使用者来说,学习难度非常低,很容易上手。但对于需要频繁改动、或大量改动来说,图形化界面的工具缺少灵活性。在另一方面,Windows公开了大量的应用程序接口(API),系统管理员使用任意一种脚本语言或者编译语言即可使用这些API来直接对Windows进行操作和管理,也大大降低了传统的工作量。

示例项目:您可以访问网址https://github.com/zmrbak/FireWallAdmin下载本文所述的示例的代码,稍作修改便可用到你的实际管理工作中,以期简化您的管理工作。

猜你喜欢

枚举对话框防火墙
基于理解性教学的信息技术教学案例研究
正常恢复虚拟机
构建防控金融风险“防火墙”
数组在处理枚举无规律数据中的应用
Bootlace Worms’Secret etc.
What Is Beauty?
基于太阳影子定位枚举法模型的研究
浅谈VB的通用对话框《CommonDialog》控件的使用
在舌尖上筑牢抵御“僵尸肉”的防火墙
基于枚举的并行排序与选择算法设计