跳转到: 导航, 搜索

OSSN/OSSN-0069


宿主机通过IPv6暴露给租户网络

总结

Neutron创建的新接口在默认命名空间中创建时,没有禁用IPv6链路本地地址。这导致实例获得直接访问宿主机的能力,从而破坏了客户隔离。

在Linux中,链路本地IPv6地址被分配给所有活动接口,与IPv4地址不同,后者需要管理员显式配置每个接口。这导致在接口启用和附加到桥接设备之间存在一个时间窗口。在此时间窗口内,租户网络可以访问宿主机。

现在,Neutron和Nova都会在启动任何链路之前自动禁用IPv6,但是操作员仍然应该意识到重新启用IPv6链路本地地址相关的安全风险。

受影响的服务 / 软件

Nova, Neutron, networking-midonet, Kilo, Liberty

讨论

Linux为所有活动接口分配链路本地IPv6地址,这与IPv4地址不同,后者需要管理员显式配置每个接口。一旦接口被绑定到桥接,分配给它的所有地址都会被忽略,并且只有桥接上的地址是活动的。它们通过LinuxBridgeManager调用暴露给`ensure_vlan`和`ensure_vxlan`,在创建新的VLAN或VXLAN接口之前,将接口绑定到桥接。

现在,Neutron和Nova在启动接口之前都会禁用所有接口上的IPv6。这避免了在接口启用和附加到桥接设备之间暴露一个时间窗口,在此期间,租户网络可以访问宿主机。

建议的操作

在接口启动链路之前,IPv6应保持禁用状态。如果操作员出于任何原因需要重新启用链路本地IPv6地址,他们应意识到允许租户网络访问宿主机的安全影响。

现在使用interface.py中的root_dev.disable_ipv6()默认禁用IPv6,该方法调用common.ip_utils.is_enabled()方法

我们可以使用以下命令验证sysctl.conf中IPv6参数的值

 $ sysctl -a | grep disable | grep ipv6

值`0`表示IPv6已启用,`1`表示已禁用。

 net.ipv6.conf.default.disable_ipv6 = 1
 net.ipv6.conf.$IFACE.disable_ipv6 = 1

这里,$IFACE指的是Neutron中默认禁用IPv6的接口。

注意:在/proc/sys/net/ipv6/conf/$IFACE/disable_ipv6中设置的值等同于sysctl.conf中的net.ipv6.conf.$IFACE.disable_ipv6

联系方式 / 参考文献

作者:Vinay Potluri, Intel & Luke Hinds, Red Hat

此OSSN : https://wiki.openstack.org/wiki/OSSN/OSSN-0069

原始LaunchPad Bug : https://bugs.launchpad.net/ossn/+bug/1534652

此问题在https://bugs.launchpad.net/Neutron/+bug/1459856中被引用

Nova中解决的相关问题:https://review.openstack.org/#/c/313070/

OpenStack Security ML : openstack-dev@lists.openstack.org

OpenStack Security Group:https://launchpad.net/~openstack-ossg