Cilium是如何防止常规网络攻击的?

最近一个影响许多Kubernetes CNI组件的漏洞被发现,这个漏洞通过让攻击pod发送假冒的IPv6 *“Router Advertisement”*数据包给主机工作节点,导致该节点将所有的IPv6网络流量路由到攻击pod(即“中间人攻击”)。幸运的是,对于Cilium的使用者,由于Cilium提供了许多内置默认的安全特性,其生产环境并没有受到该漏洞的影响。在这篇博文中,我们将讨论Cilium的默认特性是如何自动地防护常见类型的网络攻击的。在我们深入之前,先看看有关IPv4和IPv6的基础知识,以及它们是如何和漏洞联系起来的。

IPv4和IPv6基础

在IPv4中,当一个机器连到网络上,它能通过DHCP获取到网络配置信息(包括路由信息)。这个机器首先发送一个DHCPDISCOVER广播数据包到网络上的所有用户,正常的话,只有DHCP服务器返回一个DHCPOFFER数据包。然而,网络上的任何设备都能够被设置为监听DHCPDISCOVER数据包并返回一个应答数据包,这意味着存在一个竞态条件(决定客户端信任哪个DHCP服务器)。

类似于DHCP,网络中的一个IPv6主机能够通过NDP(Neighbor Discovery Protocol)机制获取到其路由和邻居节点的信息。一台机器能够向本地节点发送Router Solicitation数据包获取本地路由信息,或者路由主动发送一个Router Advertisement数据包到本地主机表示自己是IPv6流量的路由设备。这个Router Advertisement发送到一个特殊的IPv6地址(ff02::1)从而广播到所有节点,因而同一网络上的所有节点都能够接收到并信任这个数据包。在IPv6中有一些需要注意的改进,特别是link-local地址(用于领域发现协议和无状态自动配置进程中链路本地上节点之间的通信。使用链路本地地址作为源或目的地址的数据包不会被转发到其他链路上)的使用能够确保Router Advertisement数据包不会被路由到其他的链路并且只对本地节点可见。

link-local addresses: These addresses refer only to a particular physical link and are used for addressing on a single link for purposees such as automatic addresss configuration and neighbor discovery protocol. Link-local addresses can be used to reach the neighboring nodes attached to the same link. The nodes do not need a globally unique address to communicate. Routers will not forward datagram using link-local addresses. IPv6 routers must not forward packets that have link-local source or destination addresses to the other links. All IPv6 enabled interfaces have a link-local unicast address.

漏洞

通过发送欺诈性的router advertisements数据包,恶意的容器能够重新配置主机从而主机上的所有IPv6流量重定向到被攻击者控制的容器。

所有的支持IPv6的接口都有一个fe80::/10的网络地址,这意味着攻击pod能够使用自己的link-local地址作为Router Advertisement数据包的源IP地址。CAP_NET_RAW权限能允许kubernetes中的pod发送带有任意源IP地址和端口的数据包,可以通过kubectl exec命令查看是否具有该权限:kubectl exec -it ubuntu-pod -- capsh --print | grep cap_net_raw. 攻击pod通过发送Router Advertisement数据包到节点,使得节点将该pod看作路由并将部分或者所有的IPv6的流量直接发送到攻击pod中。

Cilium是如何防护的

Cilium有一些内置的和默认开启的安全特性从而提供对于上述漏洞的防护。

过滤ipv6数据包

在Cilium中设置enable-ipv6:false并且通过cilium monitor -t drop命令验证IPv6流量被Cilium Agent pod所丢弃。

IP欺诈防护

从上面可以看到,如果我们显式的禁用IPv6的流量,可以防护该漏洞,但是对于伪造的数据包呢,Cilium又是如何防护的呢?Cilium通过IP Address Management(IPAM)防止源IP地址伪造。

实践验证

伪造源IP地址

创建三个pod:

image-20201112165349724

这3个pod是连通的,从centostest可以ping通centostest1,我们使用scapy工具来测试一下:

image-20201112165722869

在centostest(IP地址为: 10.0.0.215)这个pod容器中运行scapy,发送一个源IP地址为自己,目的IP地址为centostest1(IP: 10.0.0.18)的正常ICMP请求数据包,可以看到收到了ICMP响应报文。

在centostest1中用tcpdump能够监听到的正常网络流量如下所示:

image-20201112170152721

接下来在centostest中发送包含伪造的源IP地址的ICMP请求报文(目的地址仍为centostest1的IP地址),伪造的源IP地址是centostest2的IP地址,可以看到此时没有响应:

image-20201112170605328

在centostest1上面也没有监听到ICMP请求数据包:

image-20201112170709854

因此,Cilium能够防护IP地址伪造攻击

ARP中间人攻击防范

ARP欺骗是非常常用的一种攻击手段,也成为ARP缓存投毒,一般用在中间人攻击里面,将攻击方伪造成网关(即网关的IP地址对应攻击方的MAC地址)。攻击步骤包括:

  • 先获取被攻击主机的MAC地址和网关的MAC地址;
  • 欺骗受害主机,使其认为自己是网关;
  • 欺骗网关,使其认为自己是受害主机;

在我们的攻击实验中,让centostest pod作为中间人监听centostest1与centostest2两个pod 的通信流量。结合上述攻击步骤,首先是让centostest pod获取到centostest1与centostest2的MAC地址,如下是执行的结果。

image-20201113110505125

可以看到,ARP请求返回的MAC地址都是62:db:0a:14:8d:4e,这个MAC地址是centostest这个pod的主机侧虚拟网卡的MAC地址,可以看到,arp请求经过了Cilium BPF程序的特殊处理,直接返回pod主机侧虚拟网卡的MAC地址,而不能正确获取到正确的MAC地址,因此Cilium能够防范ARP中间人攻击

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值