为 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 接口
开发人员文档¶
无
参考资料¶
端口安全扩展 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/extensions/portsecurity.py https://docs.google.com/document/d/18trYtq3wb0eJK2CapktN415FRIVasr7UkTpWn9mLq5M/edit
端口安全扩展数据库部分 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/portsecurity_db.py
描述 Cisco 设备的路由器服务插件设计 https://review.openstack.org/#/c/91071/
Brocade Vyatta L3 插件设计规范 https://review.openstack.org/#/c/101052/
端口安全 API 基类 https://blueprints.launchpad.net/neutron/+spec/port-security-api-base-class
Quantum 端口安全 https://docs.google.com/document/d/18trYtq3wb0eJK2CapktN415FRIVasr7UkTpWn9mLq5M/edit?pli=1
Neutron 防火墙反欺骗无法防止 ARP 欺骗 https://bugs.launchpad.net/neutron/+bug/1274034