为 ML2 插件和 IptablesFirewallDriver 添加端口安全扩展支持

https://blueprints.launchpad.net/neutron/+spec/ml2-ovs-portsecurity

本规范建议为 ML2 插件和 IptablesFirewallDriver 添加 portsecurity 扩展支持以匹配它。

问题描述

Neutron 的安全组始终在虚拟机上应用反欺骗规则。这允许流量在虚拟机上发起和终止,但阻止流量通过虚拟机。在虚拟机路由流量的情况下,这是必需的。为了在虚拟机实例中运行网络服务(例如,虚拟机中的路由器服务 [router_plugin_cisco][vyatta_l3_plugin] 或虚拟机中的防火墙服务),某些服务要求虚拟机能够接收/发送所有数据包,而端口上没有任何防火墙、安全组或反欺骗。这是在虚拟机内运行网络服务的基本要求。必要性取决于服务的类型。有些服务需要它,有些不需要。

此时,Neutron 具有一个端口安全扩展,用于禁用数据包过滤。([port_security_extension][port_security_extension_db])但目前,任何开源插件/防火墙驱动程序都不支持 portsecurity 扩展。本蓝图旨在将扩展支持添加到配置了 OVS 代理的 ML2 插件,并使用 IptablesFirewallDriver。

提议的变更

portsecurity 扩展的工作方式

NSX 插件的原始文档可以在 [port_security_base_class][quantum_port_security] 找到。该扩展为网络和端口资源添加了一个新的属性“port_security_enabled”。网络中的 port_security_enabled 用作端口创建时的默认属性值。当该属性设置为 True(默认情况下)时,行为与没有 portsecurity 扩展时相同,安全组和反欺骗将按原样工作。当该属性设置为 False 时,安全组和反欺骗在端口上被禁用,并且不允许对这些端口设置安全组或允许地址对。由于此功能与安全性相关,因此仅允许租户所有者设置/更改该属性。

一些说明

  • 网络的属性仅在端口创建时生效。更改网络的值后,已创建的端口不受影响。

  • 如果端口已与安全组关联,则尝试将 port_security_enabled 更改为 False 会导致错误。

  • 当 port_security_enabled = False 时,尝试设置安全组或允许地址对会产生错误

步骤

将端口安全扩展作为 ML2 扩展驱动程序添加。然后,在 IptablesFirewallDriver 中添加必要的功能。端口安全扩展已添加到 neutron 中。在 ml2 插件中实现此扩展将允许在使用 ml2 插件时根据需要启用/禁用端口上的过滤器。

ovs 代理增强的实现草图:OVS 网桥及其流规则用于路由数据包、推送/弹出 VLAN 标签和隧道。因此,不需要修改 openflow 规则。安全组/反欺骗通过 iptables 实现,iptables 使用名为 qbrxxx 的 linux 网桥。实际的防火墙驱动程序是 neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

  • $e<设备名称>链在 filter 表中用于 egress 数据包的安全组过滤

  • $i<设备名称>链在 filter 表中用于 ingress 数据包的安全组过滤

  • $s<设备名称>链在 filter 表中用于反欺骗。这仅部分起作用。未实现反 ARP 欺骗。为此,需要 ebtables。 [bug1274034] 注意:ARP 欺骗不在本次 BP 的范围内实现。

因此,这些链将被修改为 ACCEPT。或者,这些链的父链是 $sg-chain,它将数据包解复用到上述三个链。另一个选项是更改 $sg-chain 中的规则。

相关的网桥(以 ovs 插件为例)

+----+
| VM |
+----+
  |
+--------+   Linux bridge:
| qbrxxx |   firewall are realized here as iptables chains/rules, which
+--------+    will be modified in the implement of this spec
   |
+--------+   ovs bridge
| br-int |
+--------+
   |
+------------------+  ovs bridge
| br-tun/br-eth<N> |
+------------------+

数据模型影响

portsecuritybindings 和 networksecuritybindings 表将由 ml2 插件使用。这些表已经存在,将不进行修改,不会添加新表。可以在 neutron/db/portsecurity_db.py 中引用它们

REST API 影响

为了方便起见,在此引用端口安全扩展。此蓝图不会添加此 API,而是启用它。

