Kubernetes的网络架构及其安全风险
本博客地址:https://security.blog.csdn.net/article/details/129137821
一、常见的Kubernetes网络架构
如图所示:

说明:
1、集群由多个节点组成。
2、每个节点上运行若干个Pod。
3、每个节点上会创建一个CNI网桥(默认设备名称为cni0)。
4、每个Pod存在于自己的网络命名空间中,通过虚拟网卡对Veth Pair设备与外界通信。
5、Veth Pair设备将创建两张虚拟网卡,分别位于Pod所在的网络命名空间中(对应图中 Pod内部的eth0)和节点根网络命名空间中(对应图中每个节点上方根网络命名空间内的各个veth,如veth1056db9f),互为对端(Veth Peer),对于Veth Pair设备的两张虚拟网卡来说,从其中一张网卡发出的数据包,将直接出现在另一张网卡上。
6、每个Pod的eth0网卡的对端veth网卡“插”在cni0网桥上。
7、同一节点上的各Pod可以借助cni0网桥互相通信,不同节点之间需要借助额外的网络插件进行通信,如Flannel。
8、CoreDNS是整个Kubernetes集群的DNS服务器。
二、Kubernetes下pod间的网络通信
如果一个pod想要发送ARP包,需要具有CAP_NET_RAW权限,在容器中,对于一个具有root权限的用户来说,默认是具有该权限的,查看方式如下:

Kubernetes以服务资源kube-dns的形式提供集群级别的DNS服务,所有pod的DNS服务器IP地址正是kube-dns服务的地址:

当这个Pod向kube-dns服务发起DNS查询请求时,查询请求会经过Kubernetes配置的iptables规则,最终被发送到服务后端的CoreDNS Pod中:
# 执行命令
iptables -t nat -L

而Pod的IP地址则是:

Pod内的eth0网卡的对端被连接到cni0网桥上。此时该对端就成为了cni0网桥的一个接口。当Pod向外发出ARP请求时,该请求会被网桥转发给其他接口,这样一来其他Pod就能够收到ARP请求,其中网卡MAC地址与ARP请求相符的Pod就会发送ARP响应,该响应同样会被网桥转发给最初发出ARP请求的Pod。这就是Kubernetes内部同一个节点上的ARP请求响应流程。
假设一个Pod需要访问example.com,那么它首先必须知道该域名对应的IP,因此它需要发出一个DNS查询请求。默认情况下,Pod的DNS策略为ClusterFirst,也就是说,这个Pod会向集群DNS服务kube-dns发起请求。
DNS请求实际上是一个UDP报文,从我们上面的截图可知,kube-dns服务的IP为10.2.0.10,而该Pod的IP为10.244.2.11,两者不在同一子网。因此该UDP报文会被Pod发送给默认网关,也就是cni0。之后,节点iptables对该报文进行DNAT处理,将目的地改为10.244.0.7, 也就是CoreDNS Pod的IP地址。
之后,cni0通过查询自己维护的MAC地址表,找到10.244.0.7对应的MAC地址,然后将报文发到网桥的对应端口上。CoreDNS Pod收到报文后,向上级DNS服务器查询example.com的IP,收到结果后向该Pod发出DNS响应。
至此,这个Pod知道了example.com对应的IP。该Pod就可以向example.com对应的IP发出基于TCP的HTTP请求了
三、容器编排平台(Kubernetes)面临的风险
容器技术和编排管理系统是云原生生态的两大核心部分,前者负责执行,后者负责控制和管理,共同构成云原生技术有机体。
Kubernetes架构图如下:

