一、背景介绍
在现代防火墙中,可能存在着海量的安全策略,传统逐个策略检查不再能满足高性能方面的需求。本文提出一种快速匹配算法提升安全策略之匹配性能,这种算法需要解决如下问题:
- 正确性:功能与逐个策略检查结果一致;
- 高效性:匹配性能不能随配置量增加而明显降低;
- 实时性:配置变更后需要立刻生效;
安全策略之过滤条件大体分为 地址类、端口类、对象类,我们分别进行探讨,给出快速匹配机制,并尝试完成代码实现(CentOS C++)。理论上,同等 C 代码实现能做到更优性能,但由于业时间有限而选用 C/C++混合编码则是一种折中。另外,受个人水平所限,文章观点未必是此问题之最优解,思路和代码也难免存在错误或纰漏,如有可供参考之处不胜荣幸。本文先从对象类快速匹配机制开始探讨。
二、问题描述
讨论对象快速匹配之前,以用户为例,假设我们的防火墙上存在如下配置:
策略名称 | 优先级 | IP | 端口 | 用户 | 动作 |
---|---|---|---|---|---|
POLICY1 | 1 | 192.168.1.0/24 | 80 | USER1 | permit |
POLICY2 | 2 | 192.168.1.0/24 | 22 | USER2,USER3 | deny |
POLICY3 | 3 | 192.168.1.0/24 | 23 | USER2,USER5 | permit |
... | |||||
POLICY999 | 999 | 192.168.1.0/24 | 443 | USER1,USER999 | permit |
POLICY1000 | 1000 | 192.168.1.0/24 | 8080 | ANY | deny |
说明:每个USER有唯一ID,本文需要解决的问题就是:如何根据 ID 快速找到所有匹配指定USER的安全策略。关于用户身份如何识别,地址、端口快速匹配以及多种匹配条件如何协作,我们会在后面单独探讨,不在本文之讨论范围。
针对上述配置,我们设法得到如下的“用户-策略“映射表:
策略匹配列表 | 代号 | |
---|---|---|
USER-1 | POLICY1 ,POLICY999,POLICY1000 | USER-1-MATCH-LIST |
USER-2 | POLICY2,POLICY3,POLICY1000 | USER-2-MATCH-LIST |
USER-3 | POLICY2,POLICY1000 | USER-3-MATCH-LIST |
... | ||
USER-999 | POLICY999,POLICY1000 | USER-999-MATCH-LIST |
USER-1000 | POLICY1000 | USER-1000-MATCH-LIST |
三、构建“用户-策略“映射表
我们对策略的用户配置情况做如下三种分类:
策略的用户配置情况 | 策略别名 | |
---|---|---|
1 | 策略中未配置用户 | NONE-USER-POLICY |
2 | 策略中配置ANY用户 | ANY-USER-POLICY |
3 | 策略中配置正常用户 | XXX-USER-POLICY |
我们很容易想到建立一个哈希来表示,以用户ID为KEY,以策略匹配列表为VALUE。我们只需要遍历所有配置便很容易构建出如下的“用户-策略”映射表:
用户 | 策略匹配列表 |
---|---|
NONE-USER | NONE-USER-MATCH-LIST |
ANY-USER | ANY-USER-MATCH-LIST |
USER-1 | USER-1-MATCH-LIST |
USER-2 | USER-2-MATCH-LIST |
USER-3 | USER-3-MATCH-LIST |
... | |
USER-999 | USER-999-MATCH-LIST |
USER-1000 | USER-1000-MATCH-LIST |
由于ANY-USER包含了任意用户,对于USER-1来说,我们将ANY-USER-MATCH-LIST和USER-1-MATCH-LIST之和,即为USER-1最终的策略匹配结果。
四、用户匹配过程
用户匹配过程,如下图所示:
ANY-MATCH和USERX-MATCH的规则按优先级从高到低排序,分别取第一个策略比较优先级即为最终结果。
五、配置变化
从100万策略实测情况来看,构建映射表时间在1秒以内,暂时还不需要引入增量加速。
六、C源代码
链接:https://pan.baidu.com/s/1XTaaLUxQMrPGTvfamff4Ug
提取码:pzzf