初识微隔离与Cilium
1. 微隔离
最近学习了一番cilium与微隔离,此文以作记录。
对于微隔离,似乎并没有什么比较正式的文档来说明它,而在 cilium 、calio 这些最流行的云原生网络安全产品也未有提及,所以笔者根据自己了解的解释一下。
1.1 微隔离释意
在传统的主机网络环境中,用户会通过划分网络区域来进行网络隔离、网络控制,网络区域之间可能还会有防火墙。此后的流行架构是通过虚拟机部署业务,该阶段使用VLAN、SDN等技术实现网络隔离,传统防火墙厂商也发布虚拟防火墙产品试图覆盖这些场景。(备注:在攻防人员眼中防火墙是规则引擎下的流量防护产品,但其最传统的能力是网络管控这块)
我们先来了解以下云原生的的相关理念,这也是理解微隔离的前提,云原生下:
- 底层基础设施环境:可编程的、动态的 基础设施,表现为 私有云、公有云、混合云 等形式;
- 应用架构强调分布式:松耦合、高弹性、高容错
- 应用生命周期更高效:业务方只需要关注应用本身,开发与交付方式表现为 快速迭代、稳定交付、自动化 …
在很长的一段时间里,很多公司的部分应用环境在架构上转到了云原生,但为了方便维护网络,k8s集群下的网络模式还是主机网络(或说flat network),这也使得攻击者获取pod权限后可以在k8s网络中畅游,可随意访问其他pod、node、apiserver ..
云原生是开放的,相关概念也是开放的,对于微隔离(Microsegmentation)我们可以做如下考量:
- 能理解业务,根据业务进行网络隔离
- 便于操作、便于维护的:如 UI(根据过滤条件展现网络通路)、自动化网络探测
- 兼容性?部署方式?
- not only L3/4 ? 支持L7,支持 service mesh?:微隔离是否需要覆盖L7 、service mesh,还尚有疑虑,笔者暂时对业务在云原生的应用不是很清楚。只是在了解cilium后,不免让人认为微隔离与服务网格在技术架构上可一体。
1.2 隔离方案
在云原生架构下的这些思想理念使得应用与IP地址的关联降低(POD形式、应用可扩展),VLAN(VXLAN)则是k8s集群网络的基础架构(CNI插件overlay networks)。所以,通过IP进行隔离在理论上是可以的,但不太聪明:大量动态的pod使得路由表的维护十分困难,且网络抖动很大,或者要让IP分配服从隔离策略。通过VXLAN一类的技术来进行网络隔离,POD创建时自动划分进入相应的VLAN,这个方案则好像可行。
笔者粗浅地了解到有如下微隔离方案:
- k8s network-policy:k8s中可配置 L3/4 的网络策略,识别方式包括 IP、namespace、pod标签,但只提供API配置方式(用户端表现为配置文件),原生下维护麻烦,相关开源方案有 calico。
- Overlay Network:通过VXLAN一类的方式来隔离各个网络,某公司产品就是使用这个方案(从片语介绍来看),而这个方案让人感觉是上个时代的东西,这个方案也应该被很多商业公司采纳,而上个时代也是商业公司的天下,这块未看到开源产品。这个方案下的网络隔离 “细粒度” 比较有限,只能根据 pod、namespace 的相关标签将他们划分到不同LAN中,至于其他方面是否有缺陷 笔者也不知晓 。
- eBPF:cilium团队在协助linux内核团队将eBPF完善至成熟后,在18年开始发力开发cilium。eBPF好比javascript引擎,通过它我们可以实现 灵活的 、细粒度的 网络隔离策略,且性能十分优异(cilium calcio下层也使用VXLAN方式连接节点网络,这种情况下对比上面的方案不好说),在eBPF层面,我们还能实现很多功能,相关的开源方案有 cilium calico。
cilium 、calico都支持eBPF,calico 在2020年v3.13 版本开始跟进 eBPF 方案,而其原本是支持k8s network-policy的,可见时代潮流。而目前二者都有UI功能,另外 cilium 十分火爆(1.14.0版本相关contributor就有169位,十分骇人),相对功能也更完善。
2. 初识cilium
2.1 introduction to cilium
官网对cilium有一些介绍,关于eBPF你也可以查询what is ebpf进行了解。
cilium是云原生下的下一代网络安全产品,基于eBPF这一强大的内核机制,我们能“看到任何东西,做任何事情”,这是一次变革。
今天的语境下,我们谈及BPF(Berkeley Packet Filter)时默认指的eBPF,旧有的BPF概念被称为 classic BPF(cBPF),由于BPF能力不局限于网络包这块,其名称也失去了原本的意义,但这个机制延续了BPF这一称呼,我们也不必纠结于该名称。
在以前,你在内核中发布一个新特性,你需要10-15年来推动这件事情,而如今通过eBPF你可以 以类似JavaScript的方式在内核中执行你的代码。当然,eBPF不是万能的,诸如CPU密集型的处理(包加解密)、L7协议 都不适合直接使用eBPF来处理,eBPF中常用的技术是 tc (traffic control) 、XDP (eXpress Data Path) 。在今天,eBPF的使用其实已经是工业界的一个成熟方案,如安卓手机计算各APP的流量使用情况、,facebook所用的DDOS的防护等等,你看不到它,但你日常生活中可能经常使用到它。
cilium并不是遵从k8s的技术规范,cilium比较重要的概念之一就是 endpoint:endpoint 可以是 虚拟机 、linux cgroup 、namesapce 或其他,cilium能管理任何表现为 cgroup 、网络设备 的东西,简而言之 endpoint是任何带有IP的或能被寻址的。
hubble是cillium中的可视化组件,在开发之初是与cilium独立的,所以二者的名称没有什么关联。开发者将网络中的数据比作银河中的星际、星星,而hubble就是这么一个工具帮助我们观测了解这些数据。
2.2 install k3s & cilium
cilium建议内核版本大于4.9,因此我们选择ubuntu 来进行安装,通过k3s我们能在几分钟内就完成k8s集群的安装,之后参考cilium文档安装cilium即可。
1 | root@master:/home/test# uname -a |
k3s
安装k3s https://docs.k3s.io/zh/quick-start
1 | root@master:/home/test# curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_EXEC='--flannel-backend=none --disable-network-policy' INSTALL_K3S_MIRROR=cn sh - |
1 | root@master:/home/test# cat /var/lib/rancher/k3s/server/node-token |
1 | root@node01:/home/test# MYSERVER=192.168.128.131 |
设置k8s配置路径变量,cilium会用到,建议添加到 /etc/profile 文件中,避免重启丢失:
1 | export KUBECONFIG=/etc/rancher/k3s/k3s.yaml |
cilium
参考 https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli
首先下载最新release版本的cilium cli
1 | CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt) |
通过cli安装cilium,这个过程会pull一系列的镜像,我们需要耐心等待:安装过程中将部署相关的 DaemonSet,以及启动agent
1 | root@master:/home/test# cilium install |
通过status命令查看cilium的安装状态,如果出现error,则查看相关pods是否都是running状态,等待pods状态为running后再检查status情况
1 | root@master:/home/test# cilium status |
如果pod都运行正常,但依然有error,将cilium重装即可
1 | cilium uninstall |
可跳过,测试网络运行情况(这个只能在没有网络策略、没有pod 的namespace 中运行,默认为 cilium-test ,功能只是测试网络是否正常)
1 | cilium connectivity test |
pod在cilium视角下表现为endpoint,如果你的 endpoint list只有一两个,说明你的cilium未安装正确:
1 | root@master:/home/test# kubectl -n kube-system get pods -l k8s-app=cilium |
hubble
参考 hubble_setup,我们首先通过cilium-cli启用hubble功能
1 | cilium hubble enable |
在各机器安装hubble客户端
1 | HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) |
1 | root@master:/home/test# cilium hubble port-forward & |
开启WEB UI功能
1 | root@master:/home/test# cilium hubble enable --ui |
通过moba xterm的MobaSSHTunnel功能进行代理,我们在浏览器访问 hubble-ui 的web页面
cli说明
cilium cli命令行工具的功能
1 | CLI to install, manage, & troubleshooting Cilium clusters running Kubernetes. |
可以充分测试整个网络的连接通路情况(包括外网)
1 | root@master:/home/test# cilium connectivity test |
cilium pod中的cli
1 | CLI for interacting with the local Cilium Agent |
1 | # cilium endpoint list |
查看BPF map 中存储的endpoint信息 ,bpf map是一种数据结构,通过hashtable等方式存储数据 ,这里展示了该cilium管理的所有容器
1 | root@master:/home/cilium# cilium bpf endpoint list |
1 | root@master:/home/cilium# cilium service list |
3. L7 demo
案例来自官方 L7 DEMO ,由于这里的L7实际已经将 L3/4 DEMO 覆盖了,所以就不对L3/4赘述。
首先创建相关 pod
1 | root@master:/home/test# kubectl create -f http-sw-app.yaml |
death tiefighter 属于empire“组织” ,xwing 属于 alliance
1 | --- |
等待相关pod创建完成
1 | root@master:/home/test# kubectl get pods,svc |
检查cilium有没有发现我们创建的pod,有没有k8s:org
标签的:
1 | kubectl -n kube-system exec cilium-4rjbd -- cilium endpoint list |
我们想通过L7策略限制 /v1/exhaust-port 敏感接口被访问,且禁止其他 “组织” 访问 deathstart
1 | root@master:/home/test# kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing |
创建level 7策略:
1 | root@master:/home/test# kubectl apply -f sw_l3_l4_l7_policy.yaml |
L7策略具体内容:
1 | apiVersion: "cilium.io/v2" |
策略应用后,只允许带有org: empire、class: deathstar 标签的pod访问 deathstar 的 /v1/request-landing 接口
1 | root@master:/home/test# kubectl exec tiefighter -- curl -s -XPUT deathstar.default.svc.cluster.local/v1/exhaust-port |
其他“组织”无法访问:
1 | root@master:/home/test# kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local/v1/request-landing1 |
4. 结语
cilium的具体应用需要我们熟悉理解业务场景,抛开其较高的内核版本要求,我们在将其投入使用前也需要做一番工作,如规则的管理可能的UI化。cilium 还涵盖了多种功能,如 TLS流量可视化(TLS中间人)、service mesh,具体需要做什么,能做什么,也需要我们理解公司当前业务场景。
5. Reference
https://www.secrss.com/articles/39606 从Gartner的三次定义,看微隔离技术发展与演进
https://www.youtube.com/watch?v=80OYrzS1dCA eCHO episode 1: Introduction to Cilium