上图是一个常见的Kubernetes集群,由一个Master节点和三个Worker节点组成,Pod之间借助CNI插件Flannel实现通信。Kubernetes自身的系统Pod(kube-system命名空间内的Pod)主要运行在Master节点上,除此之外,每个Worker节点上也分别有一个Flannel Pod和kube-proxy Pod;所有业务Pod分布在三个Worker节点上。另外,每个节点上还有一个Kubelet服务,负责管理容器。
1、在Kubernetes环境中,容器基础设施存在的风险
● 镜像面临的风险:主要是不安全的第三方组件、恶意镜像、敏感信息泄露(例如将敏感配置信息打包进镜像的情况)等;
● 活动容器面临的风险:主要是不安全的容器应用、不受限制的资源共享、不安全的配置与挂载等;
● 网络存在的风险:主要是由于集群通常由多个节点组成,因此集群网络风险的影响范围要比单宿主机运行容器的网络风险更大;
● 其他风险:除此外,还有容器管理程序接口、宿主机操作系统、容器软件漏洞等安全风险;
2、Kubernetes组件接口存在的风险
Kubernetes中组件众多,绝大多数组件以基于HTTP或HTTPS的API形式提供服务。其中,我们日常接触比较多的服务及其端口如下所示:
| 组件 | 默认端口 | 说明 |
|---|---|---|
| API Server | 6443 | 基于HTTP的安全端口 |
| API Server | 8080 | 不安全的HTTP端口 |
| Kubelet | 10248 | 用于检查Kubelet健康状态的HTTP端口 |
| Kubelet | 10250 | 面向API Server提供服务的HTTPS端口 |
| Dashboard | 8001 | 提供HTTP服务的端口 |
| etcd | 2379 | 客户端与服务端之间通信的端口 |
| etcd | 2380 | 不同服务端实例之间通信的端口 |
● API Server:默认情况下,API Server在8080和6443两个端口上提供服务。其中,8080端口提供的是没有TLS加密的HTTP服务。保留该端口主要是为了方便测试以及集群初启动。然而在生产环境开放8080端口,即使绑定本地环回地址(localhost)也是很危险的。如果将该端口暴露在互联网上,那么任何网络可达的攻击者都能够通过该端口直接与API Server交互,继而控制整个集群。
● Kubelet:默认配置下,Kubelet在10250端口开放上述API服务,另外还监听10248端口,以供其他组件检查Kubelet的运行状态。这里10248端口的服务相对简单,不存在特别的风险,但10250端口在默认情况下,API Server在访问Kubelet的API时需要使用客户端证书,相对来说是比较安全的。但是如果出现以下任一情况:
1)攻击者通过某种方式窃取了API Server访问Kubelet的客户端证书。
2)用户为了方便起见,将Kubelet的--anonymous-auth参数设置为true,且authorization.mode设置为AlwaysAllow。
则网络可达的攻击者都能够直接与Kubelet进行交互,从而实现对其所在节点的控制。
● Dashboard:默认情况下,我们需要先执行kubectl proxy,然后才能通过本地8001端口访问Dashboard。但是,如果直接将Dashboard端口映射在宿主机节点上,或者在执行kubectl proxy时指定了额外地址参数,那么所有能够访问到宿主机的用户,包括攻击者,都将能够直接访问Dashboard。
另外,默认情况下Dashboard需要登录认证,但是,如果用户在Dashboard的启动参数中添加了--enable-skip-login选项,那么攻击者就能够直接点击Dashboard界面的“跳过”按钮,无须登录便可直接进入Dashboard。
● etcd:etcd启动后监听2379和2380两个端口,前者用于客户端连接,后者用于多个etcd实例之间的对端通信。在多节点集群中,为了实现高可用,etcd往往在节点IP上(非本地IP)监听,以实现多节点之间的互通,这可能允许外部攻击者访问etcd。
默认情况下,两个端口提供的服务都需要相应证书才能访问(禁止匿名访问),这为etcd的安全性提供了保障。如果攻击者窃取了证书,或者用户将etcd设置为允许匿名访问,那么攻击者就可能直接访问etcd并窃取数据
3、集群网络存在的风险
为了实现集群Pod间相互通信,在安装部署Kubernetes后,我们往往还要额外安装一个网络插件,常见的网络插件有Flannel、Calico和Cilium等。
在没有其他网络隔离策略和Pod安全策略的默认情况下,由于Pod与Pod之间彼此可连通,且Pod内的root用户具有CAP_NET_RAW权限,集群内部可能发生网络探测、嗅探、拒绝服务和中间人攻击等网络攻击。
4、访问控制机制存在的风险
如果访问控制过于宽松,高权限账户可能会被滥用,从而对Kubernetes自身及正在运行的容器产生威胁;除此之外,如果允许针对Kubernetes的未授权访问,攻击者可能借此直接获得集群管理员权限。另外,即使认证和授权机制在容器环境创建初期遵循了最小权限等安全原则,随着时间的推移和环境的更新变动,角色与权限可能会变得混乱,从而为攻击者提供可乘之机。
5、其他风险
其他风险主要是Kubernetes软件安全漏洞
四、Kubernetes下Pod通信的中间人攻击
对于Pod通信的中间人攻击,我们的前提是其中一个Pod已被攻击者攻入且具有root权限。
具体的网络示意如图所示,攻击者的Pod为节点1左下方的Web APP Pod(我们将其命名为attacker Pod),受害者Pod为节点1右下方的Backend Pod(我们将其命名为victim Pod)

攻击流程:
1、首先获得各种网络参数,包括attacker Pod自身的MAC和IP地址、Kubernetes集群DNS服务的IP地址、同节点上CoreDNS Pod的MAC和IP地址、CNI网桥的MAC和IP地址。
2、在attacker Pod中启动一个HTTP服务器,监听80端口,对于任何HTTP请求均回复一行字符串“F4ke Website”,作为攻击成功的标志。
3、攻击者在attacker Pod中启动一个ARP欺骗程序,持续向cni0网桥发送ARP响应帧,不断声明CoreDNS Pod的IP对应的MAC地址应该是attacker Pod的MAC地址。
4、在attacker Pod中启动一个DNS劫持程序,等待接收DNS请求。
5、根据设定,victim Pod向example.com发起HTTP请求,为了获得example.com的IP地址,victim Pod需要向DNS服务器发起请求,为了找到DNS服务器的MAC地址,victim Pod需要先向cni0网桥发送ARP请求,然而由于attacker Pod在第3步不断地向cni0网桥发送ARP响应帧,因此victim Pod会收到响应,被告知CoreDNS Pod的IP对应attacker Pod的MAC地址。
6、一旦第3步生效,victim Pod向attacker Pod发来DNS请求,则DNS劫持程序首先判断该请求针对的域名是否为目标域名example.com。如否,则将请求转发给真正的CoreDNS Pod,接收CoreDNS Pod的响应包,并转发给victim Pod;如是,则伪造DNS响应包,声明example.com对应的IP地址是attacker Pod自己的IP,将这个响应包发送给victim Pod。
7、顺利的话,victim Pod接下来将向attacker Pod发送http://example.com的HTTP请求,因此第2步中attacker Pod中设置的HTTP服务器将向victim回复预设字符串“F4ke Website”,victim Pod以为“F4ke Website”正是自己需要的内容。
防御措施:
禁用CAP_NET_RAW权限即可
相关文章:
Kubernetes的网络架构及其安全风险
本博客地址:https://security.blog.csdn.net/article/details/129137821 一、常见的Kubernetes网络架构 如图所示: 说明: 1、集群由多个节点组成。 2、每个节点上运行若干个Pod。 3、每个节点上会创建一个CNI网桥(默认设备名称…...
Blob分析+特征+(差分)
Blob分析特征0 前言1 概念2 方法2.1 图像采集2.2 图像分割2.3 特征提取3 主要应用场景:0 前言 在缺陷检测领域,halcon通常有6种处理方法,包括Blob分析特征、Blob分析特征差分、频域空间域、光度立体法、特征训练、测量拟合,本篇博…...
Flink 提交模式
Flink的部署方式有很多,支持Local,Standalone,Yarn,Docker,Kubernetes模式等。而根据Flink job的提交模式,又可以分为三种模式: 模式1:Application Mode Flink提交的程序,被当做集群内部Application,不再需要Client端做繁重的准备工作。(例如执行main函数,生成JobG…...
网络总结知识点(网络工程师必备)三
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 前言 51.什么是ARP代理?...
测开:前端基础-css
一、CSS介绍和引用 1.1 css概述 层叠样式表,是一种样式表语言,用来描述HTML和XML文档的呈现。 CSS 用于简化HTML标签,把关于样式部分的内容提取出来,进行单独的控制,使结构与样式分离开发。 CSS 是以HTML为基础&…...
Java学习记录之JDBC
JDBC JDBC 是 Java Database Connectivity 的缩写,是允许Java 程序访问并操作关系型数据库数据的一套 应用程序接口。本身就是一种规范,它提供的接口有一套完整的,可移植的访问底层数据库的程序。 JDBC 的架构 JDBC API支持两层和三层处理…...
矩阵翻硬币
题目描述 小明先把硬币摆成了一个 n 行 m 列的矩阵。 随后,小明对每一个硬币分别进行一次 Q 操作。 对第 x 行第 y 列的硬币进行 Q 操作的定义:将所有第 ix 行,第 jy 列的硬币进行翻转。...
【C语言跬步】——指针数组和数组指针(指针进阶)
一.指针数组和数组指针的区别 1.指针数组是数组,是一种存放指针的数组; 例如: int* arr[10]; 2.数组指针是指针,是一种指向数组的指针,存放的是数组的地址; 例如: int arr[5]; int (p)[5]&a…...
第十四届蓝桥杯模拟赛第三期(Python)
写在前面 包含本次模拟赛的10道题题解能过样例,应该可以AC若有错误,欢迎评论区指出本次题目除了最后两题有些难度,其余题目较为简单,我只将代码和结果给出,如果不能理解欢迎私信我,我会解答滴。start 2022…...
css-盒模型
巧妙运用margin负值盒模型和怪异盒模型(border padding 包含在内)display: block 能让textarea input 水平尺寸自适应父容器? – 不能 * {box-sizing: border-box; // bs: bb }<textarea/> 是替换元素,尺寸由内部元素决定,不受display水平影响. 当然可以直接设置宽度10…...
Linux | 调试器GDB的详细教程【纯命令行调试】
文章目录一、前言二、调试版本与发布版本1、见见gdb2、程序员与测试人员3、为什么Release不能调试但DeBug可以调试❓三、使用gdb调试代码1、指令集汇总2、命令演示⌨ 行号显示⌨ 断点设置⌨ 查看断点信息⌨ 删除断点⌨ 开启 / 禁用断点⌨ 运行 / 调试⌨ 逐过程和逐语句⌨ 打印 …...
wifi芯片大市场和个人小生活
3.3 是日也,天朗气清,惠风和畅。仰观宇宙之大,俯察论文论坛,所以游目骋怀,足以极视听之娱,信可乐也。 夫人之相与,俯仰一世,或取诸怀抱,悟言一室之内;或因寄所…...
全国计算机技术与软件专业技术资格(水平)考试 上半年2023年3月13日开始,下半年2023年8月14日开始
根据2023年计算机技术与软件专业技术资格(水平)考试工作计划,可以得知,2023年软考报名时间——上半年2023年3月13日开始,下半年2023年8月14日开始。 点击查看:人力资源社会保障部办公厅关于2023年度专业技术人员职业资格考试工作计划及有关事项的通知 点击查看:2023年度…...
大数据框架之Hadoop:MapReduce(六)Hadoop企业优化
一、MapReduce 跑的慢的原因 MapReduce程序效率的瓶颈在于两点: 1、计算机性能 CPU、内存、磁盘、网络 2、IO操作优化 数据倾斜Map和Reduce数设置不合理Map运行时间太长,导致Reduce等待过久小文件过多大量的不可分块的超大文件Spill次数过多Merge次…...
Spring File Storage的详细文档
快速入门配置pom.xml引入依赖<dependencies><!-- spring-file-storage 必须要引入 --><dependency><groupId>cn.xuyanwu</groupId><artifactId>spring-file-storage</artifactId><version>0.7.0</version></dependen…...
Java软件开发好学吗?学完好找工作吗?
互联网高速发展的当下,Java语言无处不在:手机APP、Java游戏、电脑应用,都有它的身影。作为最热门的开发语言之一,Java在编程圈的地位不可撼动。可是,听名字就很专业的样子。Java语言到底好学吗?刚入坑编程圈…...
【独家C】华为OD机试提供C语言题解 - 优秀学员统计
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明优秀…...
数据仓库、数据中台、数据湖都是什么?
相信很多人都在最近的招聘市场上看到过招聘要求里提到了数据仓库、数据中台,甚至还有数据湖,这些层出不穷的概念让人困扰。今天我就来跟大家讲一讲数据仓库、数据中台以及数据湖的概念及区别。 数据库 在了解数据仓库、数据中台以及数据湖之前ÿ…...
0099 MySQL02
1.简单查询 查询一个字段 select 字段名 from 表名; 查询多个字段,使用“,”隔开 select 字段名,字段名 from 表名; 查询所有字段 1.把每个字段都写上 select 字段名,字段名,字段名.. from 表名; 2.使用*(效率低,可读性差) select *…...
应急响应-ubuntu系统cpu飙高
这里写目录标题一、排查过程二、处置过程三、溯源总结一、排查过程 1、查看CPU使用情况 top -c2、查看异常进程的具体参数 ps -aux3、通过微步查询域名信息 4、查看异常进程的监听端口 netstat -anlpt5、查找服务器内的异常文件 ls cat run.sh cat mservice.sh6、查看脚本…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
