Bootstrap

云计算防火墙对象(组)的实践

1、为什么要引入防火墙对象(组)的概念?

在目前的云计算中,虚拟化防火墙已经成为了主流,其不但可以节省资源,还可以按序创建。SaaF(Soft As A Firewall)已经成为未来的防火墙形态,但是针对繁杂的ACL,传统的五元组就显得有些笨拙了,此时更加灵活的对象组应运而生,专门用来解决这些繁杂的问题。

1.1、对象(组)的优势

2、对象(组)和规则的关系

以上,对象组分为服务对象组和IP对象组,服务对象组中包含服务对象,IP对象组中包含IP对象。其中服务对象为协议和端口的组合,IP对象为单个IP、CIDR和连续的IP段。规则中包含3个对象,分别为源IP对象,目的IP对象和服务对象,这样一来对象组和传统的五元组就实现了功能对齐,而且可以实现更加详细的规则策略。

使用对象组的防火墙层次:对象-->对象组-->规则-->策略-->防火墙

3、对象(组)数据表设计

3.1、详细设计

3.1.1、对象的详细定义

对象组分为IPv4地址对象组、IPv6地址对象组、服务对象组。这些对象组可以被对象策略、ACL引用,作为报文匹配的条件。

IPv4地址对象组内可以配置IPv4地址对象,地址对象与IPv4地址或用户绑定,用于匹配报文中的IPv4地址或报文所属的用户。

IPv6地址对象组内可以配置IPv6地址对象,地址对象与IPv6地址或用户绑定,用于匹配报文中的IPv6地址或报文所属的用户。

服务对象组内可以配置服务对象,服务对象与协议类型以及协议的特性绑定(协议特性如TCP或UDP的源端口/目的端口、ICMP协议的消息类型/消息码等),用于匹配报文中的可承载的上层协议,其中端口与协议端口号绑定,用于匹配报文中的协议端口号。

3.2、对象表结构

MariaDB [neutron]> desc firewall_object;
+-------------------+---------------+------+-----+---------+-------+
| Field             | Type          | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+-------+
| id                | varchar(36)   | NO   | PRI | NULL    |       |
| name              | varchar(255)  | YES  |     | NULL    |       |
| project_id        | varchar(255)  | YES  | MUL | NULL    |       |
| description       | varchar(1024) | YES  |     | NULL    |       |
| object_group_type | varchar(36)   | YES  |     | NULL    |       |
| protocol          | varchar(40)   | YES  |     | NULL    |       |
| ip_version        | int(11)       | YES  |     | NULL    |       |
| source_port       | varchar(255)  | YES  |     | NULL    |       |
| destination_port  | varchar(255)  | YES  |     | NULL    |       |
| ip_address        | varchar(255)  | YES  |     | NULL    |       |
| object_group_id   | varchar(36)   | YES  |     | NULL    |       |
+-------------------+---------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

以上,防火墙相关表都属于neutron库,根据object_group_type类型来确定对象的类型,比如服务对象组中的对象只有protocol、source_port、destination_port这几个关键属性,IP对象组的对象有ip_version、ip_address两个关键属性,project_id、name、id、description属于公共属性。

3.3、对象组表结构

MariaDB [neutron]> desc firewall_object_group;
+-------------------+---------------+------+-----+---------+-------+
| Field             | Type          | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+-------+
| id                | varchar(36)   | NO   | PRI | NULL    |       |
| name              | varchar(255)  | YES  |     | NULL    |       |
| description       | varchar(1024) | YES  |     | NULL    |       |
| project_id        | varchar(255)  | YES  | MUL | NULL    |       |
| ip_version        | int(11)       | YES  |     | NULL    |       |
| object_group_type | varchar(36)   | YES  |     | NULL    |       |
| rule_id           | varchar(36)   | YES  |     | NULL    |       |
+-------------------+---------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

以上,对象组是对象的集合,其中object_group_type表明了对象组的类型,rule_id表明了此对象组关联的规则,当对象组关联了规则时无法被删除,ip_version表明了IP对象组的ip版本,建议使用IPv4,IPv6这种样式。

3.4、接口定义

3.4.1、创建对象组

method:POST

uri:/v2.0/firewall/object_group

Code:202、404

body:

{
	"object_groups": {
  	"name": "x",
    "description": "xx",
    "project_id": "xxx",
    "ip_version": "IPv4",
    "object_group_type": "IPv4",
    "rule_id": "dsds"
  }
}

字段解释:

name:对象组名称(必填)

description:对象组描述(选填)

project_id:对象组所属项目ID(必填)

ip_version:IP独享的IP版本(当对象组类型为IP是必填)

object_group_type:对象组的类型(枚举:IPv4、IPv6、Service)

rule_id:对象组关联规则的ID(选填,可以在创建对象的时候关联规则,也可后续关联)

响应示例:

{
	"object_groups": {
  	"id": "dsdsdsdfrrgdg-gfdgdfgdgfd"
  	"name": "x",
    "description": "xx",
    "project_id": "xxx",
    "ip_version": "IPv4",
    "object_group_type": "IPv4",
    "rule_id": "dsds",
    "created_at": "2021-4-2 22:20:37"
  }
}

以上,初始定义的对象组表结构中没有定义创建时间created_at,在响应体中我想到了这个,所以添加了,你可以选在在设计表结构的时间增加他。这样我们就可以得到这个资源的创建时间,在以后的审计中会很有用。

3.4.2、修改对象组

method:PUT

uri:/v2.0/firewall/object_group

Code:200、409

body:

{
	"object_groups": {
  	"name": "x",
    "description": "xx"
  }
}

鉴于对象组的特殊性,涉及到数据切换,所以暂时设计只支持名称name和描述description的修改。

字段解释:

name:对象组名称(必填)

description:对象组描述(选填)

响应示例:

{
	"object_groups": {
  	"id": "dsdsdsdfrrgdg-gfdgdfgdgfd"
  	"name": "x",
    "description": "xx",
    "project_id": "xxx",
    "ip_version": "IPv4",
    "object_group_type": "IPv4",
    "rule_id": "dsds",
    "created_at": "2021-4-2 22:20:37",
    "update_at": "2021-4-2 22:25:57"
  }
}

以上,我在修改对象组的接口中又想到了更新时间这个字段,可以记录我们最近一次修改对象组的时间,你可以在表结构中增加这个字段。

3.4.3、查询对象组

method:GET

uri:/v2.0/firewall/object_group

Code:200、404

响应示例:同创建

3.4.4、删除对象组

method:DELETE

uri:/v2.0/firewall/object_group/{object_group_id}

Code: 201、409

响应示例:

{
	"res": 0
}

3.4.5、CRUD对象

关于对象的CRUD和对象组类似,只是在对象组的基础上,增加了所属对象组ID,IP,协议,源目的端口这几个属性,而且你依然可以为其增加创建时间和修改时间两个时间属性。

4、原型

4.1、对象组的原型

4.2、对象的原型

4.3、补充解释

关于以上原型,只是大概的介绍,还有很多的不足,比如分页和查询,以及单条记录的快捷操作。请大家见谅,其中在规则的创建中我们可以选择数据来源为五元组或者对象组,如果为对象组,则我们需要为规则指定源地址对象组,目的地址对象组和服务对象组。

5、对象组和防火墙的联动

我们创建规则可以关联对象组,同时将规则关联到策略,之后策略关联防火墙的时候,Neutron会将策略通过防火墙的插件下发到虚墙,实际使用的源地址,目的地址,协议和端口会使用对象定义的数据。而且当我们需要修改源地址等对象的时候,只需要修改对象的数据,Neutron依然可以通过防火墙的插件将变更更新到虚墙。这样可以实现更加灵活的策略变更。

6、使用场景

  • 复杂的访问策略场景

  • 高频的权限更改

  • 追加的IP

  • 端口的频繁变更

7、附

7.1、防火墙的规则是什么?

防火墙的规则描述了允许或拒绝五元组或者对象组的组合。比如:允许源地址为全零的段使用ICMP协议去访问目的地址为192.168.1.1的IP,端口范围为0-255。其中的源(目的)地址可以为五元组中的IP段,也可以是IP对象组。协议和端口可以是五元组组中的协议和端口范围,也可以是对象组中的服务对象。

7.2、防火墙的策略是什么?

防火墙的策略实际上市规则的集合,用来描述一组复杂的规则,从而实现类似iptables的多条ACL。比如可以允许服务器的80端口通过TCP对外提供服务,也可以允许指定IP对服务器使用ICMP协议进行访问。