防火墙即服务 API 2.0¶
Launchpad蓝图
本规范为防火墙即服务 (FWaaS) API 引入了一些增强功能,包括使其更加精细化,允许用户在端口级别而不是路由器级别应用防火墙规则。支持扩展到各种类型的 Neutron 端口,包括虚拟机端口和 SFC 端口以及路由器端口。它还旨在提供更好的分组机制(防火墙组、地址组和服务组),并讨论使用通用分类器来实现这一点。虽然本规范正在提出 API,但实施将分阶段进行,具体取决于是否有人员进行工作。在 Mitaka 结束时,我们将拥有一个可用的参考实现,但它可能并不包含本规范中的所有增强功能。实施阶段将由一个适当的 RFE 跟踪,该 RFE 将本规范作为父规范进行引用。
问题描述¶
安全组 API 扩展是处理网络流量的一个知名 API。对于基本的流量过滤,安全组 API 已经被用户广泛理解,但随着云基础设施在企业中获得更广泛的应用,为公共云基础设施构建的安全组 API 对于企业内部的安全和网络环境而言已经不够用。
因此,每次部署 OpenStack 都会对安全组 API 进行一次性更改。一种解决方案是允许 OpenStack 的部署者“扩展”API 扩展,使其适应他们的安全和网络环境。理想情况下,防火墙即服务 API 是支持比基本“允许来自 X IP 到 Y 端口到我的虚拟机组的任何流量”更高级用例的 API。
但现有的防火墙即服务 API 在 Liberty 中已被弃用,因为它功能有限,需要进行大量增强才能涵盖社区提出的所有用例。FWaaS API 和 SG API 之间也存在一些重叠的功能,需要进行理清。
提议的变更¶
建议通过统一 FWaaS 和安全组的实现来协调 FWaaS 和安全组模型,但为两者保留单独的 API,同时依赖于通用的后端。本规范提出了一种增强的 FWaaS API,它集成了安全组功能,使得 FWaaS API 成为安全组 API 所暴露内容的超集。
相对于 FWaaS 1.0 API,FWaaS 2.0 API 提供了以下增强功能
粒度应用于 Neutron 端口,而不是租户范围或租户中的一组路由器。
适用于各种类型的 Neutron 端口,包括虚拟机端口和 SFC 端口以及路由器端口。通过在虚拟机端口上应用 FWaaS,将能够过滤东西向子网内流量以及东西向子网间流量和南北向流量。这还将允许 FWaaS 在使用 DVR 时过滤东西向流量,而 FWaaS 1.0 在 DVR 的情况下仅过滤南北向流量 [4],[5]。
允许对不同的方向(入站与出站)应用不同的防火墙策略和不同的防火墙规则。
引入了 Neutron 端口的防火墙组结构。这成为绑定防火墙策略和 Neutron 端口的关联点,也是指定防火墙规则中允许的源和目标的途径。这减少或消除了在防火墙规则中指定东西向流量流的 IP 地址的需要。例如,当防火墙组 A 作为防火墙组 B 中入站策略中的源防火墙组 ID 使用时,我们只关心与防火墙组 A 关联的端口。当数据包到达时,如果其源 IP 地址与防火墙组 A 中的一个端口的 IP 地址匹配,则会匹配。
通过地址组和服务组添加间接引用,允许将地址组和 L4 端口组指定一次并在多个规则和多个防火墙策略中重用。
允许将多个防火墙组关联到同一个 Neutron 端口。例如,应用于租户 Web 服务器的一个防火墙组可以指定一个防火墙策略,该策略限制流量到仅 HTTP(用于南北向流量),而应用于租户所有实例的另一个防火墙组可以指定一个防火墙策略,该策略允许源和目标在防火墙组中进行所有类型的流量(东西向流量)。
相对于安全组 API [7],FWaaS 2.0 API 提供了以下增强功能
为规则添加了一个显式操作属性,以便除了现有的“允许”操作之外,还可以指定“拒绝”和“驳回”操作。这对于指定防火墙策略以应用于租户或服务提供商的所有实例的网络或管理员而言尤其重要,无论应用程序如何。
允许基于源和目标地址前缀进行过滤,而不仅仅是远程(入站流量的源,出站流量的目标)地址前缀。
允许基于源和目标 L4 端口范围进行过滤,而不仅仅是目标 L4 端口范围。
通过防火墙组、地址组和服务组添加间接引用,允许用户和专家(如网络管理员)之间进行操作职责分离。专家可以在地址组中定义 IP 地址前缀组,并使用协议和源/目标端口定义服务组。然后,用户可以轻松定义引用防火墙组和服务的防火墙规则,而无需了解 IP 地址和 L4 端口。例如,可以定义一个名为 *All Web Server Ports* 的服务组,其协议为 TCP,目标 L4 端口为 80、8080 和 443。
为防火墙规则添加“描述”属性。
为防火墙规则添加“管理状态”属性。
添加一个“公共”属性,允许在不同项目之间共享防火墙规则。
防火墙组通过防火墙策略引用防火墙规则。特别是,这允许重用可供共享的防火墙策略,这些策略由多个防火墙组引用。
未来,预计服务组将支持深度包检测,以便可以基于应用程序 ID 和 L7 字段(如 URL 字符串)来匹配流量,而不是或除了 L4 端口范围之外。
FWaaS 和安全组之间的关系¶
FWaaS 和安全组仍然是单独的功能。将保留安全组 API,除了 FWaaS 2.0 API 之外,原因有两个。
保留现有安全组 API 的第一个原因是那些希望以尽可能接近非 OpenStack 安全组定义的方式利用现有功能的用户。
第二个原因是与“深度防御”有关,其中定义并应用了多个数据平面访问控制层。使用现有的 FWaaS 1.0 和安全组,周界防火墙功能在 FWaaS 中定义并在 OpenStack 路由器上强制执行,而应用程序防火墙功能通过安全组定义并在虚拟机端口上强制执行。为了从源到目标端到端传递,南北向流量和子网间流量都必须同时被 FWaaS 和安全组允许。
使用 FWaaS 2.0,即使 FWaaS 在虚拟机端口上强制执行,也必须保留“深度防御”。当 FWaaS 和安全组都与同一个 Neutron 端口关联时,数据包必须同时被两者允许,即“拒绝”在 FWaaS 和安全组之间获胜。采用这种行为是为了解决典型的用例,其中租户网络管理员使用 FWaaS 指定适用于所有租户实例的租户范围规则,而应用程序部署者使用安全组缩小允许的流量到仅特定应用程序所需的内容。
例如,网络管理员创建一个防火墙规则,该规则拒绝端口 25 流量。即使应用程序部署者创建一个允许端口 25 流量的安全组规则,端口 25 流量也将被拒绝。
请注意,与现有的 FWaaS 1.0 API 和安全组一样,默认情况下 OpenStack 策略不区分项目内的不同角色。默认 OpenStack 策略不会阻止同一项目中的不同用户(例如,应用程序部署者与租户网络管理员)访问 FWaaS API。这可能在未来的阶段中进行调查。
在未来的阶段,FWaaS 2.0 API 将得到增强,以便仅使用 FWaaS 2.0 API 可以定义多个“深度防御”层。这将允许应用程序部署者利用 FWaaS 2.0 相对于安全组的增强功能,同时保留“深度防御”。这还将允许超过 2 层“深度防御”,例如租户应用程序部署者、租户网络管理员和服务提供商网络管理员。
REST API 影响¶
防火墙地址组¶
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
地址组对象的唯一标识符。 |
name |
字符串 |
否 |
CRU |
地址组的人性化名称(限制为 255 个字符)。 不必唯一。 |
description |
字符串 |
否 |
CRU |
地址组的人性化描述(限制为 255 个字符)。 |
project_id |
uuid-str |
是 |
CR |
地址组的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。 |
cidrs |
列表 |
是 |
CRU |
cidr 和 IP 版本键值对的数组。 |
防火墙规则¶
请注意,与 FWaaS 1.0 一样,在 FWaaS 2.0 中防火墙规则始终使用有状态的连接跟踪。
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙规则对象的唯一标识符。 |
project_id |
uuid-str |
是 |
CR |
防火墙规则的所有者。只有管理员才能指定与其自身不同的项目标识符。 |
name |
字符串 |
否 |
CRU |
防火墙规则的人性化名称(255 个字符限制)。不必唯一。 |
description |
字符串 |
否 |
CRU |
防火墙规则的人性化描述(255 个字符限制)。 |
public |
Bool |
否 |
CRU |
设置为 True 会使此防火墙规则对其所有者以外的项目可见,并且可以用于不由其项目拥有的防火墙策略。 |
protocol |
字符串 |
否 |
CRU |
IP 协议。 |
source_port |
port-range |
否 |
CRU |
源端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。 |
destination_port |
port-range |
否 |
CRU |
目标端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。 |
service_group_id |
uuid-str |
否 |
CRU |
服务组的 UUID [6]。 |
ip_version |
Integer |
否 |
CRU |
IP 协议版本。 |
source_ip_address |
字符串 |
否 |
CRU |
源 IP 地址或 CIDR。 |
destination_ip_address |
字符串 |
否 |
CRU |
目标 IP 地址或 CIDR。 |
source_address _group_id |
uuid-str |
否 |
CRU |
当指定 source_address_group 时,如果数据包中的源 IP 地址与地址组中的一个 IP 地址匹配,则会匹配它。 |
destination_address _group_id |
uuid-str |
否 |
CRU |
当指定 destination_address_group 时,如果数据包中的目标 IP 地址与地址组中的一个 IP 地址匹配,则会匹配它。 |
source_firewall_group _id |
uuid-str |
否 |
CRU |
当指定 source_firewall_group 时,如果数据包中的源 IP 地址与防火墙组中的一个端口的 IP 地址匹配,则会匹配它。注意:当防火墙组包含虚拟机端口列表时,情况如此。 |
destination_firewall _group_id |
uuid-str |
否 |
CRU |
当指定 destination_firewall_group 时,如果数据包中的目标 IP 地址与防火墙组中的一个端口的 IP 地址匹配,则会匹配它。注意:当防火墙组包含虚拟机端口列表时,情况如此。 |
操作 |
字符串 |
否 |
CRU |
匹配规则的操作(ALLOW、DENY、REJECT)。默认值:DENY。 |
enabled |
Bool |
否 |
CRU |
设置为 False 会在防火墙策略中禁用此规则。便于在不将规则与防火墙策略分离的情况下选择性地关闭规则。默认值:True。 |
注意:source_ip_address、source_address_group_id 和 source_firewall_group_id 中最多只能指定一个。当数据包中的源 IP 地址与以下任何一个匹配时,规则匹配:source_ip_address、地址组中的一个 IP 地址或防火墙组中的一个端口的 IP 地址。如果您希望它匹配任何数据包,请将源或目标设置为 0.0.0.0/0 或 ::/0。同样适用于 destination_ip_address、destination_address_group_id 和 destination _firewall_group_id,相对于数据包中的目标 IP 地址。
注意:规则可以指定 service_group_id 或协议、source_port 和 destination_port 的任何组合的非空值。
防火墙策略¶
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙策略对象的唯一标识符。 |
project_id |
uuid-str |
是 |
CR |
防火墙策略的所有者。只有管理员才能指定与其自身不同的项目标识符。 |
name |
字符串 |
否 |
CRU |
防火墙策略的人性化名称(255 个字符限制)。不必唯一。 |
description |
字符串 |
否 |
CRU |
防火墙策略的人性化描述(255 个字符限制)。 |
firewall_rules |
列表 |
否 |
CRU |
这是防火墙规则 UUID 的有序列表。防火墙按它们出现的顺序应用规则。 |
audited |
Bool |
否 |
CRU |
当策略所有者设置为 True 时,表示已审核防火墙策略。每次更改防火墙策略或关联的防火墙规则时,此属性都将设置为 False,并且必须通过更新操作显式设置为 True。 |
public |
Bool |
否 |
CRU |
设置为 True 会使此防火墙策略对其所有者以外的项目可见。 |
防火墙组¶
防火墙组(类似于安全组)是 FWaaS 2.0 API 的核心结构。它们有两个目的
通过防火墙组/端口关联,它们指定是防火墙策略的强制执行点 Neutron 端口。
通过防火墙规则中的 source_firewall_group_id 和 destination_firewall _group_id,它们允许基于源和目标标识进行过滤,同时最大限度地减少指定大量 IP 地址的需要。
对于每个 source_firewall_group 和 destination_firewall_group,OpenStack 控制器将告诉 OpenStack FWaaS 代理与防火墙组关联的所有虚拟机端口的 IP 地址集。与防火墙组关联的路由器端口列表将按原样传递。
与安全组类似,对于每个项目,将自动创建一个名为“default”的防火墙组。除非明确与新的虚拟机端口分离,否则此默认防火墙组将与该项目中的所有新的虚拟机端口关联。这为租户网络管理员提供了一种定义适用于所有虚拟机端口的租户范围防火墙策略的方式,除非明确配置其他策略。默认防火墙组的默认防火墙规则是允许所有,即租户网络管理员必须显式定义防火墙策略和规则才能使默认防火墙组生效。例如,租户网络管理员可能希望拒绝连接到已知有害的某些 IP 地址,或拒绝使用特定的 L4 端口。选择这种行为是因为典型的部署将使用“深度防御”,应用程序部署者指定默认安全组,而租户网络管理员指定默认防火墙组。
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙组对象的唯一标识符。 |
name |
string |
否 |
CRU |
防火墙组的人性化名称(255 个字符限制)。不必唯一。 |
description |
string |
否 |
CRU |
防火墙组的人性化描述(255 个字符限制)。 |
project_id |
uuid-str |
是 |
CR |
防火墙组的所有者。只有管理员才能指定与其自身不同的项目标识符。默认值:从身份验证令牌派生。 |
ingress_firewall _policy_id |
uuid-str |
否 |
CRU |
如果未与任何防火墙策略关联,则为“null”。 |
egress_firewall _policy_id |
uuid-str |
否 |
CRU |
如果未与任何防火墙策略关联,则为“null”。 |
ports |
列表 |
否 |
CRU |
将与此防火墙组关联的 port_ids 列表。 |
列出地址组¶
列出地址组。
请求类型
GET端点
/fw/address_groups响应代码
成功
200
Error
Unauthorized(401)
示例列出地址组:JSON 请求
GET /v2.0/fw/address_groups.json
User-Agent: python-neutronclient
Accept: application/json
示例列出地址组:JSON 响应
{
"address_groups": [
{
"description": "",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ADDR_GP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
]
}
显示地址组详细信息¶
显示地址组详细信息。
请求类型
GET端点
/fw/address_groups/<address_group_id>响应代码
成功
200
Error
未授权(401), 禁止(403), 未找到 (404)
示例显示地址组:JSON 请求
GET /v2.0/fw/address_groups/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json
示例显示地址组:JSON 响应
{
"address_group": {
"description": "",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ADDR_GP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
}
创建地址组¶
创建地址组。
请求类型
POST端点
/fw/address_groups/响应代码
成功
201
Error
Unauthorized(401), Bad Request(400)
示例创建地址组:JSON 请求
POST /v2.0/fw/address_groups.json
User-Agent: python-neutronclient
Accept: application/json
{
"address_group": {
"name": "ADDR_GP_1",
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
}
示例创建地址组:JSON 响应
HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
"address_group": {
"description": "",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ADDR_GP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
}
更新地址组¶
更新地址组。
请求类型
PUT端点
/fw/address_groups/<address_group_id>响应代码
成功
200
Error
Unauthorized(401), Bad Request(400) Not Found(404)
示例更新地址组:JSON 请求
PUT /v2.0/fw/address_groups/41bfef97-af4e-4f6b-a5d3-4678859d2485.json
User-Agent: python-neutronclient
Accept: application/json
{
"address_group": {
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
}
示例更新地址组:JSON 响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"address_group": {
"description": "",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ADDR_GP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"cidrs": [
{"cidr": "132.168.4.12/24", "ip_version": 4},
{"cidr": "2001::db8::f00/64", "ip_version": 6}
]
}
}
删除地址组¶
删除地址组。
此操作不返回响应体。
请求类型
DELETE端点
/fw/address_groups/<address_group_id>响应代码
成功
204
Error
Unauthorized(401), Not Found(404) Conflict(409) 当在地址组使用时执行操作时,将返回 Conflict 错误响应。
示例删除地址组:JSON 请求
DELETE /v2.0/fw/address_groups/1be5e5f7-c45e-49ba-85da-156575b60d50.json
User-Agent: python-neutronclient
Accept: application/json
示例删除地址组:JSON 响应
HTTP/1.1 204 No Content
Content-Length: 0
列出防火墙规则¶
列出防火墙规则。
请求类型
GET端点
/fw/firewall_rules响应代码
成功
200
Error
Unauthorized(401)
示例 列出防火墙规则:JSON 请求
GET /v2.0/fw/firewall_rules.json
User-Agent: python-neutronclient
Accept: application/json
示例 列出防火墙规则:JSON 响应
{
"firewall_rules": [
{
"action": "ALLOW",
"description": "",
"service_group_id":"fe99d33c1-b472-44f9-8226-30dc4ffd45332",
"enabled": true,
"firewall_policy_id": "asd435dg3-b472-44f9-8226-30dc4ffd45332",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ALLOW_HTTP",
"position": 1,
"public": false,
"protocol": "tcp",
"source_port": null,
"destination_port": null,
"ip_version": 4,
"source_ip_address": null,
"destination_ip_address": null
"source_address_group_id": null,
"destination_address_group_id": null,
"source_firewall_group_id": "ds876h5t1-b472-44f9-8226-3087j9u953gh2",
"destination_firewall_group_id": "f98o6h5t1-b472-44f9-8226-3087j9u953gh2",
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
]
}
显示防火墙规则详情¶
显示防火墙规则详情。
请求类型
GET端点
/fw/firewall_rules/<firewall_rule_id>响应代码
成功
200
Error
未授权(401), 禁止(403), 未找到 (404)
示例 显示防火墙规则:JSON 请求
GET /v2.0/fw/firewall_rules/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json
示例 显示防火墙规则:JSON 响应
{
"firewall_rule": {
"action": "ALLOW",
"description": "",
"service_group_id":"fe99d33c1-b472-44f9-8226-30dc4ffd45332",
"enabled": true,
"firewall_policy_id": "asd435dg3-b472-44f9-8226-30dc4ffd45332",
"id": "9faaf49f-dd89-4e39-a8c6-101839aa49bc",
"name": "ALLOW_HTTP",
"position": 1,
"public": false,
"protocol": "tcp",
"source_port": null,
"destination_port": null,
"ip_version": 4,
"source_ip_address": null,
"destination_ip_address": null,
"source_address_group_id": null,
"destination_address_group_id": "f9876h5t1-b472-44f9-8226-3087j9u953gh2",
"source_firewall_group_id": "ds876h5t1-b472-44f9-8226-3087j9u953gh2",
"destination_firewall_group_id": null,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
创建防火墙规则¶
创建一个防火墙规则。
请求类型
POST端点
/fw/firewall_rules/响应代码
成功
201
Error
Unauthorized(401), Bad Request(400)
示例 创建防火墙规则:JSON 请求
POST /v2.0/fw/firewall_rules.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_rule": {
"action": "ALLOW",
"destination_address_group_id": "f9876h5t1-b472-44f9-8226-3087j9u953gh2"
"service_group_id": "d2876h5t1-b472-44f9-8245-308dr4u953gh2"
"enabled": true,
"name": "ALLOW_HTTP"
}
}
示例 创建防火墙规则:JSON 响应
HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
"firewall_rule": {
"action": "ALLOW",
"description": "",
"service_group_id": "d2876h5t1-b472-44f9-8245-308dr4u953gh2"
"enabled": true,
"firewall_policy_id": null,
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "ALLOW_HTTP",
"position": 1,
"public": false,
"protocol": "tcp",
"source_port": null,
"destination_port": null,
"ip_version": 4,
"source_ip_address": null,
"destination_ip_address": null,
"source_address_group_id": null,
"destination_address_group_id": "f9876h5t1-b472-44f9-8226-3087j9u953gh2",
"source_firewall_group_id": "ds876h5t1-b472-44f9-8226-3087j9u953gh2",
"destination_firewall_group_id": null,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
更新防火墙规则¶
更新一个防火墙规则。
请求类型
PUT端点
/fw/firewall_rules/<firewall_rule_id>响应代码
成功
200
Error
Unauthorized(401), Bad Request(400) Not Found(404)
示例 更新防火墙规则:JSON 请求
PUT /v2.0/fw/firewall_rules/41bfef97-af4e-4f6b-a5d3-4678859d2485.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_rule": {
"public": "true"
}
}
示例 更新防火墙规则:JSON 响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"firewall_rule": {
"action": "ALLOW",
"description": "",
"service_group_id": "d2876h5t1-b472-44f9-8245-308dr4u953gh2"
"enabled": true,
"firewall_policy_id": null,
"id": "41bfef97-af4e-4f6b-a5d3-4678859d2485",
"name": "ALLOW_HTTP",
"position": 1,
"public": true,
"protocol": "tcp",
"source_port": null,
"destination_port": null,
"ip_version": 4,
"source_ip_address": null,
"destination_ip_address": null,
"source_address_group_id": null,
"destination_address_group_id": "f9876h5t1-b472-44f9-8226-3087j9u953gh2",
"source_firewall_group_id": "ds876h5t1-b472-44f9-8226-3087j9u953gh2",
"destination_firewall_group_id": null,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
删除防火墙规则¶
删除一个防火墙规则。
此操作不返回响应体。
请求类型
DELETE端点
/fw/firewall_rules/<firewall_rule_id>响应代码
成功
204
Error
未授权(401), 未找到(404) 冲突(409) 当防火墙规则正在使用时,将返回冲突错误响应。
示例 删除防火墙规则:JSON 请求
DELETE /v2.0/fw/firewall_rules/1be5e5f7-c45e-49ba-85da-156575b60d50.json
User-Agent: python-neutronclient
Accept: application/json
示例 删除防火墙规则:JSON 响应
HTTP/1.1 204 No Content
Content-Length: 0
列出防火墙策略¶
列出防火墙策略。
请求类型
GET端点
/fw/firewall_policies响应代码
成功
200
Error
未授权(401), 禁止(403)
示例 列出防火墙策略:JSON 请求
GET /v2.0/fw/firewall_policies.json
User-Agent: python-neutronclient
Accept: application/json
示例 列出防火墙策略:JSON 响应
{
"firewall_policies": [
{
"audited": false,
"description": "",
"firewall_rules": [
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": false,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
]
}
显示防火墙策略详情¶
显示防火墙策略详情。
请求类型
GET端点
/fw/firewall_policies/<firewall_policy_id>响应代码
成功
200
Error
未授权(401), 未找到(404)
示例 显示防火墙策略:JSON 请求
GET /v2.0/fw/firewall_policies/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json
示例 显示防火墙策略:JSON 响应
{
"firewall_policy": {
"audited": false,
"description": "",
"firewall_rules": [
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": false,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
创建防火墙策略¶
创建一个防火墙策略。
请求类型
POST端点
/fw/firewall_policies响应代码
成功
201
Error
Unauthorized(401)
示例 创建防火墙策略:JSON 请求
POST /v2.0/fw/firewall_policies.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_policy": {
"firewall_rules": [
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"name": "test-policy"
}
}
示例 创建防火墙策略:JSON 响应
HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
"firewall_policy": {
"audited": false,
"description": "",
"firewall_rules": [
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": false,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
更新防火墙策略¶
更新一个防火墙策略。
请求类型
PUT端点
/fw/firewall_policies/<firewall_policy_id>响应代码
成功
200
Error
Unauthorized(401), Not Found (404)
示例 更新防火墙策略:JSON 请求
PUT /v2.0/fw/firewall_policies/41bfef97-af4e-4f6b-a5d3-4678859d2485.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_policy": {
"firewall_rules": [
"a08ef905-0ff6-4784-8374-175fffe7dade",
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
]
}
}
示例 更新防火墙策略:JSON 响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"firewall_policy": {
"audited": false,
"description": "",
"firewall_rules": [
"a08ef905-0ff6-4784-8374-175fffe7dade",
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": false,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
}
删除防火墙策略¶
删除一个防火墙策略。
请求类型
DELETE端点
/fw/firewall_policies/<firewall_policy_id>响应代码
成功
204
Error
未授权(401), 未找到(404) 冲突(409) 当防火墙策略正在使用时,将返回冲突错误响应。
示例 删除防火墙策略:JSON 请求
DELETE /v2.0/fw/firewall_policies/1be5e5f7-c45e-49ba-85da-156575b60d50.json
User-Agent: python-neutronclient
Accept: application/json
示例 删除防火墙策略:JSON 响应
HTTP/1.1 204 No Content
Content-Length: 0
将防火墙规则插入防火墙策略¶
将防火墙规则插入防火墙策略,相对于其他规则的位置。
请求类型
PUT端点
/fw/firewall_policies/<firewall_policy_id>\ /insert_rule响应代码
成功
200
Error
未授权(401), 未找到(404) 错误请求(400) 当缺少规则信息时,将返回错误请求错误响应,冲突(409)
示例 将防火墙规则插入防火墙策略:JSON 请求
PUT /v2.0/fw/firewall_policies/41bfef97-af4e-4f6b-a5d3-4678859d2485/insert_rule.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_rule_id": "7bc34b8c-8d3b-4ada-a9c8-1f4c11c65692",
"insert_after": "a08ef905-0ff6-4784-8374-175fffe7dade",
"insert_before": ""
}
示例 将防火墙规则插入防火墙策略:响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"audited": false,
"description": "",
"firewall_rules": [
"a08ef905-0ff6-4784-8374-175fffe7dade",
"7bc34b8c-8d3b-4ada-a9c8-1f4c11c65692",
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": False,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
注意
insert_before 和 insert_after 参数引用已经与防火墙策略关联的防火墙规则 UUID。 firewall_rule_id 引用要插入的规则的 UUID。 使用“insert_after”时,如果指定规则之后有任何规则,它们将向下移动一个位置。 使用“insert_before”时,从指定规则开始的所有规则都将向下移动一个位置。 insert_after 或 insert_before 只能有一个非空,如果两者都未指定,则 firewall_rule 将插入到第一个位置。
从防火墙策略中删除防火墙规则¶
从防火墙策略中删除防火墙规则。
请求类型
PUT端点
/fw/firewall_policies/<firewall_policy_id>\ /remove_rule响应代码
成功
200
Error
未授权(401), 未找到(404) 错误请求(400) 当缺少规则信息时,或者尝试从其未关联的防火墙策略中删除防火墙规则时,将返回错误请求错误响应。
示例 从防火墙策略中删除防火墙规则:JSON 请求
PUT /v2.0/fw/firewall_policies/41bfef97-af4e-4f6b-a5d3-4678859d2485/remove_rule.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_rule_id": "7bc34b8c-8d3b-4ada-a9c8-1f4c11c65692"
}
示例 从防火墙策略中删除防火墙规则:JSON 响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"audited": false,
"description": "",
"firewall_rules": [
"a08ef905-0ff6-4784-8374-175fffe7dade",
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"id": "c69933c1-b472-44f9-8226-30dc4ffd454c",
"name": "test-policy",
"public": false,
"project_id": "45977fa2dbd7482098dd68d0d8970117"
}
列出防火墙组¶
列出防火墙组。
请求类型
GET端点
/fw/firewall_groups响应代码
成功
200
Error
Unauthorized(401)
示例 列出防火墙组:JSON 请求
GET /v2.0/fw/firewall_groups.json
User-Agent: python-neutronclient
Accept: application/json
示例 列出防火墙组:JSON 响应
{
"firewall_groups": [
{
"description": "",
"ingress_firewall_policy_id": null,
"egress_firewall_policy_id": null,
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "FW_GROUP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"ports":[
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
}
]
}
显示防火墙组详情¶
显示防火墙组详情。
请求类型
GET端点
/fw/firewall_groups/<firewall_group_id>响应代码
成功
200
Error
未授权(401), 禁止(403), 未找到 (404)
示例 显示防火墙组:JSON 请求
GET /v2.0/fw/firewall_groups/9faaf49f-dd89-4e39-a8c6-101839aa49bc.json
User-Agent: python-neutronclient
Accept: application/json
示例 显示防火墙组:JSON 响应
{
"firewall_group": {
"description": "",
"ingress_firewall_policy_id": null,
"egress_firewall_policy_id": null,
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "FW_GROUP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"ports":[
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
}
}
创建防火墙组¶
创建一个防火墙组。
请求类型
POST端点
/fw/firewall_groups/响应代码
成功
201
Error
Unauthorized(401), Bad Request(400)
示例 创建防火墙组:JSON 请求
POST /v2.0/fw/firewall_groups.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_rule": {
"ports":[
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
"name": "FW_GROUP_1"
}
}
示例 创建防火墙组:JSON 响应
HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
{
"firewall_group": {
"description": "",
"ingress_firewall_policy_id": null,
"egress_firewall_policy_id": null,
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "FW_GROUP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"ports":[
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
}
}
更新防火墙组¶
更新一个防火墙组。
请求类型
PUT端点
/fw/firewall_groups/<firewall_group_id>响应代码
成功
200
Error
Unauthorized(401), Bad Request(400) Not Found(404)
示例 更新防火墙组:JSON 请求
PUT /v2.0/fw/firewall_groups/41bfef97-af4e-4f6b-a5d3-4678859d2485.json
User-Agent: python-neutronclient
Accept: application/json
{
"firewall_group": {
"ingress_firewall_policy_id": "f5876h5t1-b472-44f9-8245-308dr4u953gh2",
"egress_firewall_policy_id": "dg476h5t1-b472-44f9-8245-308dr4u953gh2"
}
}
示例 更新防火墙组:JSON 响应
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"firewall_group": {
"description": "",
"ingress_firewall_policy_id": "f5876h5t1-b472-44f9-8245-308dr4u953gh2",
"egress_firewall_policy_id": "dg476h5t1-b472-44f9-8245-308dr4u953gh2",
"id": "8722e0e0-9cc9-4490-9660-8c9a5732fbb0",
"name": "FW_GROUP_1",
"project_id": "45977fa2dbd7482098dd68d0d8970117",
"ports":[
"8722e0e0-9cc9-4490-9660-8c9a5732fbb0"
],
}
}
删除防火墙组¶
删除一个防火墙组。
此操作不返回响应体。
请求类型
DELETE端点
/fw/firewall_groups/<firewall_group_id>响应代码
成功
204
Error
未授权(401), 未找到(404)
示例 删除防火墙组:JSON 请求
DELETE /v2.0/fw/firewall_groups/1be5e5f7-c45e-49ba-85da-156575b60d50.json
User-Agent: python-neutronclient
Accept: application/json
示例 删除防火墙组:JSON 响应
HTTP/1.1 204 No Content
Content-Length: 0
数据模型影响¶
以下是上述 REST API 的后端数据库表。
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
地址组对象的唯一标识符。 |
name |
字符串 |
否 |
CRU |
地址组的人性化名称(限制为 255 个字符)。 不必唯一。 |
description |
字符串 |
否 |
CRU |
地址组的人性化描述(限制为 255 个字符)。 |
project_id |
uuid-str |
是 |
CR |
地址组的所有者。 只有管理员用户才能指定与其自身不同的项目标识符。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
地址组对象的唯一标识符。 |
firewall_address _group_id |
uuid-str |
否 |
CRU |
防火墙地址组的 UUID。 |
cidr |
字符串 |
否 |
CRU |
必须与防火墙地址组关联的 CIDR。 |
ip_version |
Integer |
否 |
CRU |
cidr 的 IP 协议版本。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙规则对象的唯一标识符。 |
project_id |
uuid-str |
是 |
CR |
防火墙规则的所有者。只有管理员才能指定与其自身不同的项目标识符。 |
name |
字符串 |
否 |
CRU |
防火墙规则的人性化名称(255 个字符限制)。不必唯一。 |
description |
字符串 |
否 |
CRU |
防火墙规则的人性化描述(255 个字符限制)。 |
public |
Bool |
否 |
CRU |
设置为 True 会使此防火墙规则对其所有者以外的项目可见,并且可以用于不由其项目拥有的防火墙策略。 |
protocol |
字符串 |
否 |
CRU |
IP 协议。 |
source_port |
port-range |
否 |
CRU |
源端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。 |
destination_port |
port-range |
否 |
CRU |
目标端口号或范围([1, 65535] 中的整数或 a:b 中的范围)。 |
service_group_id |
uuid-str |
否 |
CRU |
服务组的 UUID [6]。 |
ip_version |
Integer |
否 |
CRU |
IP 协议版本。 |
source_ip_address |
字符串 |
否 |
CRU |
源 IP 地址或 CIDR。 |
destination_ip_address |
字符串 |
否 |
CRU |
目标 IP 地址或 CIDR。 |
source_address _group_id |
uuid-str |
否 |
CRU |
当指定 source_address_group 时,如果数据包中的源 IP 地址与地址组中的一个 IP 地址匹配,则会匹配它。 |
destination_address _group_id |
uuid-str |
否 |
CRU |
当指定 destination_address_group 时,如果数据包中的目标 IP 地址与地址组中的一个 IP 地址匹配,则会匹配它。 |
source_firewall_group _id |
uuid-str |
否 |
CRU |
当指定 source_firewall_group 时,当数据包中的源 IP 地址与防火墙组中的一个端口的 IP 地址匹配时,将进行匹配。 |
destination_firewall _group_id |
uuid-str |
否 |
CRU |
当指定 destination_firewall_group 时,当数据包中的目标 IP 地址与防火墙组中的一个端口的 IP 地址匹配时,将进行匹配。 |
操作 |
字符串 |
否 |
CRU |
匹配规则的操作(ALLOW、DENY、REJECT)。默认值:DENY。 |
enabled |
Bool |
否 |
CRU |
设置为 False 会在防火墙策略中禁用此规则。便于在不将规则与防火墙策略分离的情况下选择性地关闭规则。默认值:True。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙策略对象的唯一标识符。 |
project_id |
uuid-str |
是 |
CR |
防火墙策略的所有者。只有管理员才能指定与其自身不同的项目标识符。 |
name |
字符串 |
否 |
CRU |
防火墙策略的人性化名称(255 个字符限制)。不必唯一。 |
description |
字符串 |
否 |
CRU |
防火墙策略的人性化描述(255 个字符限制)。 |
audited |
Bool |
否 |
CRU |
当策略所有者设置为 True 时,表示已审核防火墙策略。每次更改防火墙策略或关联的防火墙规则时,此属性都将设置为 False,并且必须通过更新操作显式设置为 True。 |
public |
Bool |
否 |
CRU |
设置为 True 会使此防火墙策略对其所有者以外的项目可见。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
firewall_policy_rules 对象的唯一标识符。 |
firewall_policy_id |
uuid-str |
否 |
CRU |
防火墙策略的 UUID。 |
firewall_rule_id |
uuid-str |
否 |
CRU |
防火墙规则的 UUID。 |
position |
Integer |
否 |
CRU |
这是一个分配给此规则的属性,当该规则与防火墙策略关联时。 它指示该规则在该防火墙策略中的位置。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid-str |
N/A |
R |
防火墙组对象的唯一标识符。 |
name |
string |
否 |
CRU |
防火墙组的人性化名称(255 个字符限制)。不必唯一。 |
description |
string |
否 |
CRU |
防火墙组的人性化描述(255 个字符限制)。 |
project_id |
uuid-str |
是 |
CR |
防火墙组的所有者。只有管理员才能指定与其自身不同的项目标识符。默认值:从身份验证令牌派生。 |
ingress_firewall _policy_id |
uuid-str |
否 |
CRU |
如果未与任何防火墙策略关联,则为“null”。 |
egress_firewall _policy_id |
uuid-str |
否 |
CRU |
如果未与任何防火墙策略关联,则为“null”。 |
属性 |
类型 |
必需 |
CRUD |
描述 |
|---|---|---|---|---|
id |
uuid |
N/A |
R |
firewall_group_port 对象的唯一标识符。 |
firewall_group_id |
uuid |
否 |
CRU |
防火墙组的 UUID。 |
port_id |
uuid |
否 |
CRU |
将与此 firewall_group 关联的端口的 UUID。 它可以是任何 Neutron 端口(VM 端口、路由器端口、SFC 端口)。 |
多个防火墙策略¶
当只有一个防火墙组与特定的 Neutron 端口关联时,防火墙规则将根据其位置按顺序进行评估。 “允许”和“拒绝”规则可以以任何顺序交错,第一次匹配决定要采取的操作。
FWaaS 2.0 API 允许将多个防火墙组关联到同一个 Neutron 端口。 例如,应用于租户 Web 服务器的一个防火墙组可能指定一个防火墙策略,该策略限制流量到仅 HTTP(用于南北流量),而另一个应用于所有租户实例的防火墙组可能指定一个防火墙策略,该策略允许防火墙组中源和目标之间的所有流量类型(东西流量)。
当有多个防火墙组与特定的 Neutron 端口关联时,不同防火墙组之间没有位置或优先级。 必须定义一些确定性行为,以便在某些防火墙组确定“允许”操作,而其他防火墙组确定“拒绝”操作时,解决要采取的操作。
此规范定义,如果与该 Neutron 端口关联的任何一个防火墙组允许该数据包,则数据包将被允许。 这种行为类似于与同一 VM 端口关联的多个安全组的情况。
在未来的阶段,将提出新的结构,以便在某些情况下,允许由一个防火墙组确定的“拒绝”操作覆盖由另一个防火墙组确定的“允许”操作,具体取决于防火墙组与 Neutron 端口的关联方式。 有关详细信息,请参阅 [3] 中的“Stratum”部分。
安全影响¶
待定。
通知影响¶
无。
其他最终用户影响¶
在 DVR 的情况下,非面向北方的路由器端口将不受支持。 DVR 数据平面的东西流量的非对称设计阻止了使用连接跟踪,这对于正确的 FWaaS 操作至关重要。 为了将 FWaaS 应用于东西流量,解决方法是在 VM 端口而不是路由器端口强制执行 FWaaS。 在 VM 端口强制执行 FWaaS似乎与 DVR 的分布式架构更加一致,无论这种限制如何。
性能影响¶
待定。
IPv6 影响¶
无
其他部署者影响¶
我们需要新的 Heat 模型。
开发人员影响¶
无。
社区影响¶
无。
备选方案¶
无。
实现¶
负责人¶
Aishwarya Thangappa
Chandan Dutta Chowdhury
German Eichberger
James Ardent
Mickey Spiegel
Nate Johnston
Sarath Chandra Mekala
Shweta Padubidri
Sridhar Kandaswamy
工作项¶
REST API
DB Schema
CLI 更新
依赖项¶
依赖于服务组 [6]
测试¶
Tempest 测试¶
DB mixin 和模式测试
FWaaS 插件与模拟驱动程序端到端测试
Tempest 测试
CLI 测试
功能测试¶
需要编写新的测试
API 测试¶
REST API 和属性验证测试
文档影响¶
用户文档¶
Neutron CLI 和 FWaaS API 文档需要修改。
开发人员文档¶
neutron-fwaas 仓库将有一个 devref 并将编写文档。
参考资料¶
[1] https://openstack.org/summit/tokyo-2015/videos/presentation/openstack-neutron-fwaas-roadmap
[2] https://etherpad.openstack.org/p/mitaka-neutron-next-adv-services
[3] https://etherpad.openstack.org/p/fwaas-api-evolution-spec
[4] https://etherpad.openstack.org/p/FWaaS_with_DVR
[5] https://bugs.launchpad.net/neutron/+bug/1513574
[6] https://specs.openstack.org/openstack/neutron-specs/specs/kilo/service-group.html
[7] https://developer.openstack.org/api-ref-networking-v2-ext.html#security_groups