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