网络的 port_security_enable 的默认值为 True,从该网络创建的端口的相同属性设置将继承此值。这意味着与没有此扩展的行为相同。对于现有端口(无论是否有安全组),行为与之前相同。当 port_security_enabled = False 时,安全组和反欺骗在端口上被禁用。尝试设置允许地址对属性会导致 AddressPairAndPortSecurityRequired 异常。

代码可以参考 neutron/extensions/portsecurity.py

安全影响

此功能对不小心的人来说很危险。应仅允许网络所有者使用,以避免危及其他人的网络。

通知影响

网络的 port_security_enabled 属性和端口的 port_security_enabled 属性将添加到相关的通知中。

其他最终用户影响

无,因为端口安全属性默认为 True,因此现有端口不受影响。

性能影响

OVS 代理可能会更重,因为其端口管理任务将得到增强。

IPv6 影响

其他部署者影响

开发人员影响

由于 ML2 插件将被更改为支持端口安全扩展作为一等公民。我们将使用当前框架在属性更改时通知 l2 代理。Iptables 防火墙驱动程序将被更新以添加/更新链以使数据包通过。

社区影响

来自各种供应商的 servicevm 渴望 portsecurity 扩展。

备选方案

可以编写文档,说明禁用安全性(或使用其他扩展,如允许地址对)以使用服务 YYY。但是,某些功能无法按端口方式禁用/启用,并且无法在创建/删除 Neutron 端口时自动完成。它缺乏灵活性。因此,简单的文档不起作用。

另一种选择是引入键控旋钮来分别控制安全组和反欺骗,而不是单个旋钮 port_security_enabled。该值将是字典

示例值

{'port_security_group_enabled': True,
 'port_anti_spoofing_enabled': True},
# dict value is adopted to allow more precise control for filtering in future
# e.g. 'port_filter_level': 1
{'all_filtering_enabled': False},
# all_filtering_enabled is special key to enable/disable all
# related filtering.
PORTSECURITY = 'port_security_enabled'
# or port_security_disabled to list only disabled filters
EXTENDED_ATTRIBUTES_2_0 = {
    'networks': {
        PORTSECURITY: {'allow_post': True, 'allow_put': True,
                       'validate': {}
                       'convert_to': attributes.convert_kvp_to_dict,
                       'enforce_policy': True,
                       'default': ATTR_NOT_SPECIFIED,
                       'is_visible': True},
    },
    'ports': {
        PORTSECURITY: {'allow_post': True, 'allow_put': True,
                       'convert_to': attributes.convert_kvp_to_dict,
                       'default': attributes.ATTR_NOT_SPECIFIED,
                       'enforce_policy': True,
                       'is_visible': True},
    }
}

另一种方法是在端口绑定扩展中添加一个新属性,例如“binding:profile”中的一个。但是,使用端口绑定扩展,只有管理员才能设置该属性,并且需要一种指定网络默认值的方法。

实现

在 ml2 插件中实现端口安全扩展。这引入了在创建或更新端口或网络时在 ml2 插件中启用/禁用 port_security_state 的能力。创建网络函数会将默认的 port_security_state 分配给在该网络中要创建的所有端口。

负责人

主要负责人
  • yalei-wang

  • Shweta P <shweta-ap05>

  • ijw-ubuntu (Ian Wells)

其他贡献者
  • yamahata (Isaku Yamahata)

  • rui-zang

工作项

(名称)表示任务分配。

  • 将 portsecurity 扩展作为 ML2 扩展驱动程序实现(Shweta 和 Isaku)** 如果需要,将依赖扩展转换为扩展驱动程序(Shweta 和 Isaku)

  • OVS 代理和 iptables 防火墙驱动程序修改(Yalei)

  • 测试(所有人)

依赖项

测试

tempest 将得到增强,以检查是否未应用安全组。即,用于端口安全扩展的 API 测试和用于功能测试的场景测试。* 创建/删除具有或不具有 port_security_enabled=True/False 的端口 * 尝试发送/接收被端口过滤过滤到其他端口的数据包 * 检查是否可以使用其他端口接收/发送数据包

Tempest 测试

将添加相关的场景测试。

功能测试

将添加必要的测试。

API 测试

port_security_extension 单元测试已添加到 repo 中。

文档影响

用户文档

API 和管理员指南将更新,以便包括 * 配置以在 ML2 OVS 驱动程序中启用 portsecurity 扩展 * 新属性和新的 CLI 接口

开发人员文档

参考资料