freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【云原生安全】Kubernetes 入口网络策略攻防
2023-12-30 10:39:43

0 实验环境

【环境部署】Kind部署实验级k8s集群 占用低内存

1 默认网络策略

在默认的情况下,集群中每个Pod都有自己唯一的IP地址,任何Pod都能够与其他Pod通信,因此不同命名空间中的Pod能够相互通信。

实验1-1 创建三个命名空间并在每个ns中创建一个Pod

kubectl create namespace ns-1 && kubectl create namespace ns-2 && kubectl create namespace ns-3

1703903579_658f815bb39f03abc5701.png!small?1703903580460

kubectl -n ns-1 run pod1 --image=nginx && kubectl -n ns-2 run pod2 --image=nginx && kubectl -n ns-3 run pod3 --image=nginx

1703903593_658f8169e12adef53b956.png!small?1703903594681

实验1-2 尝试不同命名空间中的Pod进行通信

pod1与pod2通信

kubectl -n ns-1 exec pod1 -- curl 10.244.0.6 | grep Welcome

1703903606_658f8176cf987bd993cb0.png!small?1703903607529

实验1-3 实验结论

默认情况下,通信情况如下图

1703903623_658f8187e8d8c6c2b68d7.png!small?1703903624459

2 自定义网络策略

如果想实现下面的通信情况: 应允许来自 ns-3 pod3 的入口请求发送到 ns-2 pod2;不应允许来自 ns-1 pod1 的入口请求发送到 ns-2 容器 2

1703903639_658f8197c9a360e519e01.png!small?1703903640412

实验2-1 给资源打上标签,方便设置网络策略

在实验1中的资源环境基础之上,

kubectl label namespace ns-1 ns-name=ns1 && kubectl label namespace ns-2 ns-name=ns2 && kubectl label namespace ns-3 ns-name=ns3

kubectl get ns --all-namespaces --show-labels | grep ns比如下图中ns-1命名空间的标签匹配有ns-name=ns1

1703903655_658f81a73ef761ac78b06.png!small?1703903655796

kubectl label pod pod1 -n ns-1 pod-name=pod1 && kubectl label pod pod2 -n ns-2 pod-name=pod2 && kubectl label pod pod3 -n ns-3 pod-name=pod3

kubectl get pod --all-namespaces --show-labels | grep pod-name=比如下图中pod1的标签匹配有pod-name=pod1

1703903667_658f81b3a6fdfe539b286.png!small?1703903668247

实验2-2 设置网络策略

from字段定义了可以进入目标 pod 的来源流量,来源流量仅是: 满足标签匹配ns-name=ns3(ns-name: ns3)的命名空间 并且 满足标签匹配pod-name=pod3(pod-name: pod3)的Pod流量,只有这个来源的流量才能进入命名空间ns-2(namespace: ns-2)中标签匹配pod-name=pod2(pod-name: pod2)的Pod。注意在填写配置文件中的namespace:matchLabels:不要弄混了。(参考文章中此处配置文件有错误,经过修改后如下可实验成功。)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: ns-2
spec:
  podSelector:
    matchLabels:
      pod-name: pod2
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          pod-name: pod3
      namespaceSelector:
        matchLabels:
          ns-name: ns3

kubectl apply -f test1.yaml

1703903681_658f81c1890c1f0815ce2.png!small?1703903682121

实验2-3 测试网络策略

kubectl get pods -A -o wide | grep ns查看相关Pod的IP

kubectl -n ns-3 exec pod3 -- curl 10.244.0.6 | grep Welcome

kubectl -n ns-1 exec pod1 -- curl 10.244.0.6 | grep Welcome

1703903702_658f81d62de165a1d0015.png!small?1703903703225

Pod1的流量能够进入Pod2,这显然不对。网络策略不起作用,因为网络策略需要安装网络策略代理,默认情况下,代理不会安装到集群上。

实验2-4 安装策略代理 calico

1 先下载两个部署文件,版本可视情况而定修改URL中的版本号,目前是最新版v3.25.1
https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

2 修改custom-resources.yaml里面的pod ip段信息
# 查看pod ip段信息
[root@localhost ~]# kubectl cluster-info dump | grep -m 1 cluster-cidr
                            "--cluster-cidr=10.244.0.0/16",

1703903717_658f81e54d6671458748f.png!small?1703903718038

kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml

等待一会,然后确认calico状态kubectl get pods -n calico-system

1703903735_658f81f786ceb403b994c.png!small?1703903736051

重启dockersystemctl restart containerd docker以便calico生效,此时每个Pod的IP会变,查看重启后Pod信息kubectl get pods -A -o wide | grep ns

1703903750_658f820691ab3908d579a.png!small?1703903751181

实验2-5 再次测试网络策略

pod1访问pod2失败kubectl -n ns-1 exec pod1 -- curl 10.244.82.6 | grep Welcome

pod3访问pod2成功kubectl -n ns-3 exec pod3 -- curl 10.244.82.6 | grep Welcome

1703903768_658f82184f7b73b0cdada.png!small?1703903768851

3 绕过入口策略场景

实验3-1 场景构建

延续实验2,实验2中pod1无法和pod2通信。当我们控制了pod1时,处于ns-1命名空间,可以进行如下操作突破网络策略。(能够有创建POD和查看网络策略的权限)

实验3-2 查看命名空间ns-2的网络策略

进入pod1

kubectl -n ns-1 exec -it pod1 -- bash

安装kubectl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && chmod +x kubectl && mv kubectl /usr/local/bin/

列出ns-2命名空间的网络策略

kubectl -n ns-2 get networkpolicies

1703903781_658f82255be42b93c736a.png!small?1703903781857

查看该网络策略的详情

kubectl -n ns-2 describe networkpolicies test-network-policy

1703903795_658f8233333a300814dcb.png!small?1703903795951

实验3-3 创建attackpod并满足目标网络策略

修改ns-1命名空间的标签

kubectl label namespace ns-1 ns-name=ns3 --overwrite && kubectl get ns -A ns-1 --show-labels | grep ns

1703903807_658f823f1d7acc3304602.png!small?1703903808074

在ns-1命名空间中创建attackpod并设置标签为pod-name=pod3

kubectl -n ns-1 run attackpod --image=nginx && kubectl label pod attackpod -n ns-1 pod-name=pod3 && kubectl get pod -n ns-1 -o wide --show-labels | grep pod-name=

1703903820_658f824caf75b536c3470.png!small?1703903821212

实验3-4 ns-1中attackpod去访问ns-2中pod2

kubectl -n ns-1 exec attackpod -- curl 10.244.82.4 | grep Welcomeattackpod访问成功,pod1仍然不行。

1703903831_658f8257ec997d53ce94a.png!small?1703903833064

其他

如果当前权限能够修改ns-2命名空间的网络策略,那更简单了,直接修改“podSelector”和“namespaceSelector”即可。

参考文章

https://hakin9.org/bypassing-and-securing-kubernetes-ingress-network-policies/

# 云安全 # Kubernetes,渗透测试 # Kubernetes # 云原生安全 # Kubernetes安